Контекстное окно Claude в 200K токенов кажется бесконечным, пока не посчитаешь. 200K токенов — это примерно 150 000 слов, около 600 страниц карманной книги или средняя кодбаза вместе с тестами. Зачем же мы всё ещё строим RAG-пайплайны в 2026? Потому что «влезает в окно» и «должно быть в окне» — два совершенно разных вопроса, и путаница между ними — самая дорогая ошибка, которую команды совершают с Claude в этом году.
Этот пост — фреймворк решений, который мы используем внутри. Он покрывает три рабочие стратегии — full stuff, RAG-and-stuff-top-N и гибрид с re-rank — и показывает, когда каждая выигрывает по цене, latency и качеству ответа.
Математика окна
Окно в 200K токенов вмещает примерно:
- ~150 000 английских слов (средний токен — около 0.75 слова).
- ~500–800 страниц обычной прозы.
- ~30 000–50 000 строк мейнстрим-кода (TypeScript, Python, Go).
- Средний SaaS-бэкенд, полную схему БД и три недели тикетов — с запасом.
Соблазн просто вставить всё — реален. И иногда оправдан. Но против него работают две силы: цена входа и lost-in-the-middle.
Сила 1: цена входа доминирует на масштабе
В long-context вызовах драйвер цены — почти никогда не output. Запрос с 180K входа и 1K выхода имеет в 180 раз больше входных токенов, чем выходных, — счёт за вход и есть счёт. На масштабе input cost — это весь вопрос.
Именно поэтому prompt caching меняет правила (об этом ниже). Без кеша вставлять 180K токенов в каждый запрос — это налог за каждый вызов, и именно этот налог ломает наивные long-context-стратегии финансово где-то на 1000 запросов в день.
Сила 2: lost-in-the-middle — это реальность, даже у Claude
Claude уже несколько поколений лучший long-context-модель на бенчмарках needle-in-a-haystack. Он действительно сильнее большинства конкурентов в извлечении фактов из произвольной позиции. Но «лучше» — не «идеально».
В наших внутренних замерах на глубинах 150K+ токенов мы видим:
- Верх контекста (первые 10K токенов): ~99% точность извлечения.
- Низ контекста (последние 10K токенов): ~98% точность.
- Середина (глубина 80K–120K): ~92–95% на multi-hop рассуждениях, ниже на тонких фактах.
Этот разрыв в 4–7 пунктов имеет значение. Если приложение требует надёжно находить пункт, закопанный на глубине 100K, «обычно работает» — это не та фича, которую можно поставить в прод.
Три стратегии
Стратегия 1: Full stuff с prompt caching
Когда применять: контекст большой, но стабильный между вызовами. Документация, фиксированные базы знаний, замороженный репозиторий для анализа, клиентские мануалы, по которым задают много вопросов.
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.claudexia.tech/v1",
apiKey: process.env.CLAUDEXIA_API_KEY,
});
const KNOWLEDGE_BASE = await loadFullDocs(); // ~180K токенов, стабильно
const response = await client.messages.create({
model: "claude-sonnet-4.5",
max_tokens: 1024,
system: [
{
type: "text",
text: KNOWLEDGE_BASE,
cache_control: { type: "ephemeral" },
},
],
messages: [{ role: "user", content: userQuestion }],
});
Первый вызов записывает кеш (1.25x входной цены). Каждый последующий в пределах TTL читает по 0.1x — снижение в 12.5 раз. Два переиспользования уже бьют базовый сценарий без кеша. После десяти переиспользований вы платите примерно 10% от того, что заплатили бы иначе.
Стратегия 2: RAG-and-stuff-top-N
Когда применять: корпус сильно больше 200K (графы знаний, многомиллионные архивы документов, история тикетов за годы), и каждый запрос затрагивает свой срез.
const topChunks = await vectorSearch(userQuery, { k: 20 });
const reranked = await rerank(userQuery, topChunks, { keep: 8 });
const response = await client.messages.create({
model: "claude-sonnet-4.5",
max_tokens: 1024,
messages: [
{
role: "user",
content: `Контекст:\n${reranked.map(c => c.text).join("\n---\n")}\n\nВопрос: ${userQuery}`,
},
],
});
Вход остаётся маленьким (5K–20K токенов), latency низкая, цена предсказуемая. Цена компромисса: бутылочное горлышко теперь — качество извлечения. Слабая embedding-модель или плохой чанкинг убивают ответы независимо от силы Claude.
Стратегия 3: Гибрид с re-rank
Когда применять: качество ответа важнее цены и latency — юриспруденция, медицина, дорогая поддержка, код-ревью больших репозиториев.
const stableContext = await loadFrameworkDocs(); // 80K токенов, кешируется
const dynamic = await vectorSearch(userQuery, { k: 30 });
const reranked = await rerank(userQuery, dynamic, { keep: 12 });
const response = await client.messages.create({
model: "claude-sonnet-4.5",
max_tokens: 2048,
system: [
{ type: "text", text: stableContext, cache_control: { type: "ephemeral" } },
],
messages: [
{
role: "user",
content: `Релевантные фрагменты:\n${reranked.map(c => c.text).join("\n---\n")}\n\nВопрос: ${userQuery}`,
},
],
});
Стабильные доки фреймворка / политик сидят в кешированном system-промпте. Волатильный по-запросный материал извлекается, реранкится и подмешивается свежим. Получаете recall RAG, глубину stuffed-контекста и большую часть выигрыша от кеша.
Матрица решений
| Размер корпуса | Свежесть запроса | Стратегия |
|---|---|---|
| < 50K токенов | любая | Full stuff (без кеша) |
| 50K–200K | в основном стабильно | Full stuff + prompt caching |
| 50K–200K | каждый запрос разный | RAG top-N |
| > 200K | в основном стабильно | Кешировать стабильную часть + RAG остальное |
| > 200K | каждый запрос разный | RAG top-N + re-rank |
| Смешанный (стабильный фреймворк + per-query данные) | любая | Гибрид с re-rank |
Паттерн: кешируй стабильное, извлекай волатильное.
Методология замеров
Стратегию нельзя выбрать без измерений. Наш стандартный eval-сьют для long-context-решений:
- Needle-in-a-haystack на разных глубинах. Вставить уникальный факт на 10%, 50% и 90% глубины. 50 запросов на глубину. Замерить точность извлечения.
- Multi-hop рассуждения. Положить два связанных факта на разных глубинах, спросить вопрос, требующий обоих. Деградация здесь сильнее, чем на single-needle, особенно в среднем диапазоне.
- Цена за решённый запрос. Полные траты делить на число корректно отвеченных evals. Единственная метрика, которая важна для бюджета.
- P95 latency. Длинный контекст = медленный первый токен. RAG с 8K входа обычно даёт TTFT в 3–5 раз быстрее, чем stuffed 180K.
- Cache hit rate. Если кеш в проде — инструментируйте. Меньше 70% hit rate означает, что у вас неправильный TTL или партиционирование.
Как prompt caching меняет математику
Без кеша 180K токенов, вставленные 100 раз, стоят 100x от per-call input price. С кешем:
- Вызов 1: 1.25x (запись кеша).
- Вызовы 2–100: 0.1x каждый (чтение кеша).
- Итого: 1.25 + 9.9 = 11.15x — на 100 вызовов.
Это примерно в 9 раз дешевле той же нагрузки без кеша. Точка безубыточности — два переиспользования. Дальше каждое следующее увеличивает разрыв.
Именно эта одна фича делает «вставлять всю документацию» жизнеспособным в 2026, тогда как в 2024 это было финансовым абсурдом. Если у вас стабильный контекст и вы не кешируете — вы оставляете деньги на полу.
Итог
Плейбук long-context на 2026 сжимается до одного правила: кешируй стабильное, извлекай волатильное.
- Если контекст маленький и стабильный — вставляйте и кешируйте.
- Если контекст огромный и per-query — RAG.
- Если оба — реалистичный случай для большинства прод-приложений — разделяйте: стабильное в кешированный system, волатильное — извлекать и реранкить в messages.
Выбирайте стратегию по замерам, а не по интуиции. Гоняйте needle-in-haystack, считайте цену за решённый запрос, инструментируйте cache hit rate. Команды, которые в этом году выжимают из Claude максимум, — это не те, у кого самые хитрые промпты, а те, кто измерил раньше, чем поставил в прод.