Реализация контекстной памяти для AI-чат-бота
Контекстная память позволяет боту помнить: что обсуждалось ранее в диалоге, кто этот пользователь, что он предпочитает. Без памяти каждый запрос — отдельный разговор со strangers. С памятью — непрерывный диалог с узнаваемым собеседником.
Уровни памяти
Кратковременная (In-context): история текущего диалога в окне контекста LLM. Последние 10–20 сообщений. Самый простой уровень — просто передавать историю в промпт.
Среднесрочная (Session): Redis с TTL 24–48 часов. Сохраняет контекст между сессиями того же дня. Незаполненные слоты, текущие задачи, промежуточные результаты.
Долгосрочная (Persistent): база данных, хранит постоянный профиль пользователя. Предпочтения, история запросов, ключевые факты.
Векторная (Semantic): эмбеддинги прошлых диалогов в векторной базе. При новом запросе — semantic retrieval релевантных воспоминаний.
Реализация с MemoryLayer
from langchain.memory import ConversationSummaryBufferMemory
from langchain_openai import ChatOpenAI
# Суммаризирующая память: старые сообщения сжимаются, последние — полностью
memory = ConversationSummaryBufferMemory(
llm=ChatOpenAI(model="gpt-4o-mini"),
max_token_limit=1000,
return_messages=True,
)
Векторная долгосрочная память
class LongTermMemory:
def __init__(self, user_id: str, vectorstore: VectorStore):
self.user_id = user_id
self.vectorstore = vectorstore
def remember(self, fact: str, importance: float = 0.5):
"""Сохраняет факт с метаданными"""
self.vectorstore.add_texts(
[fact],
metadatas=[{"user_id": self.user_id, "timestamp": datetime.now().isoformat()}]
)
def recall(self, query: str, k: int = 5) -> list[str]:
"""Извлекает релевантные воспоминания по запросу"""
docs = self.vectorstore.similarity_search(
query, k=k,
filter={"user_id": self.user_id}
)
return [doc.page_content for doc in docs]
Что стоит запоминать
Факты о пользователе: имя, должность, компания, город, предпочтения
Бизнес-контекст: текущие проекты, предыдущие запросы, принятые решения
Предпочтения взаимодействия: уровень детализации ответов, предпочитаемый язык, формат (списки vs абзацы)
Не запоминать: чувствительные данные (пароли, платёжные данные), временные состояния текущей задачи
Privacy и право на забвение
Пользователь должен иметь возможность: просмотреть, что бот помнит о нём; удалить конкретные воспоминания или все; отказаться от сохранения памяти. Команда /my_data и /forget_me как обязательные в production системах.







