ОткрытыйAI: подсказка для завершения чата для определения намерений пользователя по истории сообщений

Вопрос или проблема

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

Я работаю в издательском доме и создаю чат-бота, который внутренне генерирует 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-ассистента! Если появятся дополнительные вопросы, не стесняйтесь обращаться!

Оцените материал
Добавить комментарий

Капча загружается...