В последнее время, с появлением больших языковых разговорных моделей (Large Language Models, LLM), таких, как Yandex GPT, актуальным становится вопрос создания предметно-ориентированных чат-ботов, т.е. таких разговорных чат-ботов, которые способны поддерживать беседу в рамках какой-то узкой предметной области. Такие чат-боты могут быть реализованы двумя путями:
- До-обучение разговорной модели - это, как правило, требует значительных вычислительных мощностей, усилий и опыта, и при этом любые изменения в предметной области требуют пере-обучения модели
- Retrieval-Augmented Generation - подход, при котором ответ чат-бота формируется стандартной предобученной LLM-моделью, но предварительно ей показывают фрагменты текста из предметно-ориентированной базы знаний, найденные с помощью семантического поиска.
В рамках данного мастер-класса мы попробуем оба подхода, но в основном сконцентрируемся на создании вопрос-ответного чат-бота с помощью подхода Retrieval-Augmented Generation. Мы также используем Yandex SpeechKit для извлечения текста из набора видео-файлов. Для реализации бота мы организуем векторное хранилище и индексацию с помощью текстовых эмбеддингов Yandex GPT и фреймворка LangChain.
Подробные комментарии содержатся в файлах проекта, которые рекомендуется открыть в Yandex DataSphere.
Вся работа состоит из следующих основных этапов:
- 01-WikiScrape.ipynb - скачивание Harry Potter Fandom Wiki и выделение из неё текста.
В рамках мастер-класса вы можете не выполнять первую часть ноутбука, собирающую данные из интернет, а перейти ко второй части - выделению текстовых данных из HTML.
- 02-VideoScrape.ipynb - выделение текстов из семейства видео. На вход мы получаем набор ссылок на видео на YouTube, скачиваются звуковые дорожки, преобразуются в нужный формат и далее вызывается Yandex SpeechKit для преобразования речи в текст.
- 03-LangChainBot.ipynb - основной код для вопрос-ответного бота на базе LangChain. Здесь текстовые материалы разбиваются на фрагменты, индексируются с помощью эмбеддингов и сохраняются в векторную базу данных. Затем по запросу из базы данных извлекаются релевантные документы, и подаются на вход модели Yandex GPT. В этом же ноутбуке мы разрабатываем простые адаптеры LangChain для Yandex GPT Embeddings и Yandex GPT LLM.
- 04-QAPairs.ipynb -
Чтобы начать работу, вам необходимо проделать следующие подготовительные операции:
- Получить доступ к Яндекс-облаку - например, в рамках пробного периода
Если вы проходите мастер-класс в рамках мероприятия (например, на YaTalks), то вам может быть предоставлен доступ к уже сконфигурированному проекту в DataSphere.
- Создать в облаке объектное хранилище s3 (в рамках мастер-класса используется имя
s3store
) - Создать в облаке сервисный аккаунт, имеющий доступ к SpeechKit, YandexGPT и объектному хранилищу, а затем создать API-ключ (инструкция), и параметры этого ключа прописать в файле config.json. Также потребуется создать статический ключ доступа.
Данный мастер-класс рекомендуется проводить в Yandex DataSphere.
- Необходимо создать сообщество в Yandex DataSphere и проект в этом сообществе.
Если вы проходите мастер-класс в рамках мероприятия (например, на YaTalks), то вам может быть предоставлен доступ к уже сконфигурированному проекту в DataSphere.
- В рамках проекта подключить объектное хранилище
s3store
с помощью созданного статического ключа доступа.
В рамках мероприятия коннектор к
s3store
может уже быть настроен в рамках сообщества, вам необходимо лишь добавить его в проект.
- Добавить в проект или создать в проекте секрет
api_key
, содержащий созданный ранее API-ключ к сервисному аккаунту. По этому ключу мы будем вызывать сервисы Speech Kit и Yandex GPT. - Открыть проект в Jupyter Lab. Рекомендуем использовать режим Dedicated. Для режима Serverless, возможно, придётся немного модифицировать пути к хранилищу s3.
- В разделе GitHub клонировать репозиторий с материалами http://github.com/yandex-datasphere/yatalks-potter-bot
- Откройте в проекте ноутбук 01-WikiScrape.ipynb и выполните все ячейки кода, обращая внимание на сам код и на инструкции.
- Чтобы избежать ожидания, вы можете использовать уже скачанную копию Wiki, и выполнять только вторую половину ноутбука.
- Для извлечения текста из нужных фрагментов страницы используется фреймворк BeautifulSoup
- Откройте в проекте ноутбук 02-VideoScrape.ipynb и выполните все ячейки кода, обращая внимание на сам код и на инструкции.
- В качестве источника данных вам потребуются ссылки на несколько видео на YouTube.
- Вначале аудиодорожки к выбранным роликам скачиваются с помощью библиотеки
pytube
и помещаются в директориюaudio
проекта - Поскольку Speech Kit требует определённый формат аудио и частоту дискретизации, с помощью библиотеки
librosa
происходит преобразование аудио к требуемому формату - Для преобразования длинного аудио в текст используем асинхронное распознавание речи. В этом случае мы сначала размещаем данные в хранилище s3, и затем запускаем процесс распознавания с помощью REST-запросов. Далее мы в цикле проверяем готовность результатов, и сохраняем их в хранилище.
- Откройте в проекте ноутбук 03-LangChainBot.ipynb и выполните все ячейки кода, обращая внимание на сам код и не инструкции.
- Для начала документ разбивается на небольшие фрагменты размером
chunk_size
. Размерchunk_size
нужно выбирать исходя из нескольких показателей:- Допустимая длина контекста для эмбеддинг-модели. Yandex GPT Embeddings допускают 2048 токенов, в то время как многие открытые модели HuggingFace имеют длину контекста 512-1024 токена
- Допустимый размер окна контекста большой языковой модели. Если мы хотим использовать в запросе top 3 результатов поиска, то 3*chunk_size+prompt_size+response_size должно не превышать длины контекста модели.
- Далее мы учимся считать по фрагментам текста векторные эмбеддинги, с помощью моделей от HuggingFace, или через Yandex GPT Embedding API.
- Создаём векторную базу данных, обрабатываем все фрагменты и сохраняем их
- Учимся извлекать релевантные фрагменты по запросу
- Пишем адаптер для LangChain для работы с моделью Yandex GPT. Убеждаемся, что Yandex GPT работает, но не очень хорошо отвечает на предметно-ориентированные запросы.
- Собираем цепочку для Retrieval-Augmented Generation и проверяем её работу