0Pricing
AI Engineering Academy · Lekcja

Re-ranking za pomocą cross-encodera z Cohere i BGE

Zintegruj endpoint rerank firmy Cohere oraz model BGE-reranker, aby oceniać pary zapytanie–dokument i porządkować fragmenty top-k według rzeczywistej trafności.

Re-ranking za pomocą cross-encodera z Cohere i BGE to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 2 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Czym jest cross-encoder?

Cross-encoder to model neuronowy, który przyjmuje zapytanie i dokument jako jeden połączony tekst wejściowy i zwraca wynik trafności. W przeciwieństwie do bi-encodera, który tworzy embedding zapytania i dokumentu osobno, warstwy attention cross-encodera widzą oba teksty jednocześnie, dzięki czemu może on modelować szczegółowe sygnały trafności, których bi-encoder nie wychwytuje. To wspólne przetwarzanie sprawia, że cross-encodery są znacznie dokładniejsze podczas szeregowania.

# Bi-encoder: separate encoding
query_vec = encoder.encode(query)          # [768] vector
doc_vec = encoder.encode(document)         # [768] vector
score = cosine_similarity(query_vec, doc_vec)  # compare independently

# Cross-encoder: joint encoding
combined_input = '[CLS] ' + query + ' [SEP] ' + document + ' [SEP]'
logits = cross_encoder.forward(combined_input)  # score from joint attention
# The model attends from every query token to every document token

API Cohere Rerank

Cohere Rerank to hostowane w chmurze API do ponownego szeregowania za pomocą cross-encodera. Przyjmuje zapytanie i listę zawierającą do 1000 tekstów dokumentów, a następnie zwraca wyniki trafności. Wykorzystuje duże modele cross-encoderów trenowane na wysokiej jakości zbiorach danych do szeregowania i konsekwentnie przewyższa samodzielnie hostowane małe cross-encodery w większości testów porównawczych. Opłata za API jest naliczana za każdy tysiąc ponownie uszeregowanych dokumentów.

import cohere

co = cohere.Client('YOUR_COHERE_API_KEY')

candidates = [
    'How to configure pgvector in PostgreSQL for vector search',
    'BM25 scoring formula and hyperparameters explained',
    'Installing and using the pgvector extension for embeddings',
    'Hybrid search combining BM25 and dense retrieval',
]

result = co.rerank(
    model='rerank-english-v3.0',
    query='pgvector setup guide',
    documents=candidates,
    top_n=3,
    return_documents=True,
)

for item in result.results:
    print(f'Score {item.relevance_score:.4f}: {item.document.text[:60]}')

Cohere Rerank w potoku RAG

Integracja Cohere Rerank z potokiem RAG przebiega według prostego schematu: pobierz 20–50 kandydatów z magazynu wektorowego, wyodrębnij ich tekst, wywołaj API Cohere Rerank, a następnie przekaż wyniki z pierwszych K pozycji do LLM. Narzut opóźnienia wynosi zazwyczaj 100–300 ms, co jest akceptowalne, gdy poprawa precyzji prowadzi do uzyskania lepszych odpowiedzi końcowych.

import cohere
from openai import OpenAI

co = cohere.Client('COHERE_KEY')
client = OpenAI()

def rag_with_rerank(question: str, retriever, top_k: int = 5) -> str:
    # Stage 1: coarse retrieval
    candidates = retriever.invoke(question)  # returns 30 docs
    texts = [doc.page_content for doc in candidates]

    # Stage 2: Cohere re-ranking
    rerank_result = co.rerank(
        model='rerank-english-v3.0',
        query=question,
        documents=texts,
        top_n=top_k,
    )
    top_texts = [texts[r.index] for r in rerank_result.results]
    context = '\n\n'.join(top_texts)

    # Stage 3: generation
    response = client.chat.completions.create(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'Answer using only the provided context.'},
            {'role': 'user', 'content': f'Context:\n{context}\n\nQuestion: {question}'},
        ],
    )
    return response.choices[0].message.content

BGE Reranker: alternatywa open source

BGE Reranker (BAAI General Embedding) to rodzina modeli cross-encoderów open source opracowana przez Beijing Academy of AI. Model BAAI/bge-reranker-v2-m3 obsługuje ponowne szeregowanie wielojęzyczne i osiąga wyniki zbliżone do Cohere Rerank w testach porównawczych dla języka angielskiego, działając lokalnie. Użyj go z biblioteką sentence-transformers, aby uzyskać w pełni samodzielnie hostowane ponowne szeregowanie bez kosztów API.

from sentence_transformers import CrossEncoder

# Load BGE reranker model
reranker = CrossEncoder(
    'BAAI/bge-reranker-v2-m3',
    max_length=512,
    device='cpu',  # use 'cuda' if GPU is available
)

