Самый свежий проверенный приём для retrieval. Отвечает на вопрос «как улучшить поиск?» с цифрами.
Классический RAG режет документ на чанки и эмбеддит каждый отдельно. Чанк, вырванный из документа, часто непонятен.
Пример Anthropic: в чанке «The company's revenue grew by 3% over the previous quarter» — неясно, какая компания и какой квартал. Запрос «реvenue growth for ACME in Q2 2023» не найдёт этот чанк, даже если он правильный.
Источник: Anthropic — Introducing Contextual Retrieval.
До эмбеддинга и до 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-индекс.
| Конфигурация | Failure rate (1 − recall@20) |
|---|---|
| Baseline (embedding + BM25) | 5.7% |
| + Contextual embeddings + BM25 | 2.9% (−49%) |
| + Reranker (Cohere) | 1.9% (−67%) |
В cookbook на кодовых базах: Pass@10 87% → 95%, причём contextual embeddings дали самый большой отдельный выигрыш (+5–7 п.п.).
Источник: Cookbook.
Проблема: контекстуализация — это сотни LLM-вызовов, и в каждом — ВЕСЬ документ. Документ на 8 000 токенов, 10 чанков: без кэша 10 × 8 000 = 80 000 токенов по полной цене. На 1 000 чанков документ пересылается 1 000 раз.
Prompt caching — фича API: одинаковый префикс промпта кэшируется между вызовами. В нашем случае префикс у всех вызовов один — <document>…весь документ…</document>, меняется только <chunk>.
Счёт для документа 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.
Anthropic честно сравнивали: суммаризация документа к чанкам (малый выигрыш), HyDE (слабо), summary-based indexing (низко). Contextual Retrieval пережило сравнение — поэтому это «техника выбора», а не «ещё один трюк».
Contextual retrieval снижает failure rate на?
Когда платишь за контекстуализацию?
Что делает prompt caching?