TL;DR
Эпизодическая память (EpMem) — техника, которая учит LLM на прошлых ответах через рефлексии. Модель отвечает на вопросы, сравнивает свои ответы с правильными, генерирует рефлексию "что пошло не так", сохраняет эти примеры и использует их как контекст для будущих похожих вопросов.
LLM плохо понимает границы своего знания — она не знает что она не знает. Особенно это видно в длинных диалогах: модель путает временные рамки (забывает даты разговоров), додумывает информацию там где её нет, неточно соединяет факты из разных частей беседы. При этом простое накопление всего контекста в промпте тратит 20,000+ токенов на запрос и всё равно даёт сбои.
EpMem решает через цикл: ответ → оценка → рефлексия → запоминание. Модель отвечает на первую порцию вопросов, видит где ошиблась, пишет на естественном языке "почему ошибка" и "как правильно", сохраняет эти кейсы. Когда приходит новый вопрос — достаёт 3 самых похожих примера с рефлексиями и использует как few-shot. Снижает использование токенов на 90% (с 23,000 до 1,000), повышает точность и учит модель говорить "нет информации" вместо галлюцинаций.
Схема метода
ЦИКЛ ОБУЧЕНИЯ (на первой порции вопросов):
ШАГ 1: Ответ → получи топ-10 релевантных фрагментов диалога, ответь на вопрос
ШАГ 2: Оценка → сравни ответ с правильным, посчитай F1-score
ШАГ 3: Рефлексия → проанализируй ошибку, опиши причину и как избежать
ШАГ 4: Сохранение → запиши {вопрос, контекст, ответ, правильный ответ, рефлексия}
ПРИМЕНЕНИЕ (на новых вопросах):
ШАГ 1: Поиск → найди топ-3 похожих кейса из памяти
ШАГ 2: Контекст → добавь их как примеры в промпт
ШАГ 3: Ответ → используй примеры и рефлексии для ответа
Цикл обучения и применение — это отдельные запросы к модели.
Пример применения
Задача: Ты ведёшь переписку с клиентом в CRM месяцами — обсуждаете проект, правки, оплаты, дедлайны. 300+ сообщений за полгода. Клиент спрашивает: "А мы обсуждали вариант с видео-отзывами?" Нужен точный ответ из истории, не галлюцинация.
Промпт для создания эпизодической памяти (первая итерация):
Ты помогаешь мне отвечать на вопросы клиента по нашей переписке.
Вот 5 вопросов и фрагменты переписки:
[Вопрос 1]: Когда клиент впервые упомянул бюджет?
[Контекст]: {топ-10 релевантных сообщений}
[Твой ответ]: "В начале марта"
[Правильный ответ]: "12 марта, в сообщении про согласование ТЗ"
[Вопрос 2]: Обсуждали ли мы скидку за предоплату?
[Контекст]: {топ-10 релевантных сообщений}
[Твой ответ]: "Да, 10%"
[Правильный ответ]: "Нет информации"
...ещё 3 вопроса...
Для каждого вопроса проанализируй:
- Правильно ли ты ответил и почему?
- Если вопрос про дату — правильно ли понял временную привязку?
- Если информации не было — правильно ли сказал "нет информации"?
- Какую ошибку допустил и как избежать в будущем?
Напиши короткую рефлексию (2-3 предложения) для каждого.
Промпт для применения памяти:
Ответь на вопрос клиента, используя фрагменты переписки и прошлые примеры.
ПРИМЕРЫ ИЗ ПРОШЛОГО:
[Пример 1]
Вопрос: Когда клиент впервые упомянул бюджет?
Контекст: {сообщения}
Правильный ответ: "12 марта, в сообщении про согласование ТЗ"
Мой ответ: "В начале марта"
Рефлексия: "Я дал приблизительный ответ вместо точной даты. Нужно использовать конкретную дату из сообщения, если она есть."
[Пример 2]
Вопрос: Обсуждали ли мы скидку за предоплату?
Правильный ответ: "Нет информации"
Мой ответ: "Да, 10%"
Рефлексия: "Я додумал информацию которой не было в переписке. Если тема не упоминалась — честно сказать 'нет информации', не додумывать."
[Пример 3]
Вопрос: Какие правки клиент просил во втором этапе?
Правильный ответ: "Изменить цвета кнопок и убрать лишние блоки"
Мой ответ: "Изменить дизайн"
Рефлексия: "Ответ слишком общий. Нужно называть конкретные правки из сообщений."
ТЕКУЩИЙ ВОПРОС:
Вопрос: {вопрос клиента}
Фрагменты переписки: {топ-10 релевантных сообщений}
Используй прошлые рефлексии. Если информации нет — скажи "нет информации". Если есть дата — укажи точную. Ответ должен быть точным цитированием из переписки.
Ответ:
Результат: Модель увидит паттерны из прошлых ошибок: не додумывать, использовать точные даты, цитировать конкретику. В ответе будет либо точная фраза из переписки, либо честное "нет информации" — без галлюцинаций.
Почему это работает
LLM генерирует текст по паттернам, не "вспоминает факты". Длинный контекст = больше паттернов, больше шума, больше путаницы. Особенно в диалогах с временной структурой ("когда обсуждали X") или там где нужно сказать "не знаю" вместо догадки.
Сильная сторона LLM — обучение через примеры (few-shot learning). Если показать модели "вот как выглядит правильный ответ" и "вот типичная ошибка", она подстроится под паттерн. Рефлексия добавляет мета-уровень: модель видит не просто "правильно/неправильно", а почему неправильно.
EpMem использует это так: вместо 20,000 токенов всей истории даём 3 кейса с рефлексиями (~1,000 токенов). Модель видит контекст ошибки ("додумал факт"), рефлексию ("не додумывай"), правильный ответ ("нет информации"). Это обучает паттерн: когда семантически похожий вопрос, применить похожую стратегию ответа.
Особенность adversarial questions (вопросы без ответа в контексте): они семантически похожи на реальные темы диалога. Например, "Обсуждали ли мы скидку за предоплату?" может быть похожа на "Обсуждали ли мы условия оплаты?" — но первого не было. Простой RAG вытащит "условия оплаты" как релевантное → модель скажет "да". Рефлексия учит: "если точной темы нет — скажи нет, не экстраполируй".
Рычаги управления:
- Количество примеров (сейчас 3) → увеличь до 5 для более сложных задач, уменьши до 1 для экономии токенов
- Первая порция вопросов → выбери самые типичные ошибки, чтобы рефлексии покрывали разные типы сбоев
- Структура рефлексии → укажи конкретный фокус: "анализируй только временные ошибки" или "фокус на галлюцинации"
- Метрика похожести → используй семантический поиск или категориальный (тип вопроса: дата/факт/нет ответа)
Шаблон промпта
Создание эпизодической памяти (цикл обучения):
Ты отвечаешь на вопросы по {тип контекста: диалогу/документу/истории}.
Вот {количество} примеров твоих ответов:
{вопрос}: {вопрос}
{контекст}: {релевантные фрагменты}
{твой_ответ}: {твой ответ}
{правильный_ответ}: {эталонный ответ}
...ещё примеры...
Для каждого проанализируй:
- Правильно ли ответил? Почему?
- Если вопрос требовал {специфика: точной даты/фактов/отсутствия инфо} — как справился?
- Какую ошибку допустил?
- Как избежать в будущем?
Напиши короткую рефлексию для каждого (2-3 предложения).
Сохрани каждый набор {вопрос, контекст, твой_ответ, правильный_ответ, рефлексия} в память.
Применение памяти:
Ответь на вопрос, используя {тип контекста} и прошлые примеры.
ПРИМЕРЫ ИЗ ПРОШЛОГО:
{топ-3 похожих кейса с рефлексиями в формате:
Вопрос: ...
Контекст: ...
Правильный ответ: ...
Мой ответ: ...
Рефлексия: ...}
ТЕКУЩИЙ ВОПРОС:
Вопрос: {новый вопрос}
Контекст: {релевантные фрагменты}
Используй рефлексии из примеров. {Правила ответа: точные цитаты/даты/нет информации}.
Ответ:
Плейсхолдеры:
{тип контекста}— диалог, документ, история переписки{количество}— 5-10 примеров для первого цикла{специфика}— что важно для задачи (даты, факты, отсутствие информации){правила ответа}— как должен выглядеть ответ (цитаты, своими словами, формат){релевантные фрагменты}— контекст из RAG или ручного отбора
🚀 Быстрый старт — вставь в чат:
Вот шаблон эпизодической памяти для LLM. Адаптируй под мою задачу: [опиши свою задачу — например: "отвечать на вопросы клиента по истории проекта" или "анализировать встречи команды за полгода"].
Задавай вопросы, чтобы заполнить поля: какой контекст, какие типичные вопросы, какие специфические требования к ответам.
[вставить шаблон выше]
LLM спросит про источник контекста (диалог/документы), типы вопросов (факты/даты/мнения), формат ответов (цитаты/краткость/детали) — потому что EpMem работает лучше когда рефлексии настроены под специфику задачи. Она возьмёт структуру "вопрос → ответ → рефлексия" и адаптирует под твой кейс.
Ограничения
⚠️ Синтетический датасет: Исследование на синтетических диалогах, не на реальных. Реальные диалоги с шумом, опечатками, неоднозначностью могут показать другие результаты.
⚠️ Workflow из нескольких запросов: Нужно сначала создать память (цикл обучения), потом применять. Это несколько запросов к модели, не одноходовка.
⚠️ Требует эталонных ответов для обучения: Чтобы создать рефлексии, нужны правильные ответы. Если их нет — метод не работает. Подходит для задач где можно проверить первые N ответов вручную.
⚠️ Лучше для сильных моделей: На маленьких базовых моделях (Llama 3B base, Mistral 7B base) EpMem не даёт улучшений. Работает на инструкт-моделях (GPT-4o mini, Llama/Qwen Instruct) которые понимают structured output и рефлексию.
⚠️ Не для простых задач: Если вопросы simple one-hop ("столица Франции"), накладные расходы на рефлексии не оправданы. Метод для сложных multi-hop, temporal и adversarial вопросов.
⚠️ Может переобучиться на "нет информации": Если в первой порции много adversarial вопросов, модель может начать чаще говорить "нет информации" даже там где ответ есть (пример: Qwen с PromptOpt + EpMem).
Как исследовали
Исследователи взяли бенчмарк LoCoMo — 10 синтетических диалогов по 300+ turns каждый (~9,000 токенов, 35 сессий, охватывают месяцы). Вопросы размечены на 5 категорий: single-hop (простые факты), multi-hop (соединить информацию из разных частей), temporal (про даты и время), open-domain (общие знания), adversarial (ответа нет в диалоге).
Протестировали на маленьких open-weight моделях (Llama 3.2-3B, Mistral 7B, Qwen 2.5-7B) + их instruct-версиях + GPT-4o mini. Сравнили 6 подходов:
- Full Context — весь диалог в промпт (baseline, 23,000 токенов)
- RAG — топ-10 фрагментов через семантический поиск (650 токенов)
- A-Mem — агентная память с тегами и связями (3,300 токенов)
- RAG + PromptOpt — RAG + оптимизация промпта через фидбек
- RAG + EpMem — RAG + эпизодическая память с рефлексиями
- RAG + PromptOpt + EpMem — всё вместе
Первый диалог (199 вопросов) использовали для создания памяти (генерация рефлексий, оптимизация промптов), остальные 9 диалогов (1,787 вопросов) — для оценки. Метрика — F1-score (точность ответа), плюс среднее количество токенов на запрос.
Что удивило:
- Full Context не лучший — казалось бы, весь контекст = максимум информации, но модели путаются в 20k+ токенов, особенно в multi-hop и temporal вопросах ("lost in the middle" эффект).
- RAG + EpMem обходит Full Context на сильных моделях при 90% экономии токенов — значит дело не в объёме контекста, а в качестве и структуре.
- Adversarial вопросы (нет ответа в диалоге) — Full Context галлюцинирует (26-52% F1), RAG + EpMem говорит "нет информации" (68-95% F1). Это показывает: эпизодическая память учит модель метапознанию — знать что она не знает.
Инсайт для практики: Если твоя задача требует честности ("не знаю" вместо догадок), adversarial примеры в первой порции обучения критичны. Модель увидит паттерн "похоже на тему, но точного факта нет → скажи нет информации" и перенесёт его на новые кейсы.
Почему пришли к таким выводам: Рефлексия даёт модели мета-контекст — не просто "что правильно", а "почему я ошибся". Это мощнее чем просто few-shot примеры. Модель генерирует рефлексии в духе: "Я дал приблизительный ответ вместо точной даты — нужно использовать конкретную дату из текста" или "Я додумал информацию которой не было — если тема не упоминалась, честно сказать 'нет информации'". Когда эти рефлексии попадают в контекст нового вопроса — модель подстраивается под паттерн.
Оригинал из исследования
Контекст: Промпт для создания рефлексии (Reflection Step) из статьи.
Reflect on your performance in the following QA example. Focus specifically on:
- Whether your answer was correct or not, and why.
- If the question required temporal reasoning, how well you handled it.
- If the question had no answer in the context, whether you correctly identified that.
- What reasoning errors (if any) occurred, and how to avoid them in future similar cases.
Provide a short reflection in a few sentences.
Question: {question}
Context: {top-10 retrieved utterances}
Correct Answer: {label}
Predicted Answer: {prediction}
Reflection:
Контекст: Промпт для применения эпизодической памяти (QA Step).
You are an AI assistant that answers questions based on a given conversation. Use the current context and optionally refer to past examples and reflections to help you reason, but focus on the current question.
Based on the given conversation snippets, write a short answer for the following question in a few words. Do not write complete and lengthy sentences. Answer with exact words from the conversations whenever possible. Use the following examples to answer correctly.
Examples: {top-3 most similar episodic memories with reflections}
Below are retrieved snippets from a conversation between two people.
{top-10 retrieved utterances}
Question: {query}
Now, answer the current question using the conversation context above. Refer to the past examples and reflections only if they help clarify your reasoning. If the answer to the question requires you to do temporal reasoning, use DATE of CONVERSATION to answer with an approximate date. If the question cannot be answered, write 'No information available'.
Answer:
Адаптации и экстраполяции
💡 Адаптация для анализа customer success переписки:
Если ты customer success менеджер и ведёшь клиента месяцами — обсуждаете интеграцию, баги, фичи, апсейлы. Нужно быстро найти: "Когда клиент жаловался на медленную загрузку?" или "Обсуждали ли мы API для экспорта данных?"
Создай эпизодическую память для переписки с клиентом {название компании}.
Первые 10 вопросов с правильными ответами (проверь сам):
1. Когда клиент впервые упомянул интеграцию с Salesforce?
Правильный ответ: {дата, сообщение}
2. Обсуждали ли скидку за годовой план?
Правильный ответ: {да/нет, детали}
...
Для каждого:
- Дай контекст из переписки (топ-10 релевантных сообщений)
- Ответь
- Сравни с правильным
- Напиши рефлексию: где ошибка, почему, как избежать
Сохрани рефлексии. При новых вопросах клиента — используй 3 самых похожих примера как контекст.
Эффект: Честные ответы "нет информации" вместо додумывания, точные даты вместо "где-то в марте", конкретика вместо общих фраз.
🔧 Техника: Убрать структуру рефлексии → видеть свободное мышление модели
Оригинальный промпт задаёт чёткую структуру рефлексии ("Focus specifically on: ..."). Если убрать структуру:
Reflect on your performance in this QA example. Why did you answer this way? What went wrong or right?
Question: {question}
Context: {context}
Correct Answer: {label}
Predicted Answer: {prediction}
Reflection:
Эффект: Модель пишет рефлексии своими словами, может заметить паттерны которые не вписываются в заданную структуру. Полезно для исследования типов ошибок на старте.
🔧 Техника: Разные типы рефлексий для разных категорий вопросов
Вместо одной рефлексии для всех, создай специализированные наборы памяти:
НАБОР 1: Temporal Questions (вопросы про даты)
Рефлексии фокусируются на: точность дат, разница между "примерно" и "точно", использование DATE of CONVERSATION.
НАБОР 2: Adversarial Questions (вопросов без ответа)
Рефлексии фокусируются на: когда сказать "нет информации", как отличить "похожая тема" от "точный факт", не додумывать.
НАБОР 3: Multi-hop Questions (соединение фактов)
Рефлексии фокусируются на: как связывать информацию из разных частей, не терять промежуточные шаги.
При новом вопросе — определи категорию (можно попросить LLM) → достань примеры из соответствующего набора.
Эффект: Более точные рефлексии для каждого типа задачи, меньше generic советов "будь точнее".
💡 Экстраполяция: EpMem + Self-Consistency для снижения галлюцинаций
Комбинируй эпизодическую память с self-consistency (генерация нескольких ответов, выбор консенсуса):
Ты отвечаешь на вопрос используя {контекст} и прошлые рефлексии.
ПРИМЕРЫ: {топ-3 рефлексии}
КОНТЕКСТ: {релевантные фрагменты}
ВОПРОС: {вопрос}
Сгенерируй 3 разных ответа:
Ответ 1:
Ответ 2:
Ответ 3:
Теперь проанализируй:
- Какие ответы согласуются?
- Какие противоречат?
- Если все 3 говорят "нет информации" → скорее всего правда нет
- Если 2 из 3 одинаковы → вероятно правильный
- Если все 3 разные → не уверен, скажи "нет информации"
Финальный ответ:
Эффект: Снижение галлюцинаций через внутреннюю проверку. Если модель в 3 вариантах додумывает разное — признак галлюцинации. Если 3 раза говорит одно — больше уверенности.
Ресурсы
Evaluating Long-Term Memory for Long-Context Question Answering (arXiv:2504.XXXXX) — Alessandra Terranova, Björn Ross, Alexandra Birch, School of Informatics, University of Edinburgh
LoCoMo benchmark — Maharana et al., 2024. Benchmark длинных диалогов для QA.
Reflexion (Shinn et al., 2023) — Language agents with verbal reinforcement learning. Базовая идея рефлексий для LLM.
ExpeL (Zhao et al., 2024) — Experiential Learning framework. LLM agents learn from experience without gradient updates.
A-Mem (Xu et al., 2025) — Agentic semantic memory system with contextual tags and dynamic links.
