Наполните своего бота ChatGPT пользовательскими источниками данных

ChatGPT стал неотъемлемым инструментом, который большинство людей ежедневно использует для автоматизации различных задач. Если вы использовали ChatGPT какое-то время, вы бы поняли, что он может давать неправильные ответы и ограничивает нулевой контекст по некоторым нишевым темам. Это поднимает вопрос о том, как мы можем подключиться к chatGPT, чтобы преодолеть разрыв и позволить ChatGPT иметь больше пользовательских данных.

Огромное количество знаний распространяется на различных платформах, с которыми мы ежедневно взаимодействуем, т. е. через вики-страницы confluence на работе, слабые группы, базу знаний компании, Reddit, Stack Overflow, книги, информационные бюллетени и документы Google, которыми делятся коллеги. Отслеживание всех этих источников информации само по себе является работой на полный рабочий день.

Было бы неплохо, если бы вы могли выборочно выбирать источники данных и с легкостью передавать эту информацию в диалог ChatGPT с вашими данными?

1. Подача данных через Prompt Engineering

Прежде чем мы перейдем к тому, как мы можем расширить ChatGPT, давайте посмотрим, как мы можем расширить ChatGPT вручную и в чем заключаются проблемы. Традиционный подход к расширению ChatGPT заключается в быстрой разработке.

Это довольно просто сделать, поскольку ChatGPT учитывает контекст. Во-первых, нам нужно взаимодействовать с ChatGPT, добавляя исходное содержимое документа перед фактическими вопросами.

I will ask you questions based on the following content:
- Start of Content-
Your very long text to give ChatGPT context
- End of Content-

Проблема с этим подходом заключается в том, что модель имеет ограниченный контекст; он может принимать только примерно 4097 токенов для GPT-3. Вы скоро столкнетесь со стеной с этим подходом, так как это также довольно утомительный ручной процесс, который всегда нужно вставлять в контент.

Представьте, что у вас есть сотни PDF-документов, которые вы хотите внедрить в ChatGPT. Вскоре вы столкнетесь с проблемами платного доступа. Вы можете подумать, что GPT-4 является преемником GPT-3. Он был запущен только 14 марта 2023 года и может обрабатывать 25 000 слов — примерно в восемь раз больше, чем образы процесса GPT-3 — и обрабатывать гораздо более тонкие инструкции, чем GPT-3.5. Это по-прежнему имеет ту же фундаментальную проблему ограничения ввода данных. Как нам обойти некоторые из этих ограничений? Мы можем использовать библиотеку Python под названием LlamaIndex.

2. Расширение ChatGPT с помощью LlamaIndex (индекс GPT)

LlamaIndex, также известный как индекс GPT, представляет собой проект, предоставляющий центральный интерфейс для подключения ваших LLM к внешним данным. Да, вы правильно прочитали. С LlamaIndex мы можем построить что-то похожее на иллюстрацию ниже:

LlamaIndex соединяет ваши существующие источники данных и типы с доступными соединителями данных, например (API, PDF, документы, SQL и т. д.). Он позволяет вам использовать LLM, предлагая индексы для ваших структурированных и неструктурированных данных. Эти индексы облегчают обучение в контексте, удаляя типичные шаблоны и болевые точки: сохраняя контекст в доступной форме для быстрой вставки.

Работа с ограничениями подсказок — ограничением в 4096 токенов для GPT-3 Davinci и ограничением в 8000 токенов для GPT-4 — когда контекст слишком велик, становится гораздо более доступным и решает проблему разделения текста, предоставляя пользователям возможность взаимодействовать с индекс. LlamaInde также абстрагирует процесс извлечения соответствующих частей из документов и передачи их в подсказку.

Как добавить пользовательский источник данных

В этом разделе мы будем использовать GPT text-davinci-003 и LlamaIndex для создания чат-бота для вопросов и ответов на основе уже существующих документов.

Предпосылки

