Языковая модель YandexGPT может использоваться для реализации сценариев ответа на вопросы по документации, набору регулирующих документов, базе знаний и т.д. Для того, чтобы модель опиралась на конкретный корпус документов, а не только на те данные, на которых она обучалась, рекомендуется использовать подход Retrieval-Augmented Generation.
- База знаний (набор документов) разбивается на фрагменты, которые переводятся в векторное представление (embedding) с помощью YandexGPT и сохраняются в векторную базу данных. Примерами таких баз данных являются OpenSearch, ChromaDB, LanceDB и т.д.
- Пользователь отправляет свой запрос к системе.
- Запрос переводится в векторное представление с помощью модели YandexGPT.
- В векторной базе данных происходит поиск фрагментов наиболее близких к запросу пользователя. В зависимости от размера фрагментов выбирается топ-n наиболее релевантных документов.
- Полученные документы, запрос пользователя и постановка задачи (промпт) передаются YandexGPT, которая генерирует финальный ответ, который возвращается пользователю.
В данном руководстве для реализации описанного сценария будут использоваться следующие сервисы Yandex Cloud.
- YandexGPT - большая языковая модель для построения embedding-ов по документам и ответов на вопросы.
- Yandex Managed Service for OpenSearch - Сервис для управления кластерами OpenSearch, который будет использоваться для хранения пар фрагментов документов и векторных представлений этих фрагментов.
- Yandex Object Storage - Объектное хранилище, в котором изначально хранятся файлы с базой знаний.
- Yandex DataSphere - Cервис для обучения ML-моделей и среда разработки на Python для взаимодействия с YandexGPT и OpenSearch.
Работа с векторной БД и языковой моделью YandexGPT будет осуществляться с помощью популярного фреймворка с открытым исходным кодом LangChain.
Подробные комментарии по работе с компонентами содержатся в файлах проекта, которые рекомендуется открыть в Yandex DataSphere.
- Необходимо перейти в сервис OpenSearch и создать кластер по инструкции. Необходимо создать группу виртуальных хостов OpenSearch и группу виртуальных хостов Dashboards. Важно, чтобы кластер OpenSearch, Object Storage и DataSphere находились в одной подсети, например, default-ru-central1-a.
- Перейдите в сервис Yandex Object Storage, создайте новый бакет и загрузите в него документы, по которым будет необходимо отвечать на вопросы.
- Перейдите в сервис Yandex DataSphere и создайте в нем сообщество и проект, в котором можно будет запускать код на Python.
- Создайте коннектор к Object Storage S3 в проекте DataSphere. Активируйте коннектор для работы с ним JupyterLab.
- В созданном проекте необходимо перейти во вкладку "Настройки" и указать:
Каталог по умолчанию
: каталог, в котором созданы сервисы Yandex Managed Service for OpenSearch и YandexGPT.Сервисный аккаунт
: сервисный аккаунт, который позволит обращаться к другим сервисам из проекта DataSphere. Важно, что сервисному аккаунту должны быть назначены роли ai.languageModels.user для доступа к модели YandexGPT, managed-opensearch.admin для работы с OpenSearch и vpc.user.Подсеть
: укажите подсеть, в которой находятся сервисы OpenSearch и YandexGPT.
- Откройте проект в JupyterLab и склонируйте данный репозиторий с помощью Git. При запуске рекомендуем использовать режим Dedicated.
- Откройте в проекте ноутбук YandexGPT_OpenSearch_LCEL_memory.ipynb и выполните все ячейки кода.
- Документы из объектного хранилища разбиваются на небольшие фрагменты размером
chunk_size
. Размерchunk_size
нужно выбирать исходя из нескольких показателей:- Допустимая длина контекста для эмбеддинг-модели. Yandex GPT Embeddings допускают 2048 токенов.
- Допустимый размер окна контекста большой языковой модели. Если мы хотим использовать в запросе top 3 результатов поиска, то 3*chunk_size+prompt_size+response_size должно не превышать длины контекста модели.
- Далее мы генерируем векторные эмбеддинги по фрагментам текста с помощью Yandex GPT Embedding API (используем класс YandexEmbeddings из библиотеки yandex-chain)
- Добавляем полученные вектора в OpenSearch.
- Тестируем извлечение релевантных фрагментов по запросу.
- Собираем цепочку для Retrieval-Augmented Generation и проверяем её работу.