Почему мой помощник форума на базе ИИ с трудом отвечает на вопросы?

Одна из распространённых ошибок, которую многие из нас допускают в отношении ИИ, заключается в том, что наши ожидания таковы:

graph TD
    Вопрос -->|"Дорогая магия ИИ"| Ответ
    Ответ["Идеальный ответ"]

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

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

Как на самом деле работает Discourse AI

Реальность более сложна. Когда вы задаёте вопрос, происходит следующее:

graph TD
    Вопрос --> Консолидация[Консолидация вопроса]
    Консолидация --> RAG[Система RAG]
    RAG --> ВыборИнструментов[Выбор инструментов]
    ВыборИнструментов --> Поиск[Поиск]
    ВыборИнструментов --> Категории[Категории]
    ВыборИнструментов --> Теги[Теги]
    Поиск --> Контекст[Сбор контекста]
    Категории --> Контекст
    Теги --> Контекст
    Контекст --> Ответ[Генерация ответа]
  1. Ваш вопрос сначала консолидируется и понимается.
  2. Наша система RAG ищет в доступных знаниях (опционально).
  3. На основе найденного она решает, какие инструменты использовать (опционально).
  4. Инструменты собирают конкретную информацию.
  5. Всё объединяется для генерации ответа.

Контекст — это всё

При использовании систем ИИ для ответов на вопросы контекст имеет решающее значение.

Большие языковые модели (LLM), такие как GPT-4 или Claude 3.5 Sonnet, обучены на огромном массиве публичных данных. Однако есть два ограничения, которые делают их менее идеальными для ответов на вопросы в конкретной предметной области:

  1. LM обучены на публичных данных.
  2. LLM имеют дату отсечения обучения, что означает, что публичные данные, появившиеся всего несколько месяцев назад, скорее всего, отсутствуют в наборе данных.

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

Контекст — это информация, которую мы предоставляем LLM перед тем, как она ответит на вопрос, чтобы помочь ей дать правильный ответ.

Как получить контекст?

Контекст можно предоставить несколькими способами:

  • Автоматически с помощью RAG (Retrieval-Augmented Generation — генерация с дополнением извлечением) — когда вы загружаете документы в персону, мы можем искать ответы в документе перед ответом. Сначала мы консолидируем ваш вопрос, а затем ищем в содержании с помощью семантического поиска. Это помогает определить, какие инструменты использовать.
  • Автоматически с помощью инструментов — LLM могут использовать инструменты (например, поиск или чтение тем) для поиска дополнительной информации на основе рекомендаций RAG.
  • Вручную — вы можете вставить большой объём текста, а затем задать LLM вопросы о нём.

Контекст на основе инструментов

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

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

В этом примере видно, что я спросил помощника форума, чем я занимался, и он решил поискать контент от Сэма, опубликованный за последнюю неделю, и получил 21 результат.

Чтобы понять, какой новый контекст модель получила в результате этого поиска, вы можете включить настройку: Разрешённые группы для отладки бота ИИ.

Это добавит кнопку отладки в нижней части каждого поста; при нажатии на неё можно увидеть точный контекст, который был предоставлен LLM.

Инструмент поиска Discourse очень богат в плане опций:

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

Что мне делать, если я не получаю ожидаемых результатов?

Учитывая, что контекст — это всё, первое, что нужно проверить:

  1. Нашла ли система RAG релевантный контент для направления инструментов.
  2. Использовала ли LLM правильные инструменты на основе этих рекомендаций.
  3. Нашли ли инструменты ожидаемые результаты.

Например, рассмотрим этот провал:

Это классический провал как в направлении RAG, так и в использовании инструментов.

LLM выполнила поиск по запросу:

bug critical urgent broken order:latest status:open status:public

Ключевая часть этого поиска довольно слабая и даёт лишь один результат; семантический поиск затем с трудом находит результаты, потому что каждый раз, когда кто-то громко заявляет о проблеме, система считает её срочной.

Что, вероятно, дало бы лучший результат, так это:

Найти все открытые ошибки, отсортированные по количеству лайков, которые были сообщены за последние две недели. Однако этот конкретный поднабор информации недоступен функции поиска в таком виде; для этого потребуется пользовательский инструмент.

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

Что делать с неудачными случаями?

Когда у вас есть неудачное взаимодействие, у вас есть несколько вариантов:

  1. Вы можете улучшить системный промпт, чтобы лучше направлять бота.
  2. Вы можете опубликовать информацию на форуме, чтобы дать боту лучшие результаты поиска — вы можете приоритизировать категорию документации, чтобы она с большей вероятностью была найдена.
  3. Вы можете загрузить документ с большим контекстом; мы разобьём документ на фрагменты и предоставим ближайшие фрагменты к консолидированному вопросу, чтобы помочь боту сориентироваться.
  4. Если ваша персона преимущественно связана с поиском, принудительно используйте инструмент поиска.
  5. Вы можете разработать пользовательские инструменты, чтобы лучше соответствовать вашим потребностям.
  6. Вы можете увеличить объём контекста, предоставляемого LLM (больше результатов поиска и т. д.).

ИИ может быть размытым: решение одной проблемы может создать другую

Имейте в виду, что создание «идеального» бота для ответов на вопросы с помощью ИИ — это путь. Создание контролируемых циклов обратной связи и регулярная оценка его эффективности позволят вам со временем улучшить его.

Будьте внимательны к тому, как построена технология: если для ответа на вопрос вам нужен контекст из 10 000 постов, может оказаться невозможным загрузить весь список постов в контекст для ответа с учётом текущих окон контекста.

Ключ к успеху — понимание того, что получение лучших результатов — это итеративный процесс.}

Отличная статья, Сэм, особенно для людей без опыта в разработке! :heart:

Её определённо стоит добавить в первый пост по адресу AI bot - Agents.

Спасибо, Сэм!

Это очень полезный комментарий.
Я всегда считал, что RAG-документы работают в паре с инструментами (обычно поиск и чтение). То есть использовать инструменты для получения ответов на форуме, а RAG — для добавления дополнительных знаний, например, из блогов, внешних документов и т. д.
А затем из всего этого выбирать наиболее релевантное.

Я использовал промпт, чтобы задать персонажу правила работы с этим контекстом, но не думал о том, что:

Делается ли это путём предоставления объяснений о структуре форума и примеров вопросов и ответов в документации?

Можете ли вы немного подробнее рассказать, как происходит обобщение вопроса?

Примером может служить следующее:

  1. ИИ обобщает очень длинный диалог до: «Тони хочет понять, как работает консолидация вопросов и как предоставляются примеры».
  2. Выполняется RAG по тексту «Тони хочет понять, как работает консолидация вопросов и как предоставляются примеры», ищутся похожие фрагменты (например, это может быть «консолидация вопросов работает по принципу XYZ»).
  3. Затем фрагменты, близкие к заданному вопросу, добавляются в диалог в качестве заранее подготовленного контекста.