Reranker в RAG, это cross-encoder-модель, которая переранжирует top-N документов, полученных от векторной или гибридной ретривальной системы, чтобы поставить самые релевантные ответы на первые позиции перед передачей в LLM. В отличие от bi-encoder-эмбеддингов, reranker обрабатывает пару (запрос, документ) одним прямым проходом трансформера и потому ловит семантику, которую независимые векторы упускают. В 2026 году это фактически обязательный слой производственного RAG: по данным Anthropic Contextual Retrieval, добавление reranker снижает failure rate ретривала на 67% (с 5,7% до 1,9%).
Reranker снижает частоту ошибок RAG до 67% (Anthropic Contextual Retrieval, сентябрь 2024) и добавляет 5–20 пунктов NDCG@10 к базовой ретривальной системе.
Коммерческие лидеры 2026: Cohere Rerank 4 (16 декабря 2025, контекст 32K, 100+ языков) и Voyage rerank-2.5 (11 августа 2025, рекомендация Anthropic, $0,05 за 1M токенов).
Open-source лидеры: Qwen3-Reranker (0.6B/4B/8B, Apache 2.0), BGE Reranker v2, Mixedbread mxbai-rerank-large-v2 (BEIR NDCG@10 = 57,49) и ColBERTv2 для late-interaction.
Стоимость: reranking top-100 документов cross-encoder-моделью добавляет 100–300 мс задержки и часто окупается ростом Recall@10 с 78% до 91%.
Стандартная метрика оценки — NDCG@10 из BEIR/MTEB; MAP@10 применим только к бинарной релевантности.
Что такое reranker в RAG-пайплайне?
Начнём с базы. Reranker, это второй этап двухступенчатой ретривальной архитектуры. На первом этапе быстрый поиск (BM25, dense-эмбеддинги, гибрид) возвращает большой список кандидатов, обычно top-50, top-100 или даже top-500. Этот этап оптимизирован на recall: важно не потерять правильный документ, а не выстроить их идеально. Второй этап, reranker, берёт этот список и пересчитывает точный score для каждой пары (query, doc), выдавая топ-3–10 наиболее релевантных фрагментов для контекста LLM.
Зачем нужна такая двухступенчатость? Потому что cross-encoder, который даёт хорошее качество, слишком дорог, чтобы прогнать его по миллиону документов на каждый запрос. А bi-encoder (эмбеддинг), который дёшев и работает через ANN-индекс, слишком груб для финального выбора: он не видит взаимодействия между конкретным словом запроса и конкретным словом документа. Reranker закрывает этот разрыв. Precision повышает бесплатная (относительно) обработка первых 100 кандидатов, а recall обеспечивается быстрым индексом на десятках миллионов чанков.
Практически reranker решает четыре проблемы. Во-первых, отсеивает шумные кандидаты, семантически близкие, но нерелевантные вопросу. Во-вторых, снижает эффект lost-in-the-middle, когда LLM игнорирует документы в середине длинного контекста. В-третьих, позволяет использовать более агрессивное чанкирование и большие top-k без потери качества ответа. В-четвёртых, экономит токены на LLM: вместо 20 средних документов вы даёте 5 лучших. Подробнее про базовый пайплайн и выбор чанк-стратегии я разобрал в статье RAG-пайплайны от А до Я.
Cross-encoder vs bi-encoder: техническое отличие
Разница между этими двумя классами моделей фундаментальна для понимания, почему reranker вообще нужен. Bi-encoder (то, что делают почти все эмбеддинговые модели, включая text-embedding-3-large, voyage-3-large, bge-m3) энкодит запрос и документ независимо. Каждый превращается в фиксированный вектор длиной 512–4096 измерений, а близость считается косинусом. Векторы документов вычисляются заранее и хранятся в векторной базе, что даёт O(1) на запрос через ANN-поиск. Плата за скорость, точность: модель никогда не «видит» запрос и документ одновременно.
Cross-encoder берёт конкатенированный вход [CLS] запрос [SEP] документ [SEP] и прогоняет его через полный self-attention трансформера. На выходе одно число, релевантность. Никакого предварительного кэширования: на каждый запрос нужно N прямых проходов, где N, количество кандидатов. Но качество принципиально выше, потому что self-attention явно моделирует взаимодействие каждого токена запроса с каждым токеном документа. Именно это и превращает «похоже по теме» (bi-encoder) в «отвечает на вопрос» (cross-encoder).
Есть и промежуточный класс, late-interaction модели (ColBERT, ColBERTv2, JaColBERTv2.5). Они кодируют запрос и документ на уровне токенов и вычисляют MaxSim по всем парам. Это дешевле cross-encoder (потому что документы можно предвычислить), но точнее bi-encoder. ColBERTv2 (arXiv 2112.01488) с residual-компрессией даёт 6–10-кратное снижение размера индекса; JaColBERTv2.5 (2025, 110M параметров) обучается меньше чем за 15 часов на 4×A100 и держит средний скор 0,754 на японских IR-бенчмарках.
Cohere Rerank 4 вышел 16 декабря 2025 года и заменил Rerank 3.5. Есть две версии: Rerank 4 Pro (~1627 ELO на внутренней таблице Cohere) и Rerank 4 Fast (~1506 ELO, также доступна как cohere-rerank-4-fast в Pinecone). Ключевые улучшения: контекст расширен до 32K токенов (у 3.5 было 4K), поддержка 100+ языков, JSON, таблиц и кода. Прайс Rerank 3.5 составлял $2,00 за 1000 «поисков» (1 поиск = 1 запрос + до 100 документов, то есть $0,001 за запрос). Changelog v4 оставил модель формально «доступной по подписке»; конкретные цены смотрите в актуальном billing-разделе Cohere.
Voyage AI rerank-2.5 / rerank-2.5-lite вышел 11 августа 2025 и рекомендуется Anthropic по умолчанию. Контекст 32K на документе (8K на запросе), 100+ языков, instruction-following: reranker понимает инструкции вида «предпочитай недавние регуляторные документы» прямо в запросе. Цены агрессивные, $0,05 за 1M входных токенов для rerank-2.5 и $0,02 для rerank-2.5-lite. Первые 200M токенов бесплатно на аккаунт, Batch API даёт 33% скидки. Voyage утверждает +7,94% на 93-датасетном сьюте и +12,70% на MAIR относительно Cohere Rerank 3.5, плюс +3,26% NDCG@10 в среднем по разным first-stage ретриверам.
Jina Reranker v2 (jina-reranker-v2-base-multilingual): 1024 токена контекста, 100+ языков, function-calling для агентного RAG, 6x ускорение относительно v1. Первые 10M токенов бесплатно на новый ключ, дальше $0,02/1M. Сейчас Jina продвигает Reranker v3, веса выложены на Hugging Face. Pinecone-rerank-v0, собственная модель Pinecone, заявленный прирост accuracy +60%. Также Pinecone хостит bge-reranker-v2-m3 по $0,002 за запрос.
BAAI BGE Reranker v2, де-факто стандарт open-source, Apache 2.0. Семейство состоит из четырёх моделей: bge-reranker-v2-m3 (лучший баланс speed/quality, мультиязычный, база BGE-M3), bge-reranker-v2-gemma (Gemma-2B, лучшее мультиязычное качество), bge-reranker-v2-minicpm-layerwise (MiniCPM-2B с выбираемым слоем 8–40 на inference, trade-off качество/скорость на лету) и bge-reranker-v2.5-gemma2-lightweight (Gemma2-9B с token compression + layerwise reduction, SOTA на BEIR и MIRACL на релизе). Модели оцениваются на CMTEB-retrieval (переранжируя top-100 от bge-zh-v1.5) и MIRACL.
Qwen3-Reranker (Apache 2.0), три варианта: 0.6B, 4B и 8B параметров. Контекст 32K, 100+ языков, instruction-aware, как и Voyage, понимает инструкции в запросе. Сибблинг Qwen3-Embedding-8B держит #1 на MTEB multilingual (скор 70,58). Честно говоря, в 2026 году 4B-вариант Qwen3-Reranker, это мой личный дефолт для новых open-source деплойментов. Качество примерно уровня Cohere Rerank 3.5 без внешних API-вызовов и без счетов в конце месяца.
Mixedbread mxbai-rerank-v2 (Apache 2.0, 2025) обучен через GRPO reinforcement learning, contrastive и preference learning. Две версии: mxbai-rerank-base-v2 (0.5B, BEIR NDCG@10 = 55,57, Mr.TyDi 28,56) и mxbai-rerank-large-v2 (1.5B, BEIR NDCG@10 = 57,49, 0,89 с/запрос на NFC на A100, до 8x быстрее сопоставимых моделей). Контекст 8K (совместим с 32K), 100+ языков, отдельно хорошо ранжирует код (31,73 на code-датасете).
RankGPT / RankLLM, listwise LLM-reranker'ы. RankGPT (Sun et al., 2023) использует sliding-window listwise ranking с O(n) сложностью. Тулкит RankLLM (принят на SIGIR 2025) включает MonoT5 (pointwise), DuoT5 (pairwise), RankZephyr (7B, fine-tuned на данных RankGPT4), RankVicuna, RankGemini. ICR (ICLR 2025) режет латентность RankGPT на 60%. Использовать LLM как reranker имеет смысл, когда нужна интерпретируемость решения или специфичный тон запроса, но за это платите латентностью и стоимостью на порядок выше специализированных cross-encoder.
Сравнительная таблица reranker'ов 2026
Reranker
Тип
Контекст
Мультиязычность
Цена / лицензия
Когда выбирать
Cohere Rerank 4
Cross-encoder (API)
32K
100+ языков
По подписке (~$0,001/запрос у v3.5)
Enterprise-стек с уже подключённым Cohere; JSON/таблицы/код
Voyage rerank-2.5
Cross-encoder (API)
32K
100+ языков
$0,05/1M токенов, 200M бесплатно
Anthropic Claude-стек; instruction-following в запросах
Voyage rerank-2.5-lite
Cross-encoder (API)
32K
100+ языков
$0,02/1M токенов
Бюджетный вариант с сохранением качества
Jina Reranker v2
Cross-encoder (API)
1K
100+ языков
$0,02/1M, 10M бесплатно
Короткие чанки, function-calling для агентов
Qwen3-Reranker 4B
Cross-encoder (OSS)
32K
100+ языков
Apache 2.0
Дефолт для self-hosted в 2026; instruction-aware
bge-reranker-v2-m3
Cross-encoder (OSS)
8K
Мульти
Apache 2.0
Баланс speed/quality на CPU/GPU; проверенная классика
mxbai-rerank-large-v2
Cross-encoder (OSS)
8K (до 32K)
100+ языков
Apache 2.0
Максимум BEIR NDCG@10 (57,49) среди 1.5B моделей; код и китайский
ColBERTv2 / JaColBERTv2.5
Late-interaction
512
Многоязычные варианты есть
MIT / Apache 2.0
Когда нужна precomputed скорость + качество выше bi-encoder
Практический пайплайн: hybrid search + RRF + rerank на Python
Так, а теперь к рабочему коду полного пайплайна: BM25 и dense retrieval в параллель, Reciprocal Rank Fusion (RRF, k=60), затем Cohere Rerank 4. Пайплайн намеренно построен на компонентах, которые легко заменяются. Pgvector можно поменять на Qdrant (подробности в статье Сравнение векторных баз данных 2026), а Cohere Rerank, на локальный Qwen3-Reranker через sentence-transformers.
import asyncio
import cohere
from rank_bm25 import BM25Okapi
from qdrant_client import AsyncQdrantClient
co = cohere.ClientV2(api_key="YOUR_COHERE_KEY")
qdrant = AsyncQdrantClient(url="http://localhost:6333")
async def dense_search(query_vec, k=100):
hits = await qdrant.search(
collection_name="docs",
query_vector=query_vec,
limit=k,
)
return [(h.payload["doc_id"], h.payload["text"], h.score) for h in hits]
def bm25_search(bm25: BM25Okapi, corpus_ids, corpus_texts, query: str, k=100):
scores = bm25.get_scores(query.lower().split())
ranked = sorted(zip(corpus_ids, corpus_texts, scores), key=lambda x: -x[2])
return ranked[:k]
def rrf_fuse(rankings: list[list[tuple]], k_rrf: int = 60):
"""Reciprocal Rank Fusion: score = sum(1 / (k_rrf + rank_in_list))."""
fused: dict[str, dict] = {}
for lst in rankings:
for rank, (doc_id, text, _score) in enumerate(lst):
if doc_id not in fused:
fused[doc_id] = {"text": text, "score": 0.0}
fused[doc_id]["score"] += 1.0 / (k_rrf + rank + 1)
return sorted(
[(d, v["text"], v["score"]) for d, v in fused.items()],
key=lambda x: -x[2],
)
async def hybrid_rerank(query: str, query_vec, bm25, corpus_ids, corpus_texts, top_n=5):
dense_task = asyncio.create_task(dense_search(query_vec, k=100))
sparse = bm25_search(bm25, corpus_ids, corpus_texts, query, k=100)
dense = await dense_task
fused = rrf_fuse([dense, sparse], k_rrf=60)[:100]
resp = co.rerank(
model="rerank-v4.0", # Cohere Rerank 4
query=query,
documents=[t for _id, t, _s in fused],
top_n=top_n,
)
return [(fused[r.index][0], fused[r.index][1], r.relevance_score)
for r in resp.results]
Ключевые моменты. Во-первых, dense и sparse запускаются параллельно через asyncio.create_task, это экономит около 60 мс на паре запросов и держит суммарную латентность retrieval ~120 мс вместо ~180 мс. Во-вторых, k_rrf=60, эмпирически лучший default из оригинальной статьи Cormack et al.; менять его без A/B-теста бессмысленно. В-третьих, top-N после reranker равен 5, а не 20. LLM с длинным контекстом (Claude Opus 4, Gemini 2.5) страдают от lost-in-the-middle даже на 10 документах, так что чем чище top-N, тем лучше ответ. Я на этом обжигался в последнем проекте: увеличил top-N с 5 до 15, «чтобы точно ничего не потерять», и получил заметное падение качества ответов на длинных вопросах.
Метрики качества: NDCG@10, BEIR и Anthropic Contextual Retrieval
Стандартная метрика оценки retrieval и reranking в 2026 году, NDCG@10 (Normalized Discounted Cumulative Gain на топ-10). Она rank-aware (документ на 1-м месте ценнее, чем на 10-м), поддерживает graded relevance (0, 1, 2, 3, а не только да/нет) и нормирована в диапазон 0–1. MAP@10 (Mean Average Precision) применим только к бинарной релевантности и часто занижает разницу между хорошим и отличным ранжированием. MRR (Mean Reciprocal Rank) полезен, если ответ ровно один, например, поиск на StackOverflow. Для RAG почти всегда правильный дефолт, NDCG@10.
Основной публичный бенчмарк, BEIR (arXiv 2104.08663): 18 zero-shot IR-датасетов, включая MS MARCO, Natural Questions, TREC-COVID, FiQA, HotpotQA. С 2024 года BEIR, подмножество MTEB, что позволяет сравнивать embedding и rerank в единой рамке. Для мультиязычности используется MIRACL: 18 языков, включая русский, арабский, японский и хинди. Для reranker'ов есть отдельная под-таблица MTEB Reranking с датасетами AskUbuntu, StackOverflow, SciDocsRR и MIND.
Пример из практики. Anthropic в Contextual Retrieval (сентябрь 2024) измеряли failure rate, процент запросов, где правильный документ вообще не попал в top-20. Голый Contextual Embeddings давал −35% failures относительно baseline, +Contextual BM25 давал −49%, а +Reranking, −67% (падение 5,7% → 1,9%). Причём стоимость всей схемы с prompt caching, около $1,02 на 1M токенов документов, что заметно дешевле, чем принято считать. На финансовом датасете MultiHiertt reranking поднимает NDCG@10 с 0,247 до 0,458, почти в два раза. Databricks в своих кейсах фиксирует до +48% к retrieval quality после добавления reranker.
Латентность, стоимость и когда reranker не нужен
Reranking top-100 документов cross-encoder-моделью типично добавляет 100–300 мс к общей латентности запроса, а в оптимизированных деплойментах меньше 200 мс. Late-interaction (ColBERTv2) даёт около 50–80 мс, но требует специализированного индекса. Стоимость коммерческих API, как правило, доли цента на запрос: у Cohere ~$0,001/запрос, у Voyage ~$0,05 за 1M токенов (при среднем чанке 500 токенов и top-100 это ~$0,0025/запрос). Self-hosted Qwen3-Reranker 4B на одной A10G держит около 40–70 запросов в секунду при батчинге и стоит только амортизации GPU.
Когда reranker не нужен? Во-первых, если у вас очень маленький корпус (<1000 документов) и хороший embedding сам по себе выдаёт правильный ответ на 1-м месте, reranker будет добавлять шум. Во-вторых, если запросы всегда очень короткие и точные (SKU-поиск, id-lookup), bi-encoder или BM25 хватит с запасом. В-третьих, если end-to-end бюджет латентности <200 мс, а вы уже потратили 150 мс на retrieval: либо кэшируйте частые запросы, либо переходите на late-interaction. Во всех остальных случаях reranker в 2026 году, это must-have, а не «оптимизация на потом». Как и в случае со структурированным выводом LLM, «просто напиши prompt получше» здесь не работает: качество ретривала лечится архитектурой пайплайна, а не переписыванием инструкций.
Часто задаваемые вопросы
Что такое reranker в RAG простыми словами?
Reranker, это модель, которая переупорядочивает список документов от первого этапа поиска (BM25 или векторный поиск) так, чтобы самые релевантные вопросу документы оказались в самом верху. Технически это cross-encoder: трансформер, который на вход получает пару «запрос + документ» и выдаёт один число-score. В RAG-пайплайне reranker обычно берёт top-100 кандидатов и оставляет top-5–10 для передачи в LLM.
Какой лучший reranker для RAG в 2026 году?
Для коммерческих API-стеков, Cohere Rerank 4 (лучший «универсал», enterprise-фичи) или Voyage rerank-2.5 (дешевле, рекомендация Anthropic, поддерживает instruction-following). Для self-hosted, Qwen3-Reranker 4B или Mixedbread mxbai-rerank-large-v2 (BEIR NDCG@10 = 57,49). «Лучший» зависит от домена: перед выбором прогоните 200–500 размеченных запросов через 3–4 кандидата и сравните NDCG@10 и MRR на своих данных.
В чём разница между cross-encoder и bi-encoder?
Bi-encoder энкодит запрос и документ независимо в отдельные векторы и сравнивает их косинусом, быстро (O(1) через ANN), но неточно. Cross-encoder подаёт пару [запрос, документ] в один прямой проход трансформера и через полное self-attention выдаёт релевантность: точно, но дорого (нельзя предвычислить). В RAG bi-encoder используется на первом этапе (retrieval) для скорости, cross-encoder, на втором этапе (reranking) для качества.
Насколько reranking улучшает точность RAG?
По публичным бенчмаркам, прирост 5–20 пунктов NDCG@10, что соответствует 15–30% росту precision. Anthropic зафиксировал снижение failure rate ретривала с 5,7% до 1,9% (−67%) при добавлении reranker поверх Contextual Embeddings + BM25. На финансовом MultiHiertt reranking поднял NDCG@10 с 0,247 до 0,458. Реальный прирост зависит от домена: на узких технических корпусах эффект больше, на широких открытых, меньше.
Сколько задержки добавляет reranker к RAG-запросу?
Cross-encoder reranking top-100 документов типично добавляет 100–300 мс к общей латентности запроса, в оптимизированных сетапах меньше 200 мс. Late-interaction модели вроде ColBERTv2 добавляют 50–80 мс. LLM-based rerankers (RankGPT, RankLLM) требуют от 500 мс до нескольких секунд. Для большинства RAG-приложений с суммарным SLO 1–3 секунды 200 мс reranker'а окупаются с запасом за счёт качества ответа.
Практическое сравнение Guardrails AI, NeMo Guardrails и Llama Guard 4 в 2026 году: как выбрать фреймворк, куда встраивать, чем защититься от prompt injection и PII-утечек. С кодом на Python и грабельницей от инженера-практика.
Практическое руководство по prompt caching в OpenAI, Anthropic и Gemini на 2026 год: цены, TTL, cache_control breakpoints, совместимость с tool use и мониторинг hit rate с примерами на Python.