def bge_rerank(query: str, documents: list[str], top_k: int = 5) -> list[dict]:
    pairs = [[query, doc] for doc in documents]
    scores = reranker.predict(pairs, show_progress_bar=False)
    ranked = sorted(
        zip(documents, scores.tolist()),
        key=lambda x: x[1],
        reverse=True,
    )
    return [{'text': doc, 'score': score} for doc, score in ranked[:top_k]]

Warianty modeli BGE Reranker

Rodzina rerankerów BGE oferuje kompromisy między rozmiarem a jakością. bge-reranker-base (278 mln parametrów) jest najszybszy i najmniejszy. bge-reranker-large (560 mln parametrów) jest dokładniejszy. bge-reranker-v2-m3 obsługuje wiele języków i jest zalecanym wyborem domyślnym w środowisku produkcyjnym. Aby uzyskać maksymalną dokładność, bge-reranker-v2-gemma korzysta z architektury bazowej Gemma i osiąga najlepsze wyniki w większości anglojęzycznych testów porównawczych wśród opcji open source.

# Model size vs accuracy trade-offs
models = [
    ('BAAI/bge-reranker-base',   '278M params', 'fast,   English-focused'),
    ('BAAI/bge-reranker-large',  '560M params', 'better, English-focused'),
    ('BAAI/bge-reranker-v2-m3',  '570M params', 'best for multilingual use'),
    ('BAAI/bge-reranker-v2-gemma', '2B params', 'SOTA open-source accuracy'),
]

# For most RAG applications, bge-reranker-v2-m3 offers the best
# balance of accuracy, multilingual support, and inference speed on CPU

Grupowanie predykcji cross-encodera

Domyślnie cross-encodery przetwarzają pary (zapytanie, dokument) pojedynczo, ale predykcja wsadowa znacznie zwiększa przepustowość, ponieważ umożliwia jednoczesne przepuszczanie wielu par przez model. Parametr batch_size określa, ile par jest przetwarzanych razem. W przypadku GPU typowe są rozmiary wsadu 32–128. Na CPU mniejsze wsady, liczące 4–16 elementów, zmniejszają obciążenie pamięci, a jednocześnie nadal zwiększają przepustowość w porównaniu z przetwarzaniem sekwencyjnym.

def batch_rerank(reranker, query: str, documents: list[str],
                 top_k: int = 5, batch_size: int = 32) -> list[dict]:
    pairs = [[query, doc] for doc in documents]

    # Batch prediction
    all_scores = reranker.predict(
        pairs,
        batch_size=batch_size,
        show_progress_bar=len(pairs) > 100,
    )

    ranked = sorted(
        zip(documents, all_scores.tolist()),
        key=lambda x: x[1],
        reverse=True,
    )
    return [{'text': doc, 'score': score} for doc, score in ranked[:top_k]]

Integracja LangChain CrossEncoderReranker

LangChain udostępnia CrossEncoderReranker jako kompresor dokumentów, który integruje ponowne szeregowanie za pomocą cross-encodera ze wzorcem ContextualCompressionRetriever. Umożliwia to opakowanie dowolnego istniejącego retrievera etapem ponownego szeregowania za pomocą zaledwie kilku wierszy kodu oraz podłączenie go do dowolnego łańcucha LCEL akceptującego interfejs retrievera.

from langchain.retrievers.document_compressors import CrossEncoderReranker
from langchain_community.cross_encoders import HuggingFaceCrossEncoder
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings

# Base retriever (coarse stage)
base_retriever = FAISS.from_documents(
    documents, OpenAIEmbeddings()
).as_retriever(search_kwargs={'k': 30})

# Re-ranker (fine stage)
model = HuggingFaceCrossEncoder(model_name='BAAI/bge-reranker-v2-m3')
compressor = CrossEncoderReranker(model=model, top_n=5)

# Combined two-stage retriever
two_stage_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=base_retriever,
)

docs = two_stage_retriever.invoke('how does hybrid search work?')

Interpretacja wyników i progowanie

Wyniki cross-encodera nie mają uniwersalnej skali. Reranker BGE zwraca surowe logity (często z zakresu od -10 do +10), podczas gdy Cohere zwraca znormalizowany wynik trafności z przedziału od 0 do 1. Można zastosować minimalny próg wyniku, aby wykluczyć z kontekstu przesyłanego do LLM dokumenty o bardzo niskiej trafności i jeszcze bardziej ograniczyć szum. Zacznij od progu na poziomie 25. percentyla wyników, a następnie dostosuj go na podstawie obserwacji.

def rerank_with_threshold(reranker, query, documents, top_k=5, min_score=-2.0):
    pairs = [[query, doc] for doc in documents]
    scores = reranker.predict(pairs)

    scored_docs = [
        {'text': doc, 'score': float(score)}
        for doc, score in zip(documents, scores)
        if float(score) >= min_score  # filter low-relevance docs
    ]

    scored_docs.sort(key=lambda x: x['score'], reverse=True)

    if not scored_docs:
        return []  # nothing passed the threshold
    return scored_docs[:top_k]

