# Конспект 1/3 — RAG: Contextual Retrieval, чанкинг, поиск (15 минут)

Глубокий разбор тяжёлого блока из `AI-SD-TOPICS.md` §1. Цель: после чтения уметь **на доске** объяснить, почему контекст в чанке важнее размера чанка, и назвать цифры.

---

## 1. Почему обычный RAG теряет контекст

Классический RAG режет документ на чанки и эмбеддит каждый чанк отдельно.

Проблема: чанк, вырванный из документа, часто непонятен сам по себе.

Пример из Anthropic: в чанке лежит «The company's revenue grew by 3% over the previous quarter».

Чанк сам по себе не отвечает: какая это компания? Какой квартал? За какой год?

Запрос «What was the revenue growth for ACME Corp in Q2 2023?» по такому чанку не найдет ответ, даже если чанк — правильный.[26]

Это называется **контекстная дыра (context conundrum)**: при чанкировании контекст документа разрушается.[26]

Вторая проблема — точные идентификаторы. Эмбеддинги понимают смысл, но не точные строки.[26]

Запрос «Error code TS-999»: эмбеддинг найдёт материалы «про ошибки вообще», а не конкретную строку.

## 2. Решение: Contextual Retrieval

Идея: **до** эмбеддинга и **до** построения BM25-индекса к каждому чанку дописывается короткий контекст, объясняющий, откуда этот кусок.[26]

Контекст генерирует LLM (Claude Haiku) по промпту:

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

Результат — 50–100 токенов контекста на чанк.

Тот же обогащённый текст кладётся и в эмбеддинг, и в BM25-индекс.[26]

Пример трансформации:

```
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."
```

## 3. Цифры (это запомнить обязательно)

Метрика Anthropic: `1 − recall@20` — доля запросов, где правильный документ НЕ попал в top-20.

| Конфигурация | Failure rate |
|---|---|
| Baseline (embedding + BM25) | 5.7% |
| + Contextual embeddings + BM25 | 2.9% (−49%) |
| + Reranker (Cohere) | 1.9% (−67%) |

Плюс из cookbook: Pass@10 на 9 кодовых базах вырос с ~87% до ~95%, причём **contextual embeddings дали +5–7 п.п. — самый большой отдельный выигрыш**.[51]

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

Контекстуализация — **разовый** оффлайн-расход на ingestion, не на каждый запрос (в отличие от HyDE, который добавляет латентность каждому поиску).[51]

Prompt caching делает это дёшево:

1. Первый чанк: документ целиком пишется в кэш (небольшая премия).
2. Остальные чанки: документ читается из кэша (скидка ~90% на эти токены).
3. Кэш живёт 5 минут — хватает на все чанки одного документа.[51][52]

Итоговая цифра Anthropic: ~$1.02 за миллион токенов документа на генерацию контекстов.[26]

Prompt caching — это отдельная фича API: `cache_control: {"type": "ephemeral"}` на стабильный префикс промпта (системный промпт, длинные документы, контекст RAG). Минимальное время жизни кэша 5 минут, расширенный режим — 60 минут.[52]

Меняешь тулы/изображения в промпте — кэш ломается. Совместим с tool use и vision.[52]

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

Anthropic честно пишут: пробовали и другие подходы — добавлять суммаризацию документа к чанкам (малый выигрыш), HyDE (слабо), summary-based indexing (низко).[26]

Именно поэтому Contextual Retrieval — техника выбора: она не «ещё один трюк», а то, что пережило честное сравнение.

## 6. Чанкинг: как резать

Главное правило: **граница смысла важнее числа токенов**.

Причина: эмбеддер имеет свой контекст-лимит; если превысить — токены обрезаются и теряются из вектора. Плюс чанк должен быть самодостаточным для поиска.[56]

| Стратегия | Как работает | Когда брать |
|---|---|---|
| По заголовкам | Режем по `##`, секциям | FAQ банка, политики — дефолт для Plata |
| Recursive split | Абзацы → предложения, с overlap | Проза без структуры |
| Parent–child | Маленький ищется, большой отдаётся | Ответу нужен широкий контекст |
| Semantic split | Режем по падению cosine между соседями | Смешанные топики |
| Contextual retrieval | К чанку приписывается контекст | Чанк без «чьи это цифры» |

**Overlap** — перекрытие соседних чанков на N токенов, чтобы предложение на стыке не потерялось.

