Урок 0003 · Contextual Retrieval

Самый свежий проверенный приём для retrieval. Отвечает на вопрос «как улучшить поиск?» с цифрами.

Цель урока Объяснить на доске, почему контекст в чанке важнее размера чанка, и назвать цифры Anthropic.

1. Проблема: контекстная дыра

Классический RAG режет документ на чанки и эмбеддит каждый отдельно. Чанк, вырванный из документа, часто непонятен.

Пример Anthropic: в чанке «The company's revenue grew by 3% over the previous quarter» — неясно, какая компания и какой квартал. Запрос «реvenue growth for ACME in Q2 2023» не найдёт этот чанк, даже если он правильный.

Источник: Anthropic — Introducing Contextual Retrieval.

2. Решение

До эмбеддинга и до BM25 к каждому чанку дописывается 50–100 токенов контекста, сгенерированного LLM:

<document>…весь документ…</document>
<chunk>…чанк…</chunk>
Дай короткий контекст, чтобы разместить чанк в документе
для улучшения поиска. Только контекст.

Трансформация:

original: "The company's revenue grew by 3% over the previous quarter."
context:  "This chunk is from an SEC filing on ACME corp's performance in Q2 2023;
           the previous quarter's revenue was $314 million."

Обогащённый текст идёт и в эмбеддинг, и в BM25-индекс.

3. Цифры (запомнить)

КонфигурацияFailure rate (1 − recall@20)
Baseline (embedding + BM25)5.7%
+ Contextual embeddings + BM252.9% (−49%)
+ Reranker (Cohere)1.9% (−67%)

В cookbook на кодовых базах: Pass@10 87% → 95%, причём contextual embeddings дали самый большой отдельный выигрыш (+5–7 п.п.).

Источник: Cookbook.

4. Стоимость: prompt caching

Проблема: контекстуализация — это сотни LLM-вызовов, и в каждом — ВЕСЬ документ. Документ на 8 000 токенов, 10 чанков: без кэша 10 × 8 000 = 80 000 токенов по полной цене. На 1 000 чанков документ пересылается 1 000 раз.

Prompt caching — фича API: одинаковый префикс промпта кэшируется между вызовами. В нашем случае префикс у всех вызовов один — <document>…весь документ…</document>, меняется только <chunk>.

  1. Первый вызов: документа нет в кэше → запись за небольшую премию (~125% от цены).
  2. Вызовы 2–10: документ читается из кэша со скидкой ~90% (платишь 10%).
  3. Кэш живёт 5 минут — обработка всех чанков документа занимает секунды, все вызовы попадают в окно кэша.

Счёт для документа 8k токенов, 10 чанков: запись 8 000 × 125% + 9 чтений × 8 000 × 10% + 10 чанков × 800 ≈ 25 000 «эквивалентных» токенов вместо 80 000. На 1 000 чанков выигрыш на порядки.

Итог Anthropic: ~$1.02 за миллион токенов документа — разовая цена контекстуализации всего корпуса. Документ на 100k токенов ≈ $0.10 за всю обработку. Кэш съедает 90% стоимости повторных пересылок.

В отличие от HyDE: HyDE генерирует гипотетический документ на КАЖДЫЙ запрос (горячий путь, латентность + стоимость × запросы). Contextual Retrieval платит один раз при ingestion, дальше все запросы используют готовый индекс.

Что ломает кэш: кэш работает по точному совпадению префикса (хэш начала промпта). Меняешь системный промпт, добавляешь/убираешь тулы (они сериализуются в системный промпт), вставляешь изображение, меняешь порядок блоков — префикс изменился → кэш-промах → полная цена заново.

Источники: cookbook, prompt caching docs.

5. Что проверяли и не зашло

Anthropic честно сравнивали: суммаризация документа к чанкам (малый выигрыш), HyDE (слабо), summary-based indexing (низко). Contextual Retrieval пережило сравнение — поэтому это «техника выбора», а не «ещё один трюк».

6. Связка с остальным

Проверь себя

Contextual retrieval снижает failure rate на?

Когда платишь за контекстуализацию?

Что делает prompt caching?

Первоисточник урока Anthropic — Introducing Contextual Retrieval — пост с цифрами и промптом.