Память ИИ-агента: от эпизодов к знаниям
Проблема: свалка вместо памяти
Агент успешно забронировал билет: нашёл рейс, сравнил варианты, применил политику поездок. Что запомнить? Очевидный ответ: всё. Вложить в вектор разговор, вызовы инструментов, ответ, скриншоты, предпочтения, документы. Получается дорогая свалка.
Проблема не в том, что хранится мало. Разные по смыслу вещи обрабатываются так, будто выполняют одну работу:
- предпочтение места — не история последнего бронирования;
- политика возврата — не последовательность шагов возврата;
- черновик агента — вообще не знание.
В одном пуле поиск даёт много похожего, но без сигнала, что это значит и насколько этому верить. Это «хранилище с поисковой строкой», а не память.
Четыре типа памяти
Названия взяты из когнитивной науки. У аналогии есть пределы (см. раздел ниже), но типы полезны: у каждого свои хранение, поиск, обновление и срок жизни.
Рабочая память (working)
Текущее рабочее место: цель, план, последние ответы инструментов, нерешённые вопросы. Для агента-бронировщика: маршрут, три тарифа в сравнении, проверка, которая ещё не закончена.
Должна быть маленькой, релевантной и одноразовой. Не путать с контекстным окном: окно — где информация может появиться, а рабочая память — решение, что сейчас заслуживает места в нём. Если держать все старые сообщения, агент не становится информированнее, его проще отвлечь.
маленькаяодноразоваяистекаетЭпизодическая память (episodic)
Конкретные прошлые события и их структура: цель, контекст, последовательность действий, наблюдения, итог.
Это прецедент, и только. Из него не следует, что пользователь отвергает все дешёвые тарифы. Здесь простая векторная база опаснее всего: сходство текста находит старый опыт, но не говорит, как его трактовать.
событиепрецедентне правилоСемантическая память (semantic)
Факты, связи и предпочтения, которые живут дольше эпизода, породившего их: «пользователь любит место у прохода», «перелёты дороже 800 долларов требуют согласования», «ORD — аэропорт О'Хара».
Одного текста мало. В боевых системах для каждого факта нужны происхождение, уверенность, область действия и свежесть. «Любит проход» из одной фразы и из десяти бронирований — разные вещи. Без этих полей слабо подтверждённый факт становится таким же авторитетным, как сильный.
фактыисточникуверенностьсвежестьПроцедурная память (procedural)
Способы действовать: проверенные сценарии, ограничения, пороги согласования. Их не просто вспоминают, они прямо формируют план.
Ловушка: если каждая удачная траектория становится процедурой, то одна случайно удачная, пропустившая обязательный шаг, превратится в «доверенный сценарий». Эпизодическая память говорит, что было; процедурная определяет следующий шаг, и здесь обязательна проверка.
сценариипорогипроверка до записиКонтракт записи памяти
Основа — классификация. Любая запись получает явный тип и метаданные до записи, а не выводится при поиске:
{
"id": "mem_9f1a2c",
"type": "semantic",
"content": "Пользователь предпочитает место у прохода на рейсах дольше 3 часов.",
"scope": { "owner": "user_4821", "applies_to": "long_haul_flights" },
"provenance": {
"source": "episodic",
"derived_from": ["ep_7712", "ep_7810", "ep_8004"],
"extraction_method": "explicit_statement"
},
"confidence": 0.86,
"created_at": "2026-06-02T14:11:00Z",
"last_validated_at": "2026-07-19T09:00:00Z",
"expires_at": null,
"supersedes": null
}| Поле | Зачем |
|---|---|
| type | определяет правила записи, поиска и срока жизни |
| scope | чей это факт и где применим |
| provenance | откуда взято и как извлечено, основа для аудита |
| confidence | насколько можно доверять |
| created_at / last_validated_at / expires_at | свежесть и срок жизни |
| supersedes | какую запись заменяет, чтобы старое не мешало |
Маршрутизация: сначала куда, потом что
Нужен слой, который решает, где искать, прежде чем решать, что похоже. Плоское векторное хранилище этого не делает. Попробуй:
def retrieve(query, task_purpose, user_id):
# 1. Определяем, какие типы памяти нужны этой задаче
candidate_types = classify_purpose(task_purpose)
# "проверить политику багажа" -> ["semantic", "procedural"]
# "делал ли пользователь так раньше?" -> ["episodic"]
results = []
for mem_type in candidate_types:
hits = vector_search(query,
filter={"type": mem_type, "scope.owner": user_id}, top_k=8)
results.extend(hits)
# 2. Ранжируем внутри выбранного подмножества, а не во всей базе
return rank(results, weights={"relevance": 0.4, "confidence": 0.3,
"recency": 0.2, "scope_match": 0.1})Код не главное. Главное: «искать всё, а модель разберётся» заменяется на «классифицировать, искать внутри типа, ранжировать». Классификация происходит при записи и при поиске; поиск по сходству идёт только внутри уже ограниченного набора.
Как это ломается на практике
Единый индекс выглядит элегантно: одно хранилище и один интерфейс. Но сложность не исчезает, а переезжает в промпт: модель должна каждый раз гадать, что ей принесли — факт, анекдот, инструкцию, устаревшее предпочтение или догадку.
Пять принципов
Не нужно пять разных баз: разделение может быть логическим, а не физическим. Важен контракт.
1. Типизировать всё явно
Тип, происхождение, время, владелец, область, уверенность и срок рядом с содержанием. Не заставлять модель выводить тип потом.
2. Разные правила записи для разных типов
Рабочую пишем свободно и даём истекать. Эпизод логируем после значимого опыта. Семантические факты извлекаем с проверкой конфликтов. Процедуры повышаем после настоящей проверки. Чем сильнее запись влияет на будущие действия, тем труднее её записать навсегда.
3. Искать сначала по цели, потом по сходству
Решить, что нужно: прежний опыт, факт или утверждённая процедура. Искать внутри этого типа и ранжировать по релевантности, свежести, уверенности и области.
4. Явные пути повышения
Повторяющиеся эпизоды могут подтвердить семантическое предпочтение; несколько проверенных опытов дают кандидата в процедуры. Тихого повышения быть не должно.
5. Забывание как часть архитектуры
Временное истекает, устаревшие факты заменяются, неважные эпизоды архивируются, процедуры перепроверяются, просьбы пользователя об удалении выполняются. Больше хранилища — не значит больше памяти.
Где метафора ломается
Человеческая память консолидируется во сне, постепенно угасает и неточно восстанавливается при вспоминании. Память агента по умолчанию ничего этого не делает: каждая запись намеренная, каждое чтение — запрос, ничто не истекает, если архитектура этого не требует.
В этом и преимущество: можно навязать дисциплину, которой у мозга не было: у каждого факта источник, у каждой процедуры журнал, жёсткий срок вместо естественного забывания. Классификация полезна, а антропоморфизм за её пределами в основном мешает.
База данных — ещё не архитектура памяти
| Хранилище | Что делает хорошо |
|---|---|
| Векторная база | находит похожие эпизоды |
| Граф | сущности и связи в семантической памяти |
| Реляционная база | версии процедур с историей изменений |
Ни одна из них сама не решает, чем является событие: прецедентом, фактом, процедурой или шумом. Это задача слоя сверху: классификация, правила записи, маршрутизация поиска, проверка, повышение, забывание. Агенту нужна не одна большая память, а нужное воспоминание в нужный момент с нужным уровнем авторитета. И когда что-то пошло не так, нужно понять, что подвело: опыт, факт, процедура или текущее состояние.
Открытый вопрос
Положить правильное в правильную корзину — половина задачи. Труднее другое: какие воспоминания заслуживают стать знанием? Верный вывод может прийти из чистой траектории, исправленной ошибки или удачной догадки, и если система их не различает, даже хорошая архитектура сохранит неправильные уроки. Память нужно оценивать, прежде чем она станет знанием. Этому автор обещает посвятить следующую часть.
Применить у себя (моя интерпретация)
| Тип по статье | Что это в системе агента (гипотеза) |
|---|---|
| Рабочая | контекст текущей сессии и _progress.md |
| Эпизодическая | дневники memory/ГГГГ-ММ-ДД.md |
| Семантическая | MEMORY.md, GOALS.md, knowledge/ |
| Процедурная | скиллы, правила в CLAUDE.md, ROLE.md |
Вопросы, которые стоит проверить:
- У фактов в
MEMORY.mdесть дата и источник, или они «просто там лежат»? - Как устаревший факт убирается? Есть ли срок жизни?
- Отделено ли временное от утверждённого (например, гипотезы в
HYPOTHESES.mdот решений)? - Как запись из дневника попадает в
MEMORY.md: есть явный путь «эпизод → факт» или это происходит тихо? - Не попадают ли в скиллы и правила удачные случайности без проверки?