Чанк слишком маленький → нет смысла для поиска. Чанк слишком большой → эмбеддер обрежет, или поиск вернёт «всё подряд».[56]

## 7. Гибрид и reranking

**Hybrid = BM25 + embeddings.** BM25 ловит точные строки (TS-999, NIP, номер договора), embeddings — перефразы.[26]

**Reranking** — отдельная маленькая модель (Cohere, Voyage), которая заново сортирует top-k по релевантности к запросу. Anthropic: берёт 20+ чанков, реранкер оставляет нужное.[26]

Cost/latency: реранкер добавляет немного латентности, но модель обрабатывает меньше токенов — итог часто дешевле.

**HyDE** (Hypothetical Document Embeddings): сначала LLM генерирует гипотетический «идеальный ответ» на запрос, потом этот ответ эмбеддится и ищется. Работает без relevance-разметки, но добавляет латентность на каждый запрос и может содержать выдумки.[55]

**Когда RAG не нужен вообще:** корпус < ~200k токенов (~500 страниц) — весь корпус в промпт + prompt cache.[26]

---

## Ссылки по теме (разобрать по 5 минут каждую)

- [Anthropic — Contextual Retrieval (оригинальный пост)](https://www.anthropic.com/news/contextual-retrieval) — цифры −49%/−67%, промпт контекстуализации
- [Cookbook: Enhancing RAG with contextual retrieval](https://platform.claude.com/cookbook/capabilities-contextual-embeddings-guide) — рабочий код: chunk по заголовкам, Voyage embed, Cohere rerank, Elasticsearch BM25, Pass@10 87→95%[51]
- [Prompt Caching (доки Anthropic)](https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching) — cache_control, 5/60 мин, что ломает кэш[52]
- [Pinecone — Chunking Strategies](https://www.pinecone.io/learn/chunking-strategies/) — зачем чанки, trade-off размера, рекомендации[56]
- [Jason Liu — Levels of Complexity: RAG](https://jxnl.github.io/blog/writing/2024/02/28/levels-of-complexity-rag-applications/) — L1→L3: чанкинг → rerank/rewrite → observability, что логировать[40]
- [Evidently — полный гайд по RAG evaluation](https://www.evidentlyai.com/llm-guide/rag-evaluation) — retrieval vs generation, ground-truth метрики[39]
- [Ragas — список метрик](https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/) — faithfulness, context recall, context precision[35]
- [HyDE paper (arxiv 2212.10496)](https://arxiv.org/abs/2212.10496) — гипотетические документы для zero-shot поиска[55]
- [RAG paper Lewis et al. 2020 (arxiv 2005.11401)](https://arxiv.org/abs/2005.11401) — термин RAG оттуда[61]
- [DL.AI — Building and Evaluating Advanced RAG (~2 ч, бесплатно)](https://www.deeplearning.ai/short-courses/building-evaluating-advanced-rag/) — RAG triad руками[6]

## Мини-словарь к конспекту

**Chunk** — кусок текста, который эмбеддится и ищется как единица.

**Embedding** — вектор чисел, кодирующий смысл текста; близкие по смыслу тексты — близкие векторы.

**BM25** — лексический поиск (эволюция TF-IDF): точные совпадения слов, с поправкой на длину документа и «насыщение» частоты.

**Reranker** — модель, которая пересортировывает уже найденные кандидаты по релевантности.

**Pass@k** — «золотой документ попал в первые k выданных?» — в контексте RAG это та же идея, что recall@k.[51]

**Prompt caching** — кэширование общего префикса промпта между вызовами: дешевле и быстрее, у Anthropic до 90% экономии на закэшированных токенах.[26][52]

**HyDE** — сгенерировать гипотетический ответ и искать по нему.[55]

## Sources

[6] https://www.whoop.com/us/en/thelocker/whoop-training-zones-optimal-overreaching-restoring
[26] https://www.anthropic.com/news/contextual-retrieval
[35] https://docs.ragas.io/en/stable/concepts/metrics/available_metrics
[39] https://www.evidentlyai.com/llm-guide/rag-evaluation
[40] https://jxnl.github.io/blog/writing/2024/02/28/levels-of-complexity-rag-applications
[51] https://platform.claude.com/cookbook/capabilities-contextual-embeddings-guide
[52] https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
[55] https://arxiv.org/abs/2212.10496
[56] https://www.pinecone.io/learn/chunking-strategies
[61] https://arxiv.org/abs/2005.11401
