Retrieval-augmented generation в 2026 году выглядит совсем не так, как два года назад. Sonnet 4.6 несёт окно контекста 200K токенов, а prompt caching снижает стоимость стабильного контекста на порядок. Главный вопрос больше не «как впихнуть нужный чанк в 8K токенов», а «когда вообще делать retrieval, а когда просто положить всю базу знаний в закэшированный системный промпт».
Это рабочее руководство для архитектора: когда классический retrieval всё ещё выигрывает, как использовать длинный контекст и не разориться, какие embedding и reranker сочетать с Claude, как получать надёжные цитаты и какие грабли регулярно встречаются в продакшене.
Классический RAG vs длинный контекст: когда вообще искать
Первое решение — нужен ли retrieval вообще. Окно 200K у Sonnet 4.6 вмещает примерно 100–150 средних документов (5–10 страниц), а это покрывает удивительно много реальных корпусов целиком. Три практических правила:
- Складывайте всё в контекст, если корпус небольшой (до ~150K токенов), стабильный между сессиями, а вопросы затрагивают сразу несколько документов. Закэшированный системный промпт со всем корпусом обыгрывает retriever и по качеству, и по латентности уже после первого вызова.
- Делайте retrieval, если корпус большой (миллионы токенов), часто меняется или каждый запрос требует только 1–5 документов. Embedding-поиск остаётся самым дешёвым способом сузить выборку.
- Гибрид — агрессивный retrieval (top-50 или top-100), а длинный контекст Claude добирает остальное. Это доминирующий паттерн 2026 года: он снижает требования к точности retrieval и перекладывает больше качества на модель.
Почему prompt caching меняет экономику
Prompt caching — главная причина, почему длинный контекст стал экономически осмысленным. Когда вы помечаете префикс промпта как кэшируемый, Anthropic хранит его на своей стороне; следующие вызовы с тем же префиксом платят примерно 10% обычной цены input за эту часть. Запись в кэш чуть дороже обычного input-токена, чтение — радикально дешевле.
Для стабильной базы знаний это означает:
- Первый вызов: платим полную цену за запись кэша (~25% надбавки на кэшируемой части).
- Каждый следующий вызов в пределах TTL: ~10% за закэшированный префикс и полная цена только за уникальный хвост запроса.
На практике RAG-ассистент, который обслуживает десятки запросов к одному корпусу в час, окупает кэш за два-три вызова и дальше работает примерно в 10 раз дешевле, чем без кэша. Именно это превращает «запихнуть 80 документов в Sonnet» в реальный продакшн-паттерн, а не демку.
Выбор embedding-модели
Если вы всё-таки делаете retrieval, выбор embedding-модели важнее, чем кажется. Практический шорт-лист на 2026:
- Voyage AI (
voyage-3-largeилиvoyage-code-3для кода) — официально рекомендованное Anthropic решение. Сильная на английском, коде и мультиязычных задачах; сделана специально под RAG. - OpenAI
text-embedding-3-large— безопасный fallback, если у вас уже есть ключи OpenAI и нужна проверенная база на 3072 размерности. - BAAI
bge-m3— open-source, мультиязычная, сильный recall, крутится локально на одном A100, если нужно держать эмбеддинги on-prem.
Что бы вы ни выбрали, зафиксируйте версию модели. Переэмбеддить корпус из-за того, что вендор молча обновил модель — самая частая самонанесённая RAG-авария в продакшене.
Reranking: дешёвый выигрыш, который больше никто не пропускает
Vector retriever возвращает правдоподобные кандидаты, а не ранжированные ответы. Дефолтный стек 2026 — взять с запасом (top-50 или top-100) и переранжировать в top-10 или top-20 кросс-энкодером:
- Cohere Rerank 3 — хостед, мультиязычный, отличное качество, оплата за вызов.
- BAAI
bge-reranker-v2-m3— open-source, работает на обычных GPU, без оплаты за вызов.
Добавление reranker обычно даёт больший прирост качества, чем замена Sonnet на Opus, и стоит копейки. Если вы не используете reranker в 2026 — это первое, что нужно починить.
Гибридный поиск: BM25 всё ещё нужен
Чистый векторный поиск проваливает запросы на точное совпадение:
артикулы товаров, коды ошибок, имена функций, номера статей закона.
Решение — гибридный поиск: параллельно гоняем BM25 (через OpenSearch,
Elastic или tantivy) и векторный retrieval, потом сливаем оценки
через reciprocal rank fusion (RRF). Гибрид стабильно обыгрывает
чистый вектор на разнородных корпусах и почти ничего не стоит, если
индексы уже есть.
Стратегии чанкинга, которые работают
Чанкинг остаётся задачей тюнинга, а не решённой проблемой. Дефолты, которые держатся в 2026:
- 800–1200 токенов на чанк с перекрытием 100–200 токенов для обычного текста.
- Целая функция для кода, с путём к файлу и именем класса в заголовке.
- Семантический чанкинг (сначала по заголовкам, потом по размеру) для технической документации.
- Всегда храните ID родительского документа и стабильный ID чанка, чтобы цитаты резолвились обратно к источнику.
Не поддавайтесь искушению чанкать слишком мелко. Чанки меньше 500 токенов теряют контекст и заставляют reranker делать работу, которую должен был сделать embedder.
Надёжные цитаты
Галлюцинированные цитаты — самый быстрый способ потерять доверие пользователя. Паттерн, который работает на Claude:
- Помечайте каждый retrieved-чанк в промпте явным ID:
[1] (источник: docs/auth.md): ...текст... - В системном промпте инструктируйте Claude цитировать каждое фактическое утверждение скобочным ID и отказываться отвечать, если утверждение не подкреплено retrieved-чанком.
- Постпроцессингом проверяйте, что каждый
[N]действительно соответствует чанку, который вы отправили. Удаляйте или помечайте те, что не сходятся.
Шаг 3 не обсуждается. Даже Sonnet 4.6 иногда выдумывает ID цитаты под давлением; верификатор — это то, что делает систему доверенной.
Минимальный пайплайн на Claudexia
Вот рабочий скетч полного цикла — embed, retrieve, rerank, cite — через эндпоинт Claudexia:
import anthropic
import voyageai
import cohere
client = anthropic.Anthropic(
base_url="https://api.claudexia.tech/v1",
api_key="<ваш-claudexia-ключ>",
)
voyage = voyageai.Client()
co = cohere.Client()
def answer(question: str, corpus_chunks: list[dict]) -> str:
# 1. Эмбеддим запрос
q_emb = voyage.embed([question], model="voyage-3-large").embeddings[0]
# 2. Векторный retrieval top-50 (вызов вашего vector store)
candidates = vector_store.search(q_emb, k=50)
# 3. Reranking в top-10 через Cohere
reranked = co.rerank(
model="rerank-3",
query=question,
documents=[c["text"] for c in candidates],
top_n=10,
)
top = [candidates[r.index] for r in reranked.results]
# 4. Собираем контекст с цитатами
context = "\n\n".join(
f"[{i+1}] (источник: {c['source']}): {c['text']}"
for i, c in enumerate(top)
)
# 5. Вызов Claude с закэшированным системным промптом
msg = client.messages.create(
model="claude-sonnet-4.6",
max_tokens=1024,
system=[
{
"type": "text",
"text": "Ты — точный ассистент. Цитируй каждое "
"фактическое утверждение скобочным ID вида [1]. "
"Если ни один источник не подтверждает ответ — "
"так и скажи.",
"cache_control": {"type": "ephemeral"},
}
],
messages=[
{
"role": "user",
"content": f"{context}\n\nВопрос: {question}",
}
],
)
return msg.content[0].text
Маркер cache_control — это рычаг, который включает 10-кратную скидку
на системный промпт между вызовами. Для полностью набитой базы знаний
переносите сам корпус в закэшированный системный блок, а не в
пользовательское сообщение — тот же паттерн, гораздо больше экономии.
Оценивайте retrieval и генерацию отдельно
Самая полезная дисциплина в продакшн-RAG — измерять две стадии независимо:
- Качество retrieval: recall@k на размеченном наборе пар (вопрос, правильный документ). Если recall@10 ниже ~0.85, никакая prompt-инженерия ответ не спасёт.
- Качество генерации: faithfulness (соответствует ли ответ retrieved-контексту) и корректность ответа, оценённые либо людьми, либо LLM-судьёй на отдельном eval-наборе.
Смешивая эти метрики, команды «чинят» проблемы генерации тюнингом retriever и наоборот. Держите их раздельно.
Типовые грабли
- Lost-in-the-middle. Даже с 200K токенов Claude надёжнее всего обращает внимание на начало и конец контекста. Кладите самые релевантные чанки в начало, вопрос — в конец, и не закапывайте критичные факты в середину 100K-токенной стены.
- Галлюцинации цитат. Всегда проверяйте, что цитированные ID существуют. Непроверенная цитата — это сбой, а не предупреждение.
- Инвалидация кэша. Любое изменение кэшируемого префикса — даже пробел — сбрасывает кэш. Версионируйте системные промпты и шаблоны.
- Устаревшие эмбеддинги. При апгрейде модели эмбеддингов переэмбеддите весь корпус. Vector store со смесью моделей деградирует тихо.
- Over-retrieval без reranking. Тащить top-100 чанков и сразу пихать в промпт — дорого и хуже по качеству. Всегда rerank.
Итог
Выигрышный RAG-стек 2026 года скучный в самом хорошем смысле: закэшированный системный промпт, Sonnet 4.6 как генератор, эмбеддинги Voyage, reranker от Cohere или BGE, гибридный BM25+vector retrieval и верификатор цитат на выходе. Каждая часть дешёвая, понятная и сама по себе улучшает качество. Вместе они дают систему, которая быстрая, аудируемая и стабильная по цене при росте корпуса. Подробности по ценам на Sonnet 4.6 и остальное семейство — в нашем спутниковом посте про цены Claude API в 2026.