Прежде чем мы начнем, убедитесь, что у вас есть доступ к следующему:

  • Python ≥ 3.7 установлен на вашем компьютере
  • Ключ API OpenAI, который можно найти на веб-сайте OpenAI. Вы можете использовать свою учетную запись Gmail для единого входа.

  • Несколько документов Word, загруженных в ваши Google Docs. LlamaIndex поддерживает множество различных источников данных. В этом уроке мы продемонстрируем Google Docs.

Как это работает

  1. Создайте индекс данных документа с помощью LlamaIndex.
  2. Используйте естественный язык для поиска в индексе.
  3. Соответствующие фрагменты будут получены LlamaIndex и переданы в приглашение GPT. LlamaIndex преобразует исходные данные документа в удобный для запросов векторизованный индекс. Он будет использовать этот индекс для поиска наиболее подходящих разделов в зависимости от того, насколько точно совпадают запрос и данные. Затем информация будет загружена в приглашение, которое будет отправлено в GPT, чтобы у GPT был фон, необходимый для ответа на ваш вопрос.
  4. После этого вы можете запросить ChatGPT, учитывая контекст фида.

Создайте новую папку для своего проекта Python, которую вы можете назвать mychatbot, предпочтительно используя виртуальную среду или среду conda.

Сначала нам нужно установить библиотеки зависимостей. Вот как:

pip install openai
pip install llama-index
pip install google-auth-oauthlib

Далее мы импортируем библиотеки в Python и настроим ваш ключ API OpenAI в новом файле main.py.

# Import necessary packages
import os
import pickle

from google.auth.transport.requests import Request

from google_auth_oauthlib.flow import InstalledAppFlow
from llama_index import GPTSimpleVectorIndex, download_loader
os.environ['OPENAI_API_KEY'] = 'SET-YOUR-OPEN-AI-API-KEY'

В приведенном выше фрагменте мы явно устанавливаем переменную среды для ясности, поскольку пакет LlamaIndex неявно требует доступа к OpenAI. В типичной производственной среде вы можете поместить свои ключи в переменные среды, хранилище или любую другую службу управления секретами, к которой может получить доступ ваша инфраструктура.

Давайте создадим функцию, которая поможет нам аутентифицироваться в нашей учетной записи Google для обнаружения Google Docs.

def authorize_gdocs():
    google_oauth2_scopes = [
        "https://www.googleapis.com/auth/documents.readonly"
    ]
    cred = None
    if os.path.exists("token.pickle"):
        with open("token.pickle", 'rb') as token:
            cred = pickle.load(token)
    if not cred or not cred.valid:
        if cred and cred.expired and cred.refresh_token:
            cred.refresh(Request())
        else:
            flow = InstalledAppFlow.from_client_secrets_file("credentials.json", google_oauth2_scopes)
            cred = flow.run_local_server(port=0)
        with open("token.pickle", 'wb') as token:
            pickle.dump(cred, token)

Чтобы включить API Документов Google и получить учетные данные в консоли Google, выполните следующие действия:

  1. Перейдите на веб-сайт Google Cloud Console (console.cloud.google.com).
  2. Создайте новый проект, если вы еще этого не сделали. Вы можете сделать это, щелкнув раскрывающееся меню «Выбрать проект» на верхней панели навигации и выбрав «Новый проект». Следуйте инструкциям, чтобы дать вашему проекту имя и выберите организацию, с которой вы хотите его связать.
  3. После создания проекта выберите его в раскрывающемся меню на верхней панели навигации.
  4. Перейдите в раздел APIs & Services из меню слева и нажмите кнопку + ВКЛЮЧИТЬ APIS AND SERVICES в верхней части страницы.
  5. Найдите Google Docs API в строке поиска и выберите его в списке результатов.
  6. Нажмите кнопку «Включить», чтобы включить API для вашего проекта.
  7. Нажмите на меню экрана согласия OAuth, создайте и дайте своему приложению имя, например, mychatbot, затем введите адрес электронной почты службы поддержки, сохраните и добавьте области.

Вы также должны добавить тестовых пользователей, так как это приложение Google еще не будет одобрено. Это может быть ваша собственная электронная почта.

