Memory Write Policy

Память делает ошибки долговечными: неверная запись переживает исходный запуск и всплывает через недели в другом контексте. Поэтому путь записи в память — чувствительный путь записи, а не удобная автоматика.

Суть

Разница между ошибкой в ответе и ошибкой в памяти — во времени жизни. Плохой ответ виден сразу и стоит одного запуска. Плохая запись невидима, участвует в десятках следующих ответов и к моменту обнаружения уже не восстанавливается по одной трассе.

Типичная механика отказа: пользователь однажды написал «не тратьте время на уточнения, сразу эскалируйте», агент сохранил это как устойчивое предпочтение — и через две недели, когда ситуация требовала как раз уточнения, уверенно эскалировал.

Самый опасный путь — запись в горячем пути

Модель ответила, рантайм тут же вызывает сохранение в память. На короткой дистанции выглядит красиво. Системные проблемы этого пути:

  • запись происходит под давлением задержки, поэтому проверять некогда;
  • никто не валидирует, что вообще достойно сохранения;
  • нет шага нормализации и удаления лишнего;
  • нет отдельной политики изоляции арендаторов;
  • потом невозможно объяснить, почему факт оказался в памяти.

Скучное правило, которое это закрывает: запись в долговременную память по умолчанию либо явно разрешена политикой, либо вынесена в фоновый конвейер (Context Compaction).

В горячем пути разумно оставить минимальное состояние сессии, короткие рабочие заметки, временные записи с понятным сроком жизни и то обновление, без которого текущий процесс действительно ломается.

Хорошая память пишет меньше, чем хочется

Отбор важнее объёма. В память стоит писать только то, что пригодится в будущих запусках, имеет понятного владельца и арендатора, объяснимо человеку, не тащит лишних чувствительных данных и не превращает подсказку в свалку.

Проверка перед каждой записью формулируется одним вопросом:

Если этот фрагмент всплывёт через три недели в другом контексте, мне будет комфортно объяснить, почему он здесь?

Неуверенный ответ означает, что запись не нужна.

Но «меньше» — не та ось для рабочих артефактов

Правило строгого отбора верно для профильной памяти и проверенных фактов: там лишняя запись переживает запуск и начинает влиять на решения. Для объёмных рабочих данных ось другая — не «сколько писать», а «что именно хранить».

Кейс из Agent Memory: наивный агент-химик израсходовал 20 млн токенов там, где агент с указателями обошёлся 1234 — разница около 16 000×. Экономия достигнута не отказом от записи, а тем, что в контексте остался короткий идентификатор, а содержимое ушло во внешнее хранилище и подтягивается по запросу.

Отсюда уточнение к правилу: перед тем как решать «писать или нет», стоит проверить третий вариант — записать ссылку. Он снимает главное возражение против записи (раздувание подсказки), сохраняя доступность данных, и потому для результатов инструментов, длинных документов и промежуточных артефактов почти всегда предпочтительнее обеих крайностей (Context Compaction).

Минимальная политика

memory:
  allowed_kinds:
    - profile_preference
    - validated_fact
    - session_summary
  deny_sources:
    - raw_user_prompt
    - external_html
    - unvalidated_tool_output
  require_tenant_id: true
  reject_if_contains:
    - secrets
    - access_tokens
    - payment_card_data
  write_mode:
    profile_preference: background_review
    validated_fact: immediate_if_trusted
    session_summary: background_only

Ценность не в «уме» правил, а в том, что они видимы и поддаются аудиту. Обратите внимание на deny_sources: сырой пользовательский промпт и непроверенный вывод инструмента запрещены как источники — именно они дают большинство плохих записей.

Правила чтения и записи почти никогда не совпадают

Если развести только хранилище, но не пути, система скатывается в странную логику: всё, что однажды записалось, потом читается почти откуда угодно.

Разведение выглядит так:

  • запись в долговременную память требует проверки, происхождения и фонового разбора;
  • чтение из неё разрешено только через фильтры извлечения (Agent Retrieval Policy);
  • запись в профильную память требует явного сигнала или высокой уверенности;
  • чтение профильной памяти разрешено слою персонализации, но не движку политик (Agent Control Plane).

Последняя строка — самая важная: если непроверенная память участвует в решении политики, персонализация превращается в канал влияния на права.

Происхождение хранится по умолчанию

Для каждой записи, живущей дольше одного запуска, минимальный набор полей: source_type, source_id, writer_identity, tenant_id, written_at, confidence или validation_state.

Выглядит бюрократией ровно до первого спора о том, откуда взялся «факт», который агент уверенно повторил в другом контексте.

Импорт сначала staged, потом durable

Чужой каталог памяти, transcript или backup не должен сразу попадать в автоматический context injection. Безопасный путь: импортировать во временную область, показать preview с provenance, проверить tenant/чувствительные данные и только затем явно повысить записи до durable. До promotion они доступны разбору, но не влияют на обычные ответы.

Тот же provenance ограничивает обещание «забыть». Система может надёжно удалить записи и производные, для которых сохранилась lineage; она не может честно гарантировать удаление копий без происхождения, внешних backup и уже экспортированных данных. Поэтому forget возвращает область выполненного удаления и известные остаточные границы, а не безусловное «всё забыто».

Связано с

  • Agent Memory — какие вообще бывают виды памяти
  • Memory Poisoning — что происходит, когда политика записи отсутствует
  • Memory Boundaries — разные слои с разными правилами
  • Context Compaction — фоновый конвейер, куда выносится запись
  • Agent Retrieval Policy — фильтры на чтении
  • Agent Control Plane — почему память не должна влиять на решения политики
  • Multi Tenancy AI — изоляция арендаторов в записи
  • Mem0 — внешний слой, извлекающий факты из диалога