RAG · Retrieval-augmented generation · урок 5 · 12 мин
Contextual retrieval
Contextual retrieval
Зачем
После урока ты объяснишь приём contextual retrieval — строку контекста перед каждым chunk — и назовёшь измеренные цифры: насколько он снижает долю промахов поиска и почему стоит дёшево. На собеседовании это сильный ход: не «я бы улучшил retrieval», а конкретный приём с цифрами, ценой и рисками.
Беда маленького chunk
Chunk (кусок документа) режут маленьким, чтобы поиск попадал точно. Но вне документа такой кусок часто теряет смысл. Пример Anthropic: chunk «The company's revenue grew by 3% over the previous quarter.» — какой компании, какого квартала? Банковский вариант: строка таблицы «Досрочное погашение — 1% от остатка» без названия продукта и года. Таких строк в корпусе десятки: автокредит, ипотека, редакции 2024 и 2026 годов.
Страдают оба поиска. Embedding (числовой отпечаток смысла) у куска без контекста размыт: в нём нет «автокредита» и «2026». BM25 (формула поиска по словам) не найдёт слово «автокредит», которого в chunk нет. Верный кусок проигрывает похожим.
Приём: строка контекста перед chunk
Contextual retrieval (поиск с контекстом, Anthropic, сентябрь 2024) делает так. На этапе подготовки LLM (large language model, большая языковая модель) получает весь документ и один chunk и пишет короткую строку — обычно 50–100 токенов, — которая помещает chunk в документ. В статье для этого использовали Claude 3 Haiku и prompt (инструкцию модели) с просьбой дать короткий контекст, который помещает chunk в документ ради лучшего поиска, и ничего больше. Строку приклеивают в начало chunk, и уже эту пару кодируют в вектор и кладут в индекс BM25.
Тогда кусок из примера превращается в: «This chunk is from an SEC filing on ACME corp's performance in Q2 2023; the previous quarter's revenue was $314 million. The company's revenue grew by 3%…» Банковский: «Тариф по автокредиту для физических лиц, редакция с 1 марта 2026 года, раздел 4 „Досрочное погашение“. Досрочное погашение — 1% от остатка».
Приём меняет только offline-половину (подготовку индекса). Online-половина (ответ на вопрос) остаётся прежней. Важно, что строку пишут один раз при индексации, а не на каждый вопрос: задержка ответа клиенту почти не растёт (chunks в context становятся длиннее примерно на 100 токенов). Растёт только время и цена подготовки нового документа. Отсюда и вывод для архитектуры: приём подходит корпусу, который меняется не каждую минуту, — тарифам, политикам, договорам.
Цифры, которые можно назвать
Anthropic мерила долю промахов в top-20: 1 − recall@20, то есть долю случаев, когда нужного chunk не было среди 20 найденных. Цифры для лучшей конфигурации (embeddings Gemini Text 004); все снижения считаются от одной и той же базы 5,7%:
| Конфигурация | Промахи в top-20 | Снижение |
|---|---|---|
| Обычные chunks, без контекста (база) | 5,7% | — |
| Contextual embeddings | 3,7% | −35% |
| + contextual BM25 | 2,9% | −49% |
| + reranking | 1,9% | −67% |
Reranking (переранжирование) в их опыте: достать top-150, пересортировать моделью Cohere, отдать в context top-20. На собеседовании говори так: «Anthropic reported a 49% drop in top-20 retrieval failures from contextual embeddings plus contextual BM25, and 67% with reranking on top».
Почему выигрывает и BM25: в строке контекста появляются слова, которых не было в chunk, — название продукта, год, раздел. Запрос «досрочка по автокредиту 2026» теперь совпадает по словам с нужным куском.
Почему это дёшево: prompt caching
На первый взгляд дорого: для каждого chunk модель читает весь документ. Документ на 8 000 токенов из 10 chunks — 80 000 токенов входа вместо 8 000. Спасает prompt caching (кэширование начала prompt): документ кладут в начало запроса, первый вызов записывает его в кэш, следующие вызовы для других chunks того же документа читают его из кэша. По документации Claude (открыто 10.10.2026) чтение из кэша стоит 0,1 от базовой цены входа на большинстве моделей, запись в кэш с временем жизни 5 минут — 1,25.
Anthropic оценила разовую подготовку в ≈ $1,02 на миллион токенов документов. Допущения: chunks по 800 токенов, документы по 8 000, инструкция 50 токенов, контекст 100 токенов на chunk. Пример: корпус из 2 000 документов по 8 000 токенов — 16 миллионов токенов, ≈ $16 разово по ценам и модели из статьи 2024 года. Сегодня цифру надо пересчитать по текущему прайсу.
Ещё одна мысль из той же статьи: если вся база знаний меньше 200 000 токенов (около 500 страниц), RAG может быть не нужен — всю базу кладут в prompt, а prompt caching делает это быстрым и недорогим.
Цена и риски
Приём не бесплатен, и сильный ответ называет цену:
- Ошибки в строке контекста. Строку пишет модель, значит она может ошибиться: перепутать год редакции или продукт. Ошибка попадает в индекс и уводит поиск уверенно не туда. Строки проверяют выборочно, а инструкцию модели делают по своей предметной области — статья прямо советует добавлять в неё глоссарий.
- Переиндексация. Сменил модель-контекстуализатор или инструкцию — пересчитывай строки для всего корпуса.
- Индекс растёт. 100 токенов к chunk на 800 — это +12,5% текста в индексе.
- Подготовка медленнее. Каждый новый документ ждёт вызовов модели до попадания в поиск.
- Цитирование. Клиенту и в citation (ссылку на источник) показывают оригинальный chunk, а строку контекста хранят отдельным полем. Статья отмечает, что модели полезно отличать добавленный контекст от самого текста.
Как решать на работе
Сначала дешёвая база без LLM: приклеить к chunk название документа и путь заголовков из metadata («Тариф автокредита 2026 › Раздел 4»). Иногда это даёт большую часть выигрыша. Затем contextual retrieval как кандидат, и решение по замеру на своём golden set (наборе вопросов с известными верными chunks): recall@20 до и после, отдельно по языкам и по трудным случаям вроде таблиц. Статья сама заканчивается этим советом: «always run evals» на своей задаче.
Схема
Термины · Key terms
- contextual retrieval
- приём: строка контекста от LLM перед каждым chunk до индексации
- contextual embeddings
- векторы от chunk со строкой контекста
- contextual BM25
- индекс по словам от chunk со строкой контекста
- recall@20
- доля случаев, когда нужный chunk есть среди 20 найденных
- retrieval failure rate
- доля промахов: 1 − recall@k
- prompt caching
- повторное использование уже обработанного начала prompt за меньшую цену
- reranking
- пересортировка кандидатов точной моделью
- golden set
- набор вопросов с заранее известными верными chunks
Сделай сам
Возьми строку таблицы тарифов: «Досрочное погашение — 1% от остатка, не менее 5 000 ₸». Напиши к ней строку контекста на 1–2 предложения, как её написала бы модель. Подчеркни в строке слова, которых нет в самом chunk, и одним предложением объясни, почему от них выигрывает BM25.
Обсуди с тьютором: покажи строку и спроси, какие ошибки модель-контекстуализатор может внести именно в таблицу тарифов и как поймать их до индексации.
Проверь себя · ответ под вопросом
1На сколько падает доля промахов в top-20 при сочетании contextual embeddings, contextual BM25 и reranking?
2Почему prompt caching делает этот приём дешёвым?
3Одна цена или один риск contextual chunks.
Interview questions · US / UK
1What is contextual retrieval, and what gains were reported?
2Isn't it expensive to run an LLM over every chunk?
3Scenario: after adding contextual chunks, recall improves overall but some fee questions get worse. What do you check?
Ключевые фразы · Say it aloud
- A chunk that makes no sense on its own retrieves badlyкусок без контекста плохо находится
- We prepend a short, generated context line before embedding and BM25 indexingкороткая строка контекста перед индексацией
- Prompt caching makes the one-time cost smallprompt caching делает разовую подготовку дешёвой
- The context line is model output, so it can be wrongстроку пишет модель, значит она может ошибаться
- Re-measure on our own golden setперемерить на своём golden set
Материалы
- Anthropic — Introducing Contextual Retrieval — разделы «The context conundrum», «Introducing Contextual Retrieval», «Performance improvements», «Further boosting performance with Reranking» (10 мин)
- Claude Docs — Prompt caching — начало страницы: что кэшируется, цены чтения и записи, время жизни (5 мин)
- Pinecone — Chunking Strategies for LLM Applications — раздел про contextual chunking и chunk expansion (4 мин)