Загрузка...

Agent Memory (память ИИ-агента): что это и как агенты помнят между сессиями

Agent Memory (память ИИ-агента) — механизм, который сохраняет состояние агента между сессиями: факты о пользователе, принятые решения, состояние задачи. В отличие от контекстного окна, которое живёт только в пределах одного запроса, память хранится во внешнем хранилище и подгружается в контекст, когда она нужна.

Модель сама ничего не помнит: каждый запрос к API начинается с чистого листа, а контекстное окно ограничено. Поэтому ИИ-агент без памяти в каждой сессии заново изучает проект, переспрашивает договорённости и перечитывает код. Память убирает эту «слепоту между сессиями»: агент начинает работу с готовыми заметками. В документации Claude Code это описано прямо: каждая сессия начинается с чистого контекстного окна, а знания между сессиями переносят два механизма — файлы CLAUDE.md и auto memory.

Виды памяти

  • Кратковременная — история диалога и промпт в пределах одной сессии. Исчезает вместе с контекстом.
  • Рабочая (scratchpad) — черновик агента для текущей задачи: план, промежуточные выводы, список шагов. В Letta для этого заводят отдельный блок памяти.
  • Долговременная — хранится вне контекста: файлы-заметки, векторная база, git-репозиторий. Делится на два подвида:
    • эпизодическая — что происходило: конкретные сессии, действия, ошибки;
    • семантическая — что известно: факты о пользователе, проекте, предпочтениях.

Как это работает

У конкретных продуктов реализация отличается, но общий цикл похож:

  1. Извлечение. Агент или отдельный процесс выделяет из диалога и вызовов инструментов то, что стоит запомнить: решение, поправку пользователя, предпочтение.
  2. Запись. Факт сохраняется в хранилище: строкой в файле, записью в базе или вектором эмбеддинга.
  3. Консолидация. История сжимается: похожие записи объединяются, длинные сессии превращаются в краткие сводки (суммаризация).
  4. Поиск при чтении. В начале сессии подгружается индекс заметок, а детали достаются по запросу — по ключевым словам или по сходству эмбеддингов (ретрив).
  5. Забывание. Устаревшее и дублирующее удаляется или помечается. Без этого шага память разрастается, а старые факты начинают противоречить новым.

Как это выглядит в продуктах

  • Claude Code. Постоянные инструкции лежат в CLAUDE.md — его пишет человек. Кроме того, Claude Code ведёт auto memory: заметки о ваших поправках и предпочтениях сохраняются в ~/.claude/projects/<project>/memory/, а индекс MEMORY.md загружается в начале каждой сессии (первые 200 строк или 25 КБ).
  • claude-mem. Плагин для Claude Code: хуки жизненного цикла фиксируют наблюдения о работе агента, сводки хранятся в SQLite, а поиск идёт гибридно, с векторной базой Chroma. Чтобы не раздувать контекст, поиск устроен в три шага: компактный индекс (search), хронология (timeline) и полные записи только по отобранным id (get_observations). Чувствительный текст можно исключить из хранилища тегом <private>.
  • Letta. Блоки памяти (memory blocks) — структурированные секции контекста с полями label, description, value и limit; они всегда видны модели. Отдельно есть archival memory — хранилище с семантическим поиском, к которому агент обращается через инструменты. В новых версиях Letta переходит на MemFS — память в виде git-репозитория, которую агент правит обычными файловыми инструментами; фоновая «консолидация» (dreaming) обновляет её без участия пользователя.
  • nanobot. Долговременные факты лежат в рабочей папке: memory/MEMORY.md и memory/history.jsonl, недавняя переписка — в базе сессий. Периодическая задача Dream читает накопленную историю и обновляет память.
  • Memory tool у Anthropic. Модель создаёт, читает, обновляет и удаляет файлы в каталоге /memories; путь — это префикс, который ваш обработчик сопоставляет с реальным хранилищем: папкой, базой или ключами.

Риски

  • Приватность. Память хранит данные пользователя, поэтому важно знать, где она лежит (локально или в облаке) и можно ли исключить чувствительное.
  • Рост контекста и цены. Всё, что подгружено из памяти, оплачивается как входные токены в каждом запросе. Подробнее — в статье про расчёт стоимости токенов.
  • Залипание на устаревших фактах. Агент уверенно опирается на запись, которая давно неверна. Помогают даты в записях, ревизия и удаление.
  • Промпт-инъекции через память. Если в заметку попал текст из недоверенного источника (веб-страница, письмо), он вернётся в контекст как инструкция. Записи из внешних источников стоит помечать и проверять.

Отличие от RAG, дообучения и кэширования

  Память агента RAG Дообучение (fine-tuning) Prompt caching
Что это заметки и состояние самого агента поиск по внешней базе знаний изменение весов модели повторное использование обработанного префикса промпта
Что хранит факты о пользователе, решения, прогресс задачи документы, статьи, код навыки и стиль, зашитые в модель ничего нового: только ускоряет и удешевляет повтор
Кто пополняет сам агент по ходу работы разработчик, индексируя источники разработчик, обучением не пополняется
Обновляется в любой момент, записью в файл или базу переиндексацией только новым обучением на время жизни кэша

Память и RAG часто используют общую технику (эмбеддинги, поиск по сходству), но решают разные задачи: RAG отвечает «что написано в документах», память — «что мы уже обсуждали и решили».

Память и RouterAI

Память живёт на стороне клиента: в файлах, базе или самом инструменте. RouterAI в её хранении не участвует и по-прежнему принимает обычные запросы к OpenAI-совместимому API https://routerai.ru/api/v1 (или Anthropic Messages API https://routerai.ru/api). Это означает, что заметки можно подставлять в промпт и работать с любой моделью из каталога, меняя её без потери памяти. Оплата идёт за токены, включая подгруженные заметки; работа из России без VPN, оплата в рублях.

from pathlib import Path
from openai import OpenAI

client = OpenAI(
    base_url="https://routerai.ru/api/v1",
    api_key="sk-xxxxxxxxxxxxxxxx",
)

memory = Path("MEMORY.md").read_text(encoding="utf-8")

resp = client.chat.completions.create(
    model="anthropic/claude-sonnet-5.5",
    messages=[
        {"role": "system", "content": f"Заметки о проекте: {memory}"},
        {"role": "user", "content": "Продолжим с того места, где остановились."},
    ],
)
print(resp.choices[0].message.content)

Обновление заметок после сессии — отдельный вызов: можно поручить его более дешёвой модели из каталога, например anthropic/claude-haiku-5.5. Стоимость зависит от модели и объёма заметок.

Связанные термины

Что почитать