Пошаговое руководство по созданию чат-бота на основе ваших собственных документов с помощью GPT
Общение с ChatGPT — это весёлый и информативный процесс. Данного чат-бота можно использовать как для развлечения, так и для серьёзных дел (он может написать для вас код, полноценную программу). А если ещё и полностью разобраться с его функционалом и понимать в сфере программирования, то можно создавать действительно масштабные проекты.
Как мы могли бы использовать его более продуктивно? С недавним выпуском OpenAI API серии GPT 3.5, мы можем делать гораздо больше, чем просто общаться в чате. Одним из очень продуктивных вариантов использования для бизнеса и вашей личной эксплуатации является QA (Question Answering) — вы спрашиваете бота на естественном языке о ваших собственных документах / данных, а он может быстро ответить вам, извлекая информацию из документов и генерируя ответ [1]. Вы можете использовать его для поддержки клиентов, обобщения пользовательских исследований, управления вашей личной информацией и многого другого!
В этой статье я расскажу, как создать собственного Q&A чат-бота на основе ваших данных, а также о том, почему некоторые подходы его создания не будут работать.
(Если вы только хотите узнать, как создать Q&A чат-бота, вы можете перейти непосредственно к разделу “Пошаговое создание чат-бота для вопросов и ответов”)
Изучение различных подходов
Моя повседневная работа — менеджер по продуктам – чтение отзывов клиентов и внутренних документов занимает большую часть моей жизни. Когда появился ChatGPT, мне сразу пришла в голову идея использовать его в качестве помощника, который помог бы мне обобщать отзывы клиентов или находить связанные старые документы по продукту о функции, над которой я работаю.
Сначала я подумал о тонкой настройке модели GPT с помощью моих собственных данных для достижения поставленной цели. Но тонкая настройка стоит немалых денег и требует большого набора данных с примерами. Также невозможно выполнять точную настройку каждый раз, когда в документ вносятся изменения. Ещё более важным моментом является то, что тонкая настройка просто НЕ может позволить модели “знать” всю информацию в документах, скорее она обучает модель новому навыку. Следовательно, для контроля качества (с несколькими) документами тонкая настройка – это не тот путь, которым следует идти.
Второй подход, который приходит мне на ум, – это разработка подсказок путем предоставления контекста в них. Например, вместо того, чтобы задавать вопрос напрямую, я могу добавить исходное содержимое документа перед самим вопросом. Но модель GPT имеет ограниченный объём внимания — она может вместить всего несколько тысяч слов в подсказку (около 4000 токенов или 3000 слов). Невозможно предоставить весь контекст в подсказке, при условии, что у нас есть тысячи электронных писем с отзывами клиентов и сотни документов о продукте. Это также дорого, если вы переходите в длительном контексте к API, потому что цена основана на количестве используемых вами токенов.
I will ask you questions based on the following context:
— Start of Context —
YOUR DOCUMENT CONTENT
— End of Context—
My question is: “What features do users want to see in the app?”
(Если вы хотите узнать больше о точной настройке и быстром проектировании GPT, вы можете прочитать эту статью: https://medium.com/design-bootcamp/3-ways-to-tailor-foundation-language-models-like-gpt-for-your-business-e68530a763bd)
Поскольку подсказка имеет ограничения на количество входных токенов, мне пришла в голову идея сначала использовать алгоритм для поиска документов и выбора соответствующих выдержек, а затем передавать только эти соответствующие контексты в модель GPT с моими вопросами. Пока я изучал эту идею, я наткнулся на библиотеку под названием gpt-index (теперь переименованную в LlamaIndex), которая делает именно то, что мне надо, и проста в использовании [2].
В следующем разделе я дам пошаговое руководство по использованию LlamaIndex и GPT для создания чат-бота для вопросов и ответов на основе ваших собственных данных.
Пошаговое создание Q&A чат-бота
В этом разделе мы создадим Q&A чат-бота на основе существующих документов с помощью LlamaIndex и GPT (text-davinci-003), чтобы вы могли задавать вопросы о вашем документе и получать ответы от чат-бота. И всё это будет происходить на естественном языке.
Подготовка
Прежде чем мы начнём, нам нужно подготовить несколько вещей:
- Ваш ключ OpenAI API, который можно найти по адресу https://platform.openai.com/account/api-keys .
- База данных ваших документов. LlamaIndex поддерживает множество различных источников данных, таких как Neptune, Google Docs, Asana и т.д. [3]. В этом руководстве мы будем использовать простой текстовый файл для демонстрации.
- Локальная среда Python или Google Colab notebook.
План
Рабочий процесс прост и занимает всего несколько шагов:
- Создание индекса данных вашего документа с помощью LlamaIndex
- Запрос индекса с помощью естественного языка
- LlamaIndex извлечёт соответствующие части и передаст их в подсказку GPT
- Спросите GPT с соответствующим контекстом, а он выведет ответ
Что делает LlamaIndex, так это преобразует данные вашего исходного документа в векторизованный индекс, который очень эффективен для запроса. Он будет использовать этот индекс для поиска наиболее релевантных частей на основе сходства запроса и данных. Затем он вставит полученное в подсказку, которую отправит в GPT, чтобы у GPT был контекст для ответа на ваш вопрос.
Установка
Сначала нам нужно будет установить библиотеки. Просто запустите следующую команду в своём терминале или в Google Colab notebook. Эти команды установят как LlamaIndex, так и OpenAI.
!pip install llama-index
!pip install openai
Далее мы импортируем библиотеки на python и настроим ваш ключ OpenAI API в новом файле .py.
# Import necessary packages
from llama_index import GPTSimpleVectorIndex, Document, SimpleDirectoryReader
import os
os.environ['OPENAI_API_KEY'] = 'sk-YOUR-API-KEY'
Создание индекса и его сохранение
После того, как мы установили необходимые библиотеки и импортировали их, нам нужно будет создать индекс вашего документа.
Чтобы загрузить свой документ, вы можете использовать метод SimpleDirectoryReader, предоставляемый LllamaIndex, или загрузить его из строк.
# Loading from a directory
documents = SimpleDirectoryReader('your_directory').load_data()
# Loading from strings, assuming you saved your data to strings text1, text2, ...
text_list = [text1, text2, ...]
documents = [Document(t) for t in text_list]
LlamaIndex также предоставляет множество соединителей данных, включая Neptune, Asana, Google Drive, Obsidian и т.д. Вы можете найти доступные соединители данных по адресу https://llamahub.ai/.
После загрузки документов мы можем создать индекс с помощью следующем команды:
# Construct a simple vector index
index = GPTSimpleVectorIndex(documents)
Если вы хотите сохранить индекс и загрузить его для дальнейшего использования, вы можете использовать следующие методы:
# Save your index to a index.json file
index.save_to_disk('index.json')
# Load the index from your saved index.json file
index = GPTSimpleVectorIndex.load_from_disk('index.json')
Запрашивание индекса и получение ответа
Запросить индекс очень просто:
# Querying the index
response = index.query("What features do users want to see in the app?")
print(response)
И вуаля! Вы получите свой ответ. Под капотом LlamaIndex примет вашу подсказку, выполнит поиск соответствующих фрагментов в индексе и передаст её и соответствующие фрагменты в GPT.
Некоторые примечания для расширенного использования
Приведённые выше шаги показывают только очень простое начальное использование для ответа на вопросы с помощью LlamaIndex и GPT. Но вы можете сделать гораздо больше, чем это. Фактически, вы можете настроить LlamaIndex на использование другой модели большого языка (LLM), использовать другой тип индекса для разных задач, обновлять существующие индексы новым индексом и т.д. Если вам интересно, вы можете прочитать их документацию по адресу https://gpt-index.readthedocs.io/en/latest/index.html .
Заключение
В этой статье мы рассмотрели, как использовать GPT в сочетании с LlamaIndex для создания чат-бота, отвечающего на вопросы о документах. Хотя GPT (и другие LLM) мощны сами по себе, их возможности могут быть значительно усилены, если мы объединим их с другими инструментами, данными или процессами.
Для чего бы вы использовали чат-бота, отвечающего на вопросы о документах?
Ссылки на используемую литературу
[1] What Is Question Answering? — Hugging Face. 5 Dec. 2022, https://huggingface.co/tasks/question-answering.
[2] Liu, Jerry. LlamaIndex. Nov. 2022. GitHub, https://github.com/jerryjliu/gpt_index.