Перейти к содержимому
RAG

RAG на Claude в 2026: как сделать точный retrieval и снизить стоимость

Пошаговый RAG на Claude: когда нужен retrieval, как устроить 200K-контекст, prompt caching, цитирование источников и стабильное качество ответов.

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-токена, чтение — радикально дешевле.

Для стабильной базы знаний это означает:

  1. Первый вызов: платим полную цену за запись кэша (~25% надбавки на кэшируемой части).
  2. Каждый следующий вызов в пределах 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:

  1. Помечайте каждый retrieved-чанк в промпте явным ID: [1] (источник: docs/auth.md): ...текст...
  2. В системном промпте инструктируйте Claude цитировать каждое фактическое утверждение скобочным ID и отказываться отвечать, если утверждение не подкреплено retrieved-чанком.
  3. Постпроцессингом проверяйте, что каждый [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.