Затем вам нужно будет настроить учетные данные для вашего проекта, чтобы использовать API. Для этого перейдите в раздел «Учетные данные» в меню слева и нажмите «Создать учетные данные». Выберите идентификатор клиента OAuth и следуйте инструкциям, чтобы настроить учетные данные.

После того, как ваши учетные данные настроены, вы можете загрузить файл JSON и сохранить его в корне вашего приложения, как показано ниже:

После того, как вы настроили свои учетные данные, вы можете получить доступ к API Документов Google из своего проекта Python.

Перейдите в свои Документы Google, откройте несколько из них и получите уникальный идентификатор, который можно увидеть в адресной строке вашего браузера, как показано ниже:

Скопируйте идентификаторы gdoc и вставьте их в свой код ниже. У вас может быть N gdocs, которые вы можете индексировать, чтобы ChatGPT имел контекстный доступ к вашей пользовательской базе знаний. Мы будем использовать плагин GoogleDocsReader из библиотеки LlamaIndex для загрузки ваших документов.

# function to authorize or download latest credentials 
authorize_gdocs()

# initialize LlamaIndex google doc reader 
GoogleDocsReader = download_loader('GoogleDocsReader')

# list of google docs we want to index 
gdoc_ids = ['1ofZ96nWEZYCJsteRfqik_xNQTGFHtnc-7cYrf0dMPKQ']

loader = GoogleDocsReader()

# load gdocs and index them 
documents = loader.load_data(document_ids=gdoc_ids)
index = GPTSimpleVectorIndex(documents)

LlamaIndex имеет множество коннекторов данных, охватывающих такие сервисы, как Notion, Obsidian, Reddit, Slack и т. д. Вы можете найти сжатый список доступных коннекторов данных здесь.

Если вы хотите сохранять и загружать индекс на лету, вы можете использовать следующие вызовы функций. Это ускорит процесс выборки из предварительно сохраненных индексов вместо выполнения вызовов API к внешним источникам.

# 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')

Запросить индекс и получить ответ можно, выполнив следующий код ниже. Код можно легко расширить до API для отдыха, который подключается к пользовательскому интерфейсу, где вы можете взаимодействовать со своими пользовательскими источниками данных через интерфейс GPT.

# Querying the index
while True:
    prompt = input("Type prompt...")
    response = index.query(prompt)
    print(response)

Учитывая, что у нас есть документ Google с подробной информацией обо мне, информация, которая легко доступна, если вы выполняете общедоступный поиск в Google.

Сначала мы будем взаимодействовать напрямую с vanilla ChatGPT, чтобы увидеть, какие выходные данные он генерирует, не внедряя пользовательский источник данных.

Это немного разочаровало! Давай еще раз попробуем.

INFO:google_auth_oauthlib.flow:"GET /?state=oz9XY8CE3LaLLsTxIz4sDgrHha4fEJ&code=4/0AWtgzh4LlIfmCMEa0t36dse_xoS0fXFeEWKHFiouzTvz4Qwr7T2Pj6anb-GiZ__Wg-hBBg&scope=https://www.googleapis.com/auth/documents.readonly HTTP/1.1" 200 65
INFO:googleapiclient.discovery_cache:file_cache is only supported with oauth2client<4.0.0
INFO:root:> [build_index_from_documents] Total LLM token usage: 0 tokens
INFO:root:> [build_index_from_documents] Total embedding token usage: 175 tokens
Type prompt...who is timothy mugayi hint he is a writer on medium

INFO:root:> [query] Total LLM token usage: 300 tokens
INFO:root:> [query] Total embedding token usage: 14 tokens
Timothy Mugayi is an Engineering Manager at OVO (PT Visionet Internasional), a subsidiary of GRAB. He is also an avid writer on medium.com who writes on technical topics covering python and freelancing side hustling for programmers. Timothy has been coding for over 15 years, building enterprise solutions for large cooperations. During his free time, he enjoys mentoring and coaching.
last_token_usage=300
Type prompt...

Type prompt...Given you know who timothy mugayi is write an interesting introduction about him

