Интеграция плагинов ChatGPT с LLaMA

OpenAI только что выпустила первоначальную поддержку плагинов для ChatGPT, позволяющих языковой модели выступать в качестве агентов и взаимодействовать с внешним миром с помощью API. Здесь мы рассмотрим варианты использования chatgpt-retrieval-plugin от OpenAI с языковой моделью LLaMA от Meta.
созданию открытого протокола для моделей, позволяющих нам совместно использовать плагины между LLM и управлять ими.

Вступление
Документация OpenAI объясняет, что плагины способны расширять возможности ChatGPT.
Доступно мало подробностей о том, как плагины подключаются к ChatGPT, но OpenAI предоставляет плагин chatgpt-retrieval-plugin с открытым исходным кодом для семантического поиска и извлечения пользовательских данных для дополнительного контекста.
В этом руководстве мы возьмём этот плагин поиска и добавим скрипт, который интегрирует его с LLaMA 7B, запущенным на вашем локальном компьютере.
Код, который привязывает плагин к LLaMA, доступен в этом репозитории:
Ограничения
Этот подход успешно добавляет внешний контекст к LLaMA, хотя и с пробелами по сравнению с подходом плагинов OpenAI:
- Ограничения в базовой модели. LLaMA далёк от ChatGPT во многих отношениях. Это требует значительной дополнительной доводки (например, Alpaca).
- Не распространяется на другие плагины. Документация OpenAI предполагает, что ChatGPT может считывать схему API плагина и динамически создавать правильные вызовы API, удовлетворяющие запросу пользователя. Напротив, всё пошло не так хорошо, когда мы попытались попросить LLaMA создать запрос cURL с учётом схемы OpenAPI. Одним из решений этой проблемы была бы точная настройка модели специально для схем OpenAPI.
Демонстрация
Сначала мы настраиваем наше хранилище данных и загружаем в него два PDF-файла – LLaMA paper и Conda cheatsheet.
Затем мы можем запросить эти данные с соответствующими вложениями, включенными в подсказке в качестве дополнительного контекста.
Пошаговое руководство
Шаг 0: Клонируйте репозиторий llama-retrieval-plugin
Шаг 1: Настройте хранилище данных
Этот шаг почти идентичен настройке плагина поиска OpenAI, но упрощён за счёт использования conda и использования pinecone в качестве векторной базы данных. Следуя быстрому запуску в репозитории:
Настройте среду:
conda env create -f environment.yml
conda activate llama-retrieval-plugin
poetry install
Определите переменные среды:
# In production use-cases, make sure to set up the bearer token properly
export BEARER_TOKEN=test1234
export OPENAI_API_KEY=my_openai_api_key
# We used pinecone for our vector database, but you can use a different one
export DATASTORE=pinecone
export PINECONE_API_KEY=my_pinecone_api_key
export PINECONE_ENVIRONMENT=us-east1-gcp
export PINECONE_INDEX=my_pinecone_index_name
Запустите сервер:
poetry run start
Шаг 2: Загрузите файлы в хранилище данных
Для этого шага мы использовали пользовательский интерфейс Swagger, доступный локально по адресу http://localhost:8000/docs
Авторизуйтесь:

Вставьте файл:

Запросите хранилище данных для тестирования:
Возьмите идентификатор, возвращаемый upsert, и создайте запрос в Swagger UI, чтобы увидеть, что будет возвращено при появлении запроса:
{
"queries": [
{
"query": "What is the title of the LLaMA paper?",
"filter": {
"document_id": "f443884b-d137-421e-aac2-9809113ad53d"
},
"top_k": 3
}
]
}

Шаг 3: Установите LLaMA
Наш репозиторий ссылается на llama.cpp в качестве подмодуля, который мы использовали для локального запуска LLaMA 7B.
Следуйте за llama.cpp readme, чтобы настроить его.
Шаг 4: Используйте LLaMA для запроса ваших пользовательских данных
Откройте новый терминал и перейдите к репозиторию llama-retrieval-plugin.
Активируйте среду Conda (начиная с шага 1):
conda activate llama-retrieval-plugin
Определите переменные среды:
# Make sure the BEARER_TOKEN is set to the same value as in Step 1
export BEARER_TOKEN=test1234
# Set the URL to the query endpoint that you tested in Step 2
export DATASTORE_QUERY_URL=http://0.0.0.0:8000/query
# Set to the directory where you have LLaMA set up -- such as the root of the llama.cpp repo
export LLAMA_WORKING_DIRECTORY=./llama.cpp
Запустите скрипт llama_with_retrieval с желаемой подсказкой:
python3 llama_with_retrieval.py "What is the title of the LLaMA paper?"
Этот скрипт принимает подсказку, вызывает конечную точку запроса для извлечения наиболее релевантных вложений из хранилища данных, а затем создаёт подсказку для передачи в LLaMA, содержащее эти вложения.
Вы можете ознакомиться с кодом здесь: llama-retrieval-plugin/llama_with_retrieval.py
Шаг 5: Настраивайте и экспериментируйте
Вы можете изменить сценарий llama_with_retrieval, чтобы поэкспериментировать с различными настройками, которые могут повысить производительность:
- Измените ограничение токена (например, уменьшите его, чтобы предоставить больше места для ответа модели).
- Измените шаблон подсказки и понаблюдайте за поведением модели.
- Измените параметры модели LLaMA, изменив командную строку. Примечание: Вы также можете указать пользовательскую командную строку LLaMA, установив переменную окружения LLAMA_CMD.
Вы можете использовать lastmileai.dev для отслеживания ваших различных экспериментов по мере настройки моделей. Например, вот записная книжка, в которой сохранены некоторые испытания с использованием Stable Diffusion.
Протоколы на платформах
Мы надеемся, что это упражнение покажет необходимость стандартизации взаимодействия между базовыми моделями и плагинами /расширениями. Мы должны иметь возможность использовать плагин, разработанный для моделей OpenAI, с другой большой языковой моделью, и наоборот. Это возможно только при использовании стандарта протокола плагина Foundation Model.
Мы находимся на ранних стадиях революции в вычислительной технике, вызванной появлением самых современных базовых моделей. У нас есть возможность определить модели поведения, которые управляют нашими взаимодействиями с этими моделями, и вернуться к богатому наследию открытых протоколов раннего Интернета вместо закрытых платформ современной эпохи.
Протокол плагина базовой модели
Команда lastmile ai изучает, что нужно для определения протокола плагина и стимулирования его внедрения. Мы считаем, что протокол должен быть:
- model-agnostic — поддерживает GPTx, LLaMA, Bard и любую другую базовую модель.
- modal-agnostic — поддерживает различные типы входных и выходных данных, а не только текст.
Наши первые размышления об этом были навеяны SMTP для электронной почты и LSP (Language Server Protocol) для IDE.