Чат-боты и краткосрочная память
Давайте пройдем по лестнице терминологии и выясним, чем отличаются чат-бот и 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, данные статьи будут для вас простыми и понятными.
Как мы обращаемся с историей сообщений
При удалении/суммаризации сообщений мы теряем полезную информацию.
Например, в первых сообщениях, которые мы собираемся удалить, может содержаться ТЗ от пользователя - и при удалении/суммаризации потеряются детали.
Основные стратегии управления историей сообщений
-
Обрезка по количеству токенов (
max_tokens
)
Позволяет ограничить историю сообщений так, чтобы их суммарное количество токенов не превышало заданного значения. Это особенно полезно для соблюдения ограничений контекстного окна модели. -
Обрезка по количеству сообщений (
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...
Теперь вы знаете, как управлять историей сообщений в чат-ботах. Практику по созданию чат-бота мы пропускаем - потому что это легко и скучно.
Однако впереди вас ждут мультиагентные системы - там работа с краткосрочной памятью будет очень сложной и интересной.