Контекстное окно Claude в 200K токенов кажется бесконечным, пока не посчитаешь. 200K токенов это около 150 000 слов, примерно 600 страниц карманной книги или кодбаза среднего размера вместе с тестами. Почему же в 2026 году мы всё ещё строим RAG-пайплайны? Потому что «помещается в окно» и «должно лежать в окне» разные вопросы. Путаница между ними стала самой дорогой ошибкой, которую команды допускают с Claude в этом году.
Дальше схема решений, которой мы пользуемся сами. В ней три рабочие стратегии: полная вставка (full stuff), RAG с вставкой top-N и гибрид с re-rank. Для каждой показано, когда она выигрывает по цене, задержке и качеству ответа.
Сколько помещается в окно
В окно в 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 раз больше, чем выходных, так что платите вы по сути за вход. На большом объёме вопрос стоимости целиком сводится к цене входа.
Поэтому 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: полная вставка с prompt caching
Когда применять: контекст большой, но стабильный между вызовами. Документация, неизменные базы знаний, замороженный репозиторий для анализа, клиентские мануалы, по которым часто задают вопросы.
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://api.codexkey.ru/v1",
apiKey: process.env.CODEXKEY_API_KEY,
});
const KNOWLEDGE_BASE = await loadFullDocs(); // ~180K токенов, стабильно
const response = await client.messages.create({
model: "claude-sonnet-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 и вставка 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-5",
max_tokens: 1024,
messages: [
{
role: "user",
content: `Контекст:\n${reranked.map(c => c.text).join("\n---\n")}\n\nВопрос: ${userQuery}`,
},
],
});
Вход остаётся небольшим (5K-20K токенов), задержка низкая, цена предсказуема. Компромисс в другом: узким местом становится качество поиска. Слабая embedding-модель или неудачный чанкинг портят ответы, как бы силён ни был Claude.
Стратегия 3: гибрид с re-rank
Когда применять: качество ответа важнее цены и задержки. Юриспруденция, медицина, дорогая поддержка, код-ревью больших репозиториев.
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-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-промпте. Изменчивый материал под конкретный запрос извлекается, переранжируется и добавляется заново. Получаются полнота RAG, глубина полного контекста и большая часть выигрыша от кеша.
Матрица решений
| Размер корпуса | Свежесть запроса | Стратегия |
|---|---|---|
| < 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 |
Закономерность одна: стабильное кешируем, изменчивое извлекаем.
Как замерять
Выбрать стратегию без измерений нельзя. Вот наш стандартный набор проверок для решений по long-context:
- Needle-in-a-haystack на разной глубине. Вставьте уникальный факт на глубине 10%, 50% и 90% контекста, по 50 запросов на каждую глубину. Замерьте точность извлечения.
- Multi-hop рассуждения. Положите два связанных факта на разную глубину и задайте вопрос, которому нужны оба. Деградация здесь круче, чем при одной «иголке», особенно в средней полосе.
- Цена за решённый запрос. Все расходы делим на число верно отвеченных проверок. Для бюджета важна только эта метрика.
- P95 latency. Длинный контекст означает медленный первый токен. RAG с 8K на входе обычно даёт TTFT в 3-5 раз быстрее, чем полная вставка 180K.
- Cache hit rate. Если кеш работает в проде, снимайте метрику. Hit rate ниже 70% говорит о неверном TTL или партиционировании.
Как prompt caching меняет арифметику
Без кеша 180K токенов, вставленные 100 раз, стоят 100x от входной цены одного вызова. С кешем:
- Вызов 1: 1.25x (запись кеша).
- Вызовы 2-100: по 0.1x (чтение кеша).
- Итого: 1.25 + 9.9 = 11.15x на 100 вызовов.
Это примерно в 9 раз дешевле той же нагрузки без кеша. Окупаемость наступает на двух переиспользованиях, дальше разрыв только растёт.
Одна эта возможность и сделала «вставлять документацию целиком» жизнеспособным в 2026 году, хотя в 2024 это было финансовым абсурдом. Если контекст у вас стабильный, а кеша нет, вы оставляете деньги на полу.
Итог
Плейбук long-context на 2026 год сводится к одному правилу: стабильное кешируем, изменчивое извлекаем.
- Контекст небольшой и стабильный: вставляйте целиком и кешируйте.
- Контекст очень большой и меняется от запроса к запросу: берите RAG.
- Бывает и то и другое (реалистичный случай для большинства продакшен-приложений): разделяйте. Стабильное кладите в кешируемый system, изменчивое извлекайте и переранжируйте в messages.
Выбирайте стратегию по замерам, а не по ощущениям. Прогоните needle-in-a-haystack, считайте цену за решённый запрос, следите за cache hit rate. Больше всего из Claude в этом году выжимают не те команды, у которых самые хитрые промпты, а те, кто измерил раньше, чем выкатил.