Перейти к основному содержимому

Чат-боты и краткосрочная память

Давайте пройдем по лестнице терминологии и выясним, чем отличаются чат-бот и AI агент друг от друга? А также изучим, как в чат-ботах реализуется краткосрочная память.

Questions

Вопросы, которые мы будем обсуждать:

  • чем отличаются LLM, чат-бот, AI workflow, co-pilot, агент и другие друг от друга?
  • что делать, если пользователь в процессе общения достиг лимита по токенам?
  • как краткосрочная память реализуется в чат-ботах?

Steps

1. Chatbots

Explore the difference between chatbots and other things

2. Изучаем short-term memory

Что делать, если пользователь общается с вашим ботом уже в десятый раз?

  • во-первых, из-за большой истории сообщений, LLM хуже следует последним инструкциям
  • во-вторых, каждый следущий запрос будет стоить дороже (если мы используем проприетарную LLM, тарифицируются все input-токены)
подсказка

просто читаем обе статьи, смотрим картинки - главное понять концепты!

если вы внимательно изучили OpenAI API, данные статьи будут для вас простыми и понятными.

Как мы обращаемся с историей сообщений

Сравнение разных подходов

минусы

При удалении/суммаризации сообщений мы теряем полезную информацию.

Например, в первых сообщениях, которые мы собираемся удалить, может содержаться ТЗ от пользователя - и при удалении/суммаризации потеряются детали.

Основные стратегии управления историей сообщений

  1. Обрезка по количеству токенов (max_tokens)
    Позволяет ограничить историю сообщений так, чтобы их суммарное количество токенов не превышало заданного значения. Это особенно полезно для соблюдения ограничений контекстного окна модели.

  2. Обрезка по количеству сообщений (max_messages)
    Ограничивает историю до определённого числа последних сообщений, удаляя более старые.

Дополнительные параметры для настройки обрезки

  • strategy="last"
    Сохраняет последние сообщения, удаляя более старые. Это стандартная стратегия для сохранения актуального контекста.

  • include_system=True
    Гарантирует сохранение SystemMessage, который обычно содержит важные инструкции для модели. (How to trim messages | 🦜️ LangChain)

  • start_on="human" и ends_on=("human", "tool")
    Обеспечивают корректную структуру истории сообщений, начиная с сообщения пользователя и заканчивая сообщением пользователя или инструмента.

Примеры использования

Для обрезки истории сообщений по количеству токенов с сохранением системного сообщения и последних сообщений пользователя можно использовать следующий код:

from langchain_core.messages import trim_messages

trimmed_history = trim_messages(
messages=chat_history,
max_tokens=1000,
strategy="last",
include_system=True,
start_on="human",
ends_on=("human", "tool")
)

Подробнее о функциях и параметрах trim_messages можно узнать в официальной документации LangChain:

Продвинутые техники:

  • мы можем использовать несколько каткосрочных памятей, например:
    • одна для хранения истории сообщений - будет располагаться в самих сообщениях
    • вторая для хранения информации о пользователе (например, его предпочтения) - будет распологаться в системном сообщении
    • третья для хранения задания пользователя - будет располагаться в системном сообщении
  • мы можем делать retrieve по удаленным сообщениям в случае необходимости (retrieve изучим в будущем модуле)

Now we know...

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

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

Exercises