Вопрос или проблема
Я работаю над ИИ-ассистентом, который анализирует историю чата между пользователем и другим ассистентом и выводит реальный намерение за запросом пользователя.
Я работаю в издательском доме и создаю чат-бота, который внутренне генерирует SQL-запросы с использованием LangChain (SQL-агент). Бот может извлекать информацию, такую как цены, происхождение публикаций, киоски, идентификаторы публикаций, темы и т. д. Поскольку эти агенты не имеют состояния (так же, как и завершение чата), я использую еще один уровень завершения, чтобы генерировать значимые запросы для бота.
Например:
Если я спрошу агента: "Какая новая публикация о 'фитопланктонах' от издательского дома A-47854?"
, он извлечет:
Ответ:
Новое исследование о ископаемых и фитопланктоне
ISBN: 1237854-HNU
Страна: Франция
Издание: На удержании
Издательство: Journal World Inc.
Фитопланктон в стоячей воде
ISBN: HBXX78-HNU
Страна: Германия
Издание: Опубликовано
Издательство: Environmental Herald
Но если я задам последующий вопрос: "Какие другие публикации у вас есть от второго издательства?"
, агент не сможет ответить правильно, потому что у него нет памяти.
Я пытаюсь построить слой сверху, который будет перезаписывать и предоставлять контекст для запроса, чтобы моя модель могла дать более точный ответ.
Желаемая перезапись запроса:
Например, для последующего вопроса:
"Какие другие публикации у вас есть от второго издательства?"
Ожидаемая переформулировка будет:
"Какие другие публикации, кроме 'Фитопланктона в стоячей воде' (ISBN HBXX78-HNU), есть у дома 'Environmental Herald'?"
Почему?
Потому что “Environmental Herald” — это второй дом, упомянутый в истории чата, и эта контекстуальная информация имеет решающее значение.
Аналогично, если пользователь говорит что-то вроде “Спасибо” или “Это всё, бот”, такие запросы не должны быть перезаписаны.
Если запрос не связан с предыдущим разговором, он должен быть возвращен как есть. Например:
“Расскажи мне о последних публикациях по биомеханике из Лондона.”
Я пробовал много подсказок и подходов, чтобы достичь этого поведения, но ничего не сработало последовательно.
Это моя подсказка:
*SYSTEM = """
Ниже приведена история разговора на данный момент и новый вопрос, заданный пользователем, на который нужно ответить, проведя поиск в базе знаний.
Когда это связано с запросом, используйте ключевые слова 'Издатель' и 'Дом', и включите ISBN-код, когда вопрос требует перезаписи.
Ваша задача — генерировать запросы, а не отвечать на них.
Следуйте этим шагам и правилам:
Правила:
1. Если пользователь приветствует вас, поздравляет вас или говорит прощай, передайте этот текст, как есть. Например, "Спасибо, бот":
Ваш финальный ответ должен быть: "Спасибо, бот."
2. Проанализируйте историю чата и определите, связан ли текущий запрос пользователя с предыдущим разговором. Если да, предоставьте соответствующий контекст, данные, ключевые слова и коды для передачи их SQL-агенту.
Пример:
Пользователь: "Какие последние названия в каталоге?"
Ассистент: "1. Биомеханика для студентов колледжа 2. Статистика за пределами вывода 3. Киноночи как способ терапии"
Пользователь: "Дайте больше информации о втором."
Правильный выход для генерации будет:
"Больше информации о 2. 'Статистика за пределами вывода'."
"""*
А вот мой код:
# Сообщение системы
system_message = {
"role": "system",
"content": SYSTEM
}
user_query = "Расскажи мне больше о второй публикации"
# Создаем полный список сообщений: сообщение системы + история чата + текущий запрос пользователя
messages = [system_message] + CHAT_HISTORY + [
{
"role": "user",
"content": user_query,
}
]
contex_question = model_client.chat.completions.create(
model=deployment,
messages=messages,
temperature=0.0
)
key_question = contex_question.choices[0].message.content
print(f"Запрос для вывода: {messages}\n")
print(f"Сгенерированный ответ: {key_question}")
Когда я печатаю {messages}
, я вижу, что подсказка хорошо структурирована, и мой последний вопрос правильно добавлен, но ответы часто не такие, как я ожидаю.
Например, если это моя история чата:
Пользователь: “У вас есть какие-либо публикации из Норвегии по биомеханике?”
Ассистент: “Да, есть. 1. Метрики очков по биомеханике ISBN 4785-7854, и 2. Общие решения по металлургии и био технологий ISBN 8575-8YUA.”
Затем я спрашиваю:
Пользователь: “Какова дата публикации для первой?”
Ответ, который я получаю:
“Дата публикации первой публикации по биомеханике в Норвегии.”
Однако ожидаемый вывод, который я хочу, это:
"Дата публикации для Метрики очков по биомеханике ISBN 4785-7854."
Обратите внимание, как включен ISBN, что является желаемым поведением.
Также, если я напишу что-то вроде:
Пользователь: “Спасибо, бот. Это все.”
Я получаю ответы вроде:
“Пожалуйста. Приходите в любое время.” или
“Еще публикации, связанные с Норвегией и биомеханикой.”
Эти ответы не ожидаемы. Модель должна вернуть точное сообщение, когда это вежливая фраза, такая как "Спасибо."
Я буду признателен за вашу помощь в настройке кода, подсказки или логики, чтобы достичь желаемого результата. Большое спасибо!
Ответ или решение
Конечно! Я понимаю вашу задачу и то, как важно получить точные ответы от вашего чат-бота, особенно в контексте запросов, связанных с ранее обсуждаемой информацией. Позвольте мне предложить оптимизированный подход к вашей задаче.
1. Уточнение системы промпта
Для достижения желаемых результатов важно правильно настроить систему сообщений и использовать эффективные правила для переписывания запросов. Я предлагаю следующее обновление для вашей системы промпта, чтобы улучшить извлечение контекста и поддержание состояния:
SYSTEM = """
Вы — интеллектуальный помощник, который анализирует историю чата и обновляет запросы на основе информации, обсуждаемой до этого. Помните, что ваш основной фокус — генерировать запросы для SQL-агента, учитывая историю диалога.
Шаги и правила:
1. Если пользователь выражает благодарность или прощается, выведите это сообщение без изменений.
2. Если текущий запрос связан с предыдущими сообщениями, преобразуйте его, добавив необходимый контекст, такой как название публикации, ISBN и издательство.
3. Если запрос не связан с предыдущей беседой, выведите его как есть.
Примеры:
- Пользователь: "Какой новый публикации о 'фито растении' от редакционного дома A-47854?"
Ассистент: "Новая работа о фоссилах и фитопланктоне."
- Пользователь: "Какие еще публикации у вас есть от второго дома?"
Генерируемый запрос: "Какие еще публикации, помимо 'Phyplankton in Stale Water' (ISBN HBXX78-HNU), имеются у дома 'Environmental Herald'?"
Запоминание контекста имеет решающее значение. Не забывайте использовать подсказываемые ключевые слова и данные из предыдущего диалога для создания новых запросов.
"""
2. Корректировка кода
Кроме улучшения текста системного сообщения, оптимизируйте код, который принимает запрос от пользователя и формирует данные для SQL-агента. Например:
# Системное сообщение
system_message = {
"role": "system",
"content": SYSTEM
}
# Предполагаемая история чата
CHAT_HISTORY = [
{
"role": "user",
"content": "Есть ли у вас публикации из Норвегии по биомеханике?"
},
{
"role": "assistant",
"content": "Да, у нас есть. 1. Метрики очков по биомеханике ISBN 4785-7854, 2. Общая поломка металлов и биосистем ISBN 8575-8YUA."
}
]
user_query = "Какова дата публикации для первой?"
# Подготовка полного списка сообщений: системное сообщение + история чата + текущий запрос пользователя
messages = [system_message] + CHAT_HISTORY + [
{
"role": "user",
"content": user_query,
}
]
# Вызов модели для генерации контекстного запроса
context_question = model_client.chat.completions.create(
model=deployment,
messages=messages,
temperature=0.0
)
# Извлечение сгенерированного запроса
key_question = context_question.choices[0].message.content
print(f"Сгенерированный запрос: {key_question}")
3. Обработка специфических случайностей
Убедитесь, что в вашем алгоритме задается логика для идентификации полных предложений, выражающих благодарность или завершение беседы. Имейте в виду, что баса не стоит обрабатывать стандартные приветствия и прощания, так как это может привести к нежелательным ответам.
4. Тестирование и итерация
Обязательно протестируйте обновленные правила на множестве различных сценариев, чтобы оценить их эффективность. Иногда требуется несколько итераций, чтобы достичь необходимого уровня точности и контекста.
Заключение
Используя данные рекомендации, вы сможете создать более интеллектуальный помощник, который будет успешно генерировать запросы с учетом контекста. Удачи в разработке вашего AI-ассистента! Если появятся дополнительные вопросы, не стесняйтесь обращаться!