Timothy Mugayi is an experienced and accomplished professional with a wealth of knowledge in engineering, coding, and mentoring. He is currently an Engineering Manager at OVO, a subsidiary of GRAB, and has been coding for over 15 years, building enterprise solutions for large cooperations. In his free time, Timothy enjoys writing on technical topics such as Python and freelancing side hustling for programmers on medium.com, as well as mentoring and coaching. With his impressive background and expertise, Timothy is a valuable asset to any organization.
last_token_usage=330

Теперь он может выводить ответы, используя новый пользовательский источник данных, точно создавая следующие выходные данные.

Мы можем пойти дальше.

Type prompt...Write a cover letter for timothy mugayi for an upwork python project to build a custom ChatGPT bot with access to external data sources
INFO:root:> [query] Total LLM token usage: 436 tokens
INFO:root:> [query] Total embedding token usage: 30 tokens

Dear [Hiring Manager],

I am writing to apply for the Python project to build a custom ChatGPT bot with access to external data sources. With over 15 years of experience in coding and building enterprise solutions for large corporations, I am confident that I am the ideal candidate for this position.

I am currently an Engineering Manager at OVO (PT Visionet Internasional), a subsidiary of GRAB. I have extensive experience in Python and have been writing on technical topics covering Python and freelancing side hustling for programmers on medium.com. I am also an avid mentor and coach, and I believe that my experience and skillset make me the perfect candidate for this project.

I am confident that I can deliver a high-quality product that meets the requirements of the project. I am also available to discuss the project further and answer any questions you may have.

Thank you for your time and consideration.

Sincerely,
Timothy Mugayi
last_token_usage=436
Type prompt...

LlamaIndex внутренне примет ваше приглашение, выполнит поиск соответствующих фрагментов в индексе, а затем передаст как ваше приглашение, так и соответствующие фрагменты в модель ChatGPT. Приведенные выше процедуры демонстрируют фундаментальное первое использование LlamaIndex и GPT для ответов на вопросы. Тем не менее, вы можете сделать гораздо больше. Вы ограничены только своим творчеством при настройке LlamaIndex для использования другой большой языковой модели (LLM), использования другого типа индекса для различных действий или программного обновления старых индексов новым индексом.

Вот пример явного изменения модели LLM. На этот раз мы подключаемся к другому пакету Python, который поставляется в комплекте с LlamaIndex и называется langchain.

from langchain import OpenAI
from llama_index import LLMPredictor, GPTSimpleVectorIndex, PromptHelper

...

# define anoter LLM explicitly
llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-003"))

# define prompt configuraiton
# set maximum input size
max_input_size = 4096
# set number of output tokens
num_output = 256
# set maximum chunk overlap
max_chunk_overlap = 20
prompt_helper = PromptHelper(max_input_size, num_output, max_chunk_overlap)

index = GPTSimpleVectorIndex(
    documents, llm_predictor=llm_predictor, prompt_helper=prompt_helper
)

Если вы хотите следить за своими бесплатными или платными кредитами OpenAI, вы можете перейти к приборной панели OpenAI и проверить, сколько кредитов осталось.

Создание индекса, вставка в индекс и запрос индекса будут использовать токены. Следовательно, всегда важно убедиться, что вы выводите использование токена для целей отслеживания при создании своих пользовательских ботов.

last_token_usage = index.llm_predictor.last_token_usage

print(f"last_token_usage={last_token_usage}")

Последние мысли

ChatGPT в сочетании с LlamaIndex может помочь в создании индивидуального чат-бота ChatGPT, который может делать выводы на основе собственных источников документов. Хотя ChatGPT и другие LLM довольно мощные, расширение модели LLM обеспечивает гораздо более совершенный опыт и открывает возможность создания чат-бота в диалоговом стиле, который можно использовать для создания реальных бизнес-применений, таких как помощь клиентам или даже классификаторы спама. Учитывая, что мы можем передавать данные в режиме реального времени, мы можем оценить некоторые ограничения моделей ChatGPT, обучаемых до определенного периода.

Для получения полного исходного кода вы можете обратиться к этому репозиторию GitHub.

Если вы хотите создать собственных ботов ChatGPT, которые понимают ваш домен, оставьте сообщение в разделе комментариев, и давайте подключимся.