RAG · Retrieval-augmented generation · урок 5 · 12 мин

Contextual retrieval

Contextual retrieval

ТемыRAGПоиск и embeddings

Зачем

После урока ты объяснишь приём 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 делает это быстрым и недорогим.

Цена и риски

Приём не бесплатен, и сильный ответ называет цену:

Как решать на работе

Сначала дешёвая база без 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?
С 5,7% до 1,9%, то есть на 67% (данные Anthropic, 2024). Без reranking — до 2,9%, на 49%; одни contextual embeddings — до 3,7%, на 35%.
2Почему prompt caching делает этот приём дешёвым?
Для каждого chunk модель читает весь документ, но документ один и тот же. Он записывается в кэш при первом вызове, а для остальных chunks читается из кэша по цене около 0,1 от обычного входа. Поэтому подготовка обходится примерно в $1 на миллион токенов документов по оценке статьи.
3Одна цена или один риск contextual chunks.
Модель может написать неверную строку (чужой год или продукт), и ошибка уйдёт в индекс, уверенно уводя поиск. Другие цены: переиндексация при смене модели или инструкции, рост индекса примерно на 12% и более медленная подготовка документа.

Interview questions · US / UK

1What is contextual retrieval, and what gains were reported?
Strong answer: an LLM writes 50–100 tokens situating each chunk in its document, prepended before embedding and BM25 indexing; top-20 failures 5.7% → 3.7% (embeddings), 2.9% (+BM25), 1.9% (+rerank); measured on Anthropic's sets, so re-measure on yours.
2Isn't it expensive to run an LLM over every chunk?
Strong answer: one-time offline cost; prompt caching reuses the document across its chunks; about $1.02 per million document tokens in the 2024 article; compare with a free baseline (title and headings from metadata); and under ~200k tokens skip RAG entirely.
3Scenario: after adding contextual chunks, recall improves overall but some fee questions get worse. What do you check?
Strong answer: slice the golden set by doc type and language; read the generated context lines for the failing chunks (wrong year or product); check table chunks; tune the contextualizer prompt with a glossary; re-index and re-measure per slice.

Ключевые фразы · Say it aloud

Материалы