AI Engineering Academy · Lektion

Cross-encoder-reranking med Cohere og BGE

Integrér Cohere's rerank-endpoint og BGE-reranker-modellen for at score forespørgsels-dokument-par og omarrangere Deres top-k-chunks efter reel relevans.

Lektion 2 af 413 trin

Cross-encoder-reranking med Cohere og BGE er en gratis AI Engineering Academy-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i AI Engineering Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. AI Engineering Academy-kurset indeholder 4 lektioner i alt.

Hvad er en cross-encoder?

En cross-encoder er en neural model, der tager en forespørgsel og et dokument som ét sammenkædet input og returnerer en relevansscore. I modsætning til en bi-encoder, der indlejrer forespørgsel og dokument separat, ser cross-encoderens attention-lag begge tekster samtidig, så den kan modellere detaljerede relevanssignaler, som en bi-encoder overser. Det er denne fælles behandling, der gør cross-encodere betydeligt mere præcise til rangordning.

# 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

Cohere Rerank-API'et

Cohere Rerank er et cloud-hostet API til omrangering med en cross-encoder. Det accepterer en forespørgsel og en liste med op til 1000 dokumenttekster og returnerer relevansscorer. Det bruger store cross-encoder-modeller, der er trænet på rangordningsdatasæt af høj kvalitet, og klarer sig konsekvent bedre end små, selvhostede cross-encodere på de fleste benchmarks. API'et prissættes pr. tusind omrangerede dokumenter.

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 i et RAG-behandlingsforløb

Integration af Cohere Rerank i et RAG-behandlingsforløb følger et enkelt mønster: Hent 20-50 kandidater fra dit vektorlager, udtræk deres tekst, kald Cohere Rerank-API'et, og vælg de bedste K-resultater, der skal sendes videre til LLM'en. Den ekstra latenstid er typisk 100-300 ms, hvilket er acceptabelt, når den forbedrede præcision fører til bedre endelige svar.

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: Et open source-alternativ

BGE Reranker (BAAI General Embedding) er en open source-familie af cross-encoder-modeller fra Beijing Academy of AI. Modellen BAAI/bge-reranker-v2-m3 understøtter flersproget omrangering og opnår resultater tæt på Cohere Rerank på engelske benchmarks, samtidig med at den kører lokalt. Brug den sammen med biblioteket sentence-transformers for fuldt selvhostet omrangering uden API-udgifter.

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]]

Varianter af BGE Reranker-modellen

BGE-rerankerfamilien tilbyder afvejninger mellem størrelse og kvalitet. bge-reranker-base (278M parametre) er den hurtigste og mindste. bge-reranker-large (560M parametre) er mere præcis. bge-reranker-v2-m3 understøtter flere sprog og er det anbefalede standardvalg til produktion. For maksimal præcision bruger bge-reranker-v2-gemma en Gemma-kerne og fører på de fleste engelske benchmarks blandt open source-muligheder.

# 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

Batchbehandling af cross-encoder-forudsigelser

Cross-encodere behandler som standard par af (forespørgsel, dokument) ét ad gangen, men batch-forudsigelse forbedrer gennemløbet markant ved at køre flere par gennem modellen samtidig. Parameteren batch_size styrer, hvor mange par der behandles sammen. På en GPU er batchstørrelser på 32-128 typiske. På en CPU reducerer mindre batches på 4-16 hukommelsesbelastningen, samtidig med at gennemløbet stadig forbedres sammenlignet med sekventiel behandling.

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]]

Integration af LangChain CrossEncoderReranker

LangChain leverer CrossEncoderReranker som en dokumentkompressor, der integrerer omrangering med en cross-encoder i mønstret ContextualCompressionRetriever. Det lader dig indpakke enhver eksisterende retriever med et omrangeringstrin ved hjælp af blot få kodelinjer og tilslutte den til enhver LCEL-kæde, der accepterer en retriever-grænseflade.

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?')