Cohere a BGE: co wybrać?

Wybierz Cohere Rerank, jeśli chcesz korzystać z zarządzanego API, potrzebujesz najwyższej dokładności w anglojęzycznych danych korporacyjnych i chcesz uniknąć infrastruktury GPU. Wybierz BGE Reranker, jeśli potrzebujesz samodzielnego hostowania ze względu na prywatność danych, chcesz uniknąć opłat za każde zapytanie do API, potrzebujesz obsługi wielu języków lub chcesz działać offline. Oba rozwiązania osiągają podobne wyniki NDCG w większości testów porównawczych — wybór zależy przede wszystkim od preferencji dotyczących infrastruktury i modelu kosztów.

Ponowne szeregowanie treści wielojęzycznych

Jeśli Twój korpus lub użytkownicy obejmują wiele języków, wybierz wielojęzyczny cross-encoder. bge-reranker-v2-m3 obsługuje ponad 100 języków, a Cohere Rerank ma wielojęzyczny wariant modelu. Obsługiwane jest również ponowne szeregowanie międzyjęzykowe — ocenianie angielskiego zapytania względem dokumentów w języku francuskim lub hiszpańskim — co jest przydatne we wdrożeniach korporacyjnych o globalnym zasięgu, w których bazy wiedzy istnieją w wielu językach.

from sentence_transformers import CrossEncoder

# Multilingual BGE reranker
ml_reranker = CrossEncoder('BAAI/bge-reranker-v2-m3')

# Cross-lingual example: English query, French document
query_en = 'How to configure vector search?'
doc_fr = 'La configuration de la recherche vectorielle dans PostgreSQL'

score = ml_reranker.predict([[query_en, doc_fr]])
print(f'Cross-lingual relevance score: {float(score):.3f}')
# Positive score indicates the document is relevant to the query
# despite being in a different language

Buforowanie wyników ponownego szeregowania

Wnioskowanie za pomocą cross-encodera jest najwolniejszą częścią potoku dwuetapowego. W aplikacjach, w których te same pary (zapytanie, dokument) często się powtarzają, buforowanie wyników ponownego szeregowania może wyeliminować zbędne wnioskowanie. Zahaszuj parę (zapytanie, document_id) jako klucz pamięci podręcznej i zapisz wynik w Redis z ustawionym TTL. W aplikacjach obsługi klienta, w których użytkownicy często zadają podobne pytania, współczynnik trafień pamięci podręcznej na poziomie 30–50 procent jest powszechny.

import redis
import hashlib
import json

r = redis.Redis(host='localhost', port=6379)

def cached_rerank_score(reranker, query: str, doc_text: str, doc_id: str) -> float:
    cache_key = 'rerank:' + hashlib.md5((query + doc_id).encode()).hexdigest()
    cached = r.get(cache_key)
    if cached:
        return float(cached)

    score = float(reranker.predict([[query, doc_text]]))
    r.setex(cache_key, 3600, str(score))  # cache 1 hour
    return score

Szybkie sprawdzenie

Sprawdź, czy rozumiesz ponowne szeregowanie za pomocą cross-encodera.

Podsumowanie lekcji

W tej lekcji dowiedziałeś się, że: Cohere Rerank udostępnia hostowane w chmurze API cross-encodera o najwyższej, najnowocześniejszej dokładności; BGE Reranker jest open source'ową alternatywą do wdrożeń samodzielnie hostowanych, także dla treści wielojęzycznych; a przetwarzanie wsadowe znacznie zwiększa przepustowość podczas oceniania wielu par (zapytanie, dokument). CrossEncoderReranker w LangChain integruje oba rozwiązania ze wzorcem ContextualCompressionRetriever. W następnej części zaimplementujemy kompresję kontekstową, aby ograniczyć szum w pobranych fragmentach.

Często zadawane pytania

Czy lekcja „Re-ranking za pomocą cross-encodera z Cohere i BGE” jest bezpłatna?

Tak — pełny tekst „Re-ranking za pomocą cross-encodera z Cohere i BGE” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Re-ranking za pomocą cross-encodera z Cohere i BGE”?

Zintegruj endpoint rerank firmy Cohere oraz model BGE-reranker, aby oceniać pary zapytanie–dokument i porządkować fragmenty top-k według rzeczywistej trafności. Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?

Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 2 z 4.

Ile czasu zajmuje lekcja „Re-ranking za pomocą cross-encodera z Cohere i BGE”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?

Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Dlaczego wyszukiwanie dwuetapowe działa
  2. Re-ranking za pomocą cross-encodera z Cohere i BGE
  3. Kompresja kontekstowa i filtrowanie trafności
  4. Pomiar wpływu re-rankingu
← Powrót do AI Engineering Academy