Написать пост

Как обучить ChatGPT на личных данных

Аватарка пользователя sudo >: )

Рассказываем об архитектуре LLM и требованиях к данным для создания «частного ChatGPT», который использует ваши собственные данные.

С появлением больших языковых моделей (LLM), таких как ChatGPT и GPT-4, многие задаются вопросом, можно ли создать частный ChatGPT, обучив модель на личных или корпоративных данных. Осуществимо ли это? Могут ли такие языковые модели предложить эти возможности?

В этой статье мы поговорим об архитектуре LLM и требованиях к данным для создания «частного ChatGPT», который использует ваши собственные данные. Мы изучим преимущества этой технологии и то, как вы можете преодолеть её ограничения.

Это перевод статьи «How to create a private ChatGPT with your own data» от автора Mick Vleeshouwer. Здесь и далее повествование ведётся от лица автора.

Отказ от ответственности: в этой статье представлен обзор архитектурных концепций, которые не относятся к Azure, но проиллюстрированы с использованием служб Azure, поскольку я — Solution Architect в Microsoft.

Как обучить ChatGPT на личных данных 1

1. Недостатки тонкой настройки LLM на личных данных

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

Однако у такого подхода есть недостатки: у модели могут быть сбои в ответах, она может выдавать нерелевантную запросу информацию. У GPT-4 такое явление назвали риском галлюцинаций. Всё потому, что GPT-4 обучался только на данных до сентября 2021 года.

Недостатки при тонкой настройке LLM:

  1. Можно отследить, из какого датасета берется ответ.
  2. Нельзя ограничить доступ к документам с информацией для отдельных пользователей.
  3. Добавление новой информации для LLM требует переобучения модели.

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

Как преодолеть ограничения и по-прежнему получать выгоду от LLM?

2. Отделите свои знания от вашей языковой модели

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

Будет хорошей идеей передавать все документы в модель во время выполнения. Однако это сложно сделать из-за ограничения количества символов (измеряемого в токенах), которые могут быть обработаны за один раз.

Например, GPT-3 поддерживает токены до 4 КБ, GPT-4 — до 8 КБ или 32 КБ. Поскольку цены указаны за 1000 токенов, использование меньшего количества токенов также может помочь сократить расходы.

Вот, каким будет алгоритм:

  1. Пользователь задает вопрос.
  2. Приложение находит наиболее релевантный текст, который (скорее всего) содержит ответ.
  3. LLM отправляется краткая подсказка с соответствующим текстом документа.
  4. Пользователь получит ответ или ответ «Ответ не найден».
Как обучить ChatGPT на личных данных 2

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

3. Получите наиболее релевантные данные

Контекст — это ключевой аспект в настройке.

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

Так мы предоставим языковой модели правильный контекст, и она сможет генерировать правильный ответ.

3.1 Разбивайте и разделяйте данные

Поскольку в подсказке для ответа есть ограничение на токены, нам нужно дробить наши документы на более мелкие куски.

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

После этого нужно создать поисковые индексы для фрагментов текста, которые можно запрашивать с вопросом пользователя.

Вариант 1: Используйте поисковый продукт

Самый простой способ создать индекс семантического поиска — использовать существующую платформу «Поиск как услуга».

Например, в Azure можно использовать Cognitive Search, который предлагает управляемый конвейер приема документов и семантическое ранжирование с использованием языковых моделей Bing.

Вариант 2: Используйте вложения для создания собственного семантического поиска

Вложение — это вектор (список) чисел с плавающей запятой. Расстояние между двумя векторами измеряет их родство. Небольшие расстояния предполагают высокое родство, а большие расстояния предполагают низкое родство.

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

В Azure можно хранить вложения в управляемой векторной базе данных, такой как Azure Cache для Redis (RediSearch), или в векторной базе данных с открытым исходным кодом, такой как Weaviate или Pinecone.

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

Как обучить ChatGPT на личных данных 3

3.2 Повышение релевантности с помощью различных стратегий фрагментации

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