Fortolkning af scorer og tærskelværdier

Cross-encoder-scorer har ikke en universel skala. BGE-rerankeren returnerer rå logits (ofte i intervallet -10 til +10), mens Cohere returnerer en normaliseret relevansscore mellem 0 og 1. Du kan anvende en minimumstærskel for scoren for at udelukke dokumenter med meget lav relevans fra den kontekst, der sendes til LLM'en, og dermed reducere støjen yderligere. Start med en tærskel ved 25-percentilen af scorerne, og juster derfra.

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 vs. BGE: Hvad skal du vælge?

Brug Cohere Rerank, når du ønsker et administreret API, har brug for den højeste præcision på engelske virksomhedsdata og vil undgå GPU-infrastruktur. Brug BGE Reranker, når du har brug for selvhosting af hensyn til databeskyttelse, ønsker ingen API-udgift pr. forespørgsel, har brug for flersproget understøttelse eller vil køre offline. Begge opnår lignende NDCG-scorer på de fleste benchmarks — valget handler primært om infrastrukturpræferencer og omkostningsmodel.

Omrangering af flersproget indhold

Hvis dit korpus eller dine brugere omfatter flere sprog, skal du vælge en flersproget cross-encoder. bge-reranker-v2-m3 håndterer over 100 sprog, og Cohere Rerank har en flersproget modelvariant. Omrangering på tværs af sprog — scoring af en engelsk forespørgsel mod dokumenter på fransk eller spansk — understøttes også. Det er nyttigt i globale virksomhedsimplementeringer, hvor vidensbaser findes på flere sprog.

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

Caching af omrangeringsresultater

Inferens med en cross-encoder er den langsomste del af en pipeline i to trin. For applikationer, hvor de samme par af (forespørgsel, dokument) ofte gentages, kan caching af omrangeringsresultater fjerne overflødig inferens. Hash parret (forespørgsel, document_id) som en cache-nøgle, og gem scoren i Redis med en TTL. Cache-hit-rater på 30-50 procent er almindelige i kundesupportapplikationer, hvor brugere ofte stiller lignende spørgsmål.

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

Hurtigt tjek

Test din forståelse af omrangering med cross-encodere ud fra denne lektion.

Opsummering af lektionen

I denne lektion lærte du, at Cohere Rerank leverer et cloud-hostet cross-encoder-API med state-of-the-art-præcision, at BGE Reranker er et open source-alternativ til selvhostet implementering, også til flersproget indhold, og at batchbehandling forbedrer gennemløbet markant ved scoring af mange par af (forespørgsel, dokument). LangChains CrossEncoderReranker integrerer begge dele i mønstret ContextualCompressionRetriever. Næste gang implementerer vi kontekstuel komprimering for at reducere støj i de hentede tekststykker.

Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
30
Lektioner
120

Ofte stillede spørgsmål

Er lektionen “Cross-encoder-reranking med Cohere og BGE” gratis?

Ja — hele teksten til “Cross-encoder-reranking med Cohere og BGE” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af AI Engineering Academy-kurset, skal du opgradere til CoddyKit PRO. AI Engineering Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Cross-encoder-reranking med Cohere og BGE”?

Integrér Cohere's rerank-endpoint og BGE-reranker-modellen for at score forespørgsels-dokument-par og omarrangere Deres top-k-chunks efter reel relevans. Du øver dig i AI Engineering Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på AI Engineering Academy?

Der kræves ingen tidligere erfaring. AI Engineering Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.

Hvor lang tid tager lektionen “Cross-encoder-reranking med Cohere og BGE”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne AI Engineering Academy-lektion?

Ja. Alle AI Engineering Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Hvorfor søgning i to trin virker
  2. Cross-encoder-reranking med Cohere og BGE
  3. Kontekstuel komprimering og relevansfiltrering
  4. Måling af effekten af reranking
← Tilbage til AI Engineering Academy