← Context engineering: beyond the prompt
03 / 07 · 50 min

Retrieval, memory, and state

Three external sources of context: hybrid search and contextual retrieval, memory notes beyond the window, and structured task state.

Lesson content is currently available in Russian.

What you will learn

  • →Разводить знания по слоям: retrieval, долговременная память и состояние текущей задачи.
  • →Применять гибридный поиск и contextual retrieval вместо чисто векторного.
  • →Проектировать схему памяти и структурированный блок состояния для агента.

Три источника: у каждого свой жизненный цикл

Когда окно перестаёт вмещать всё нужное, контекст приходится хранить снаружи и подгружать выборочно. Здесь важно не смешивать три принципиально разных слоя. Retrieval — это знания корпуса: документация, база статей, кодовая база. Они велики, меняются независимо от диалога и подтягиваются по запросу. Память — это факты, пережившие сессию: предпочтения пользователя, принятые в проекте решения, «грабли», на которые уже наступали. Состояние — рабочая тетрадь текущей задачи: цель, что сделано, что осталось, что заблокировано; оно живёт ровно столько, сколько задача.

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

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

Retrieval: гибрид, contextual retrieval и агентный поиск

Чисто векторный поиск — плохой дефолт. Эмбеддинги ловят смысловую близость, но промахиваются на точных идентификаторах: код ошибки TS-2345, артикул, имя функции. Поэтому продакшен-стандарт — гибрид: BM25 по ключевым словам плюс векторный поиск, результаты сливаются и переранжируются. Вторая проблема — чанки теряют контекст: фрагмент «выручка выросла на 3%» бесполезен, если непонятно, чья выручка и за какой квартал.

Contextual retrieval от Anthropic решает это так: перед индексацией каждому чанку моделью дописывается короткая справка на 50–100 токенов — из какого документа фрагмент и что он описывает. По измерениям Anthropic, контекстные эмбеддинги вместе с контекстным BM25 сокращают долю неудачных извлечений на 49%, а с добавлением реранкинга — на 67%. Дешевизну обеспечивает prompt caching: документ кладётся в кэш один раз, а справки для всех его чанков генерируются чтениями из кэша.

Третий подход — агентный поиск: модель сама ищет через инструменты (grep, glob, чтение файла по пути), как это делает Claude Code. Он медленнее и жжёт токены на навигацию, зато не требует индекса, не протухает и точен для кода. Практичная стратегия — комбинировать: быстрый семантический поиск для «куда смотреть», агентное дочитывание для «что там точно написано».

Память: заметки за пределами окна

Идею памяти как «подкачки» популяризировал MemGPT: у агента есть основной контекст (окно) и внешнее хранилище, а перенос между ними — явные операции, как paging в операционной системе. На практике самая живучая реализация — обычные файлы: MEMORY.md или каталог заметок, которые агент читает при старте сессии и пополняет по ходу работы. Файлы прозрачны, версионируются в git и не требуют инфраструктуры.

Главный вопрос памяти — не «как хранить», а «что писать». Хорошо переживают сессию: принятые решения с обоснованием («выбрали Fastify, потому что…»), инварианты проекта («порт 8788, не 3000»), предпочтения пользователя, повторяющиеся грабли. Плохо: сырые логи, полные транскрипты диалогов, всё, что можно заново получить retrieval-ом. Память — это дистиллят, а не архив.

Второе правило — политика обновления. Append-only память быстро зарастает противоречиями: старая запись говорит «используем Postgres», новая — «мигрировали на Mongo». Рабочая схема: короткий индекс-файл с указателями плюс тематические заметки, которые перезаписываются целиком при изменении факта. И помните про кэш: если память входит в начало запроса, каждое её обновление инвалидирует префикс — обновляйте память в конце сессии, а не посреди неё.

Состояние задачи в структурированном виде

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

{
  "goal": "мигрировать платежи на новый API",
  "done": ["изучены эндпоинты", "написан адаптер"],
  "in_progress": "интеграционные тесты",
  "blocked": [],
  "invariants": ["не трогать ветку main", "тесты зелёные перед коммитом"]
}

Такой блок весит 100–200 токенов и заменяет тысячи токенов «сырой» истории, из которой то же самое пришлось бы вычитывать. Побочный бонус — приём «речитатив» (recitation): агент, который в конце каждого шага переписывает план со статусами, физически удерживает цель у свежего края окна, в зоне лучшего внимания. Именно так работает список задач в агентных системах: он нужен не только пользователю, но и самой модели.

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

Practice

Схема памяти для агента поддержки

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

Deliverable

Документ со схемой: категории записей памяти с примерами, политика обновления, формат JSON-блока состояния тикета и правило, что в память не пишется никогда.

Checkpoint

Для агента над базой знаний из 5 000 документов объясните, какие данные пойдут в retrieval, какие в память, какие в состояние, и почему чисто векторный поиск здесь недостаточен.

  • ✓ Три слоя разведены по жизненному циклу: корпус, межсессионные факты, текущая задача.
  • ✓ Назван гибрид BM25 + эмбеддинги и контекстные справки чанков с эффектом на качество извлечения.
  • ✓ Состояние оформлено компактным структурированным блоком, а не «модель вспомнит из истории».

Check yourself

Чем память агента принципиально отличается от retrieval?

01Чем память агента принципиально отличается от retrieval?

Какой эффект даёт contextual retrieval по измерениям Anthropic?

02Какой эффект даёт contextual retrieval по измерениям Anthropic?

Что из перечисленного стоит записывать в долговременную память агента?

03Что из перечисленного стоит записывать в долговременную память агента?

Зачем агенту переписывать план задачи в конце каждого шага (recitation)?

04Зачем агенту переписывать план задачи в конце каждого шага (recitation)?

Sources

Retrieval, memory, and state · Context engineering: beyond the prompt · VORCL