Общие шаблоны, которые могут улучшить релевантность:

  1. Фрагментация по странице или по токену может привести к потере контекста. Используйте связанный друг с другом контент во фрагментах, чтобы увеличить выдачу наиболее релевантной информации.
  2. Обеспечьте больше контекста. Создайте очень структурированный документ с разделами, вложенными в несколько уровней (например, с разделами вида 1.3.3.7). Такой подход будет удачным, поскольку он даёт дополнительный контекст вроде названия главы и раздела. 
  3. Создайте фрагменты с кратким содержанием более крупного раздела документа. Это позволит включить в ответ самый важный текст и объединить всю информацию в один блок.

4. Пишите краткие промпты, чтобы избежать галлюцинаций

Разработка промптов — это то, как вы «программируете» модель, обычно предоставляя ей инструкции в промпте или несколько примеров.

Промпт — это важная часть в работе с ChatGPT для предотвращения нежелательных ответов. Сегодня создание промптов считается новым навыком, и каждую неделю публикуется все больше и больше примеров промптов.

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

Если модель не может ответить на вопрос, она должна дать предопределенный ответ «нет ответа».

Выходные данные должны включать сноску (цитаты) к исходному документу, чтобы пользователь мог проверить его фактическую точность, просмотрев источник.

Пример промпта:

			"You are an intelligent assistant helping Contoso Inc employees with their healthcare plan questions and employee handbook questions. " + \
"Use 'you' to refer to the individual asking the questions even if they ask with 'I'. " + \
"Answer the following question using only the data provided in the sources below. " + \
"For tabular information return it as an html table. Do not return markdown format. "  + \
"Each source has a name followed by colon and the actual information, always include the source name for each fact you use in the response. " + \
"If you cannot answer using the sources below, say you don't know. " + \
"""
###
Question: 'What is the deductible for the employee plan for a visit to Overlake in Bellevue?'
Sources:
info1.txt: deductibles depend on whether you are in-network or out-of-network. In-network deductibles are $500 for employee and $1000 for family. Out-of-network deductibles are $1000 for employee and $2000 for family.
info2.pdf: Overlake is in-network for the employee plan.
info3.pdf: Overlake is the name of the area that includes a park and ride near Bellevue.
info4.pdf: In-network institutions include Overlake, Swedish and others in the region
Answer:
In-network deductibles are $500 for employee and $1000 for family [info1.txt] and Overlake is in-network for the employee plan [info2.pdf][info4.pdf].
###
Question: '{q}'?
Sources:
{retrieved}
Answer:
"""
		

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

Во время выполнения {q} превратится в вопрос пользователя, а {retrieved} будет заполнен соответствующими разделами из БД для запроса.

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

Этот промпт используется для создания ответа через (Azure) OpenAI API.

Если вы используете gpt-35-turbo (ChatGPT), можно сохранять историю разговора, чтобы была возможность задавать уточняющие вопросы или другие логические задачи (например, резюмирование ответа).

Отличный ресурс, чтобы узнать больше о проектировании промптов — это dair-ai/Prompt-Engineering-Guide на GitHub.

Превью видео E5g20qmeKpg

5. Следующие шаги

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

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

  1. Плагин извлечения ChatGPT, позволяющий ChatGPT получать доступ к актуальной информации. На данный момент плагин поддерживает только общедоступный ChatGPT, но мы надеемся, что в будущем возможность добавления плагинов будет добавлена в ChatGPT API (OpenAI + Azure).
  2. LangChain, популярная библиотека для объединения LLM и других источников знаний.
  3. Azure Cognitive Search + OpenAI accelerator для работы с личными данными. Он аналогичен ChatGPT и готов к развертыванию.
  4. OpenAI Cookbook, пример того, как использовать вложения OpenAI для вопросов и ответов в Jupyter (инфраструктура не требуется).
  5. Semantic Kernel, новая библиотека для смешивания традиционных языков программирования с LLM.

Можно улучшить «собственный ChatGPT», связав его с другими системами  при помощи LangChain или Semantic Kernel. Возможности безграничны.

Заключение

В заключение, полагаться исключительно на языковую модель для создания информационного текста — ошибка.

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

Как обучить ChatGPT на личных данных 4

Чтобы создать механизм вопросов и ответов поверх LLM, отделите свою базу знаний от большой языковой модели и генерируйте ответы только на основе предоставленного контекста.

Следите за новыми постами
Следите за новыми постами по любимым темам
12К открытий13К показов