Tett kontra spredt gjenfinning: avveininger
Forstå når tette embedding-er ikke finner eksakte nøkkelordtreff, når BM25 ikke fanger opp semantiske parafraser, og hvorfor en kombinasjon konsekvent gir bedre resultater enn hver metode alene.
Tett kontra spredt gjenfinning: avveininger er en gratis leksjon i AI Engineering Academy på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI Engineering Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI Engineering Academy inneholder totalt 4 leksjoner.
To fundamentalt ulike signaler for henting
Moderne systemer for henting bygger på to ulike signaler: dense retrieval koder mening i kontinuerlige vektorrom, mens sparse retrieval teller nøyaktige termforekomster. Disse signalene utfyller hverandre og kan ikke erstatte hverandre. Å forstå styrkene og svakhetene til hvert signal er det første steget mot å bygge et system som bruker begge effektivt.
Slik fungerer tette embedding-er
Dense retrieval mapper både søket og hvert dokument til en vektor med mange dimensjoner ved hjelp av en nevral encoder. Likhet måles med cosine distance eller skalarprodukt mellom vektorene. Fordi encoderen er trent på store tekstkorpora, havner semantisk beslektede fraser nær hverandre i vektorrommet selv om de ikke har noen felles ord – dette er den viktigste fordelen med dense retrieval.
from openai import OpenAI
import numpy as np
client = OpenAI()
def embed(text: str) -> list[float]:
resp = client.embeddings.create(
model='text-embedding-3-small',
input=text,
)
return resp.data[0].embedding
def cosine_similarity(a, b):
a, b = np.array(a), np.array(b)
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))
q = embed('How do I cancel my subscription?')
d = embed('Steps to unsubscribe from the service')
print(cosine_similarity(q, d)) # high similarity despite different wordsNår dense retrieval mislykkes
Tette modeller har problemer med sjeldne termer som var lite representert under treningen av encoderen. Et søk som inneholder et spesifikt produktmodellnummer som RTX-4090-Ti-OC, et medisinsk legemiddelnavn eller en proprietær intern identifikator, vil ofte ikke finne det riktige dokumentet fordi encoderen ikke har lært en representasjon av denne tokensekvensen. Vektoren havner ganske enkelt et lite nyttig sted i embedding-rommet.
Slik fungerer BM25-henting med glisne vektorer
BM25 (Best Matching 25) er en probabilistisk rangeringsfunksjon som gir dokumenter poeng basert på hvor ofte søketermer forekommer i dokumentet. Poengsummen normaliseres etter dokumentlengde og dempes når termfrekvensen blir mettet. Funksjonen produserer en glissen poengvektor – de fleste dimensjonene er null fordi dokumenter bare inneholder en liten del av ordforrådet.
# BM25 scoring formula (conceptual)
# score(D, Q) = sum over query terms t of:
# IDF(t) * (tf(t,D) * (k1 + 1)) / (tf(t,D) + k1 * (1 - b + b * |D|/avgdl))
# k1 controls term frequency saturation (typically 1.2-2.0)
# b controls document length normalization (typically 0.75)
# IDF(t) = log((N - df(t) + 0.5) / (df(t) + 0.5))
# N = total documents, df(t) = documents containing term t
# tf(t,D) = frequency of t in document D, |D| = doc length, avgdl = average doc lengthBM25s styrker: Eksakte termer og fagspråk
BM25 er særlig god på søk som inneholder eksakte tekniske termer, produktnavn, feilkoder og numeriske identifikatorer som skal samsvare nøyaktig. Et søk etter ORA-01017 (en Oracle-feilkode) rangerer dokumenter som inneholder den nøyaktige tekststrengen, langt høyere enn dokumenter som bare omtaler databaseautentisering i generelle ordelag. Dette er umulig for en tett modell som aldri har sett den spesifikke koden.
from rank_bm25 import BM25Okapi
corpus = [
'Oracle database ORA-01017 invalid username or password logon denied',
'Database authentication and connection troubleshooting guide',
'How to resolve login errors in Oracle and MySQL databases',
]
tokenized_corpus = [doc.lower().split() for doc in corpus]
bm25 = BM25Okapi(tokenized_corpus)
query = 'ORA-01017 error fix'
scores = bm25.get_scores(query.lower().split())
print(dict(zip(range(len(corpus)), scores)))
# doc 0 scores highest because it contains ORA-01017Når BM25 mislykkes: Parafraser og synonymer
BM25 tar ikke hensyn til semantiske parafraser. Et dokument om «reparasjon av bilmotorer» får null poeng for et søk om «vedlikehold av automobile motorer» dersom ingen av de eksakte ordene overlapper. Dette problemet med ulikt ordforråd, som noen ganger kalles det leksikalske gapet, betyr at rent nøkkelordsøk går glipp av store mengder relevant innhold som ganske enkelt bruker andre ord for å uttrykke den samme ideen.
from rank_bm25 import BM25Okapi
corpus = [
'automobile engine repair and maintenance tips',
'car motor maintenance guide for beginners',
'vehicle powertrain service intervals',
]
tokenized = [doc.split() for doc in corpus]
bm25 = BM25Okapi(tokenized)
scores = bm25.get_scores(['car', 'motor', 'maintenance'])
print(scores)
# doc 1 scores high, doc 0 and 2 score lower despite being semantically relatedBenchmarkresultater: Hybridhenting vinner konsekvent
Benchmarktester på BEIR-, MS MARCO- og datasett for spørsmål og svar i virksomheter viser konsekvent at hybridhenting gir bedre resultater enn enten tett eller glissen henting alene, med 5–15 prosent på NDCG@10. Forbedringen er størst på datasett med en blanding av faktasøk (der BM25 hjelper) og parafrasesøk (der tette embedding-er hjelper). Ingen enkelt metode for henting dominerer på tvers av alle søketyper.
Analyse av søketype: Hvilken henter vinner
Du kan forutsi hvilken henter som vil fungere best, ved å analysere søketypen. Dense retrieval vinner på konseptuelle spørsmål, parafraser og brede temasøk. BM25 vinner på søk som inneholder egennavn, versjonsnumre, kodeutdrag, akronymer og sjeldne tekniske termer. Hybrid vinner alltid når søketypen ikke er kjent på forhånd – noe som nesten alltid er tilfellet i produksjon.
# Query type heuristics
def predict_retriever_advantage(query: str) -> str:
tokens = query.split()
has_numbers = any(t[0].isdigit() for t in tokens)
has_uppercase_acronyms = any(t.isupper() and len(t) > 2 for t in tokens)
is_short = len(tokens) <= 4
if has_numbers or has_uppercase_acronyms:
return 'BM25 likely wins (exact terms)'
elif is_short:
return 'Dense likely wins (semantic matching needed)'
else:
return 'Hybrid recommended (mixed signals)'Problemet med inkompatible poengsummer
Det er ikke trivielt å kombinere dense- og sparse-resultater fordi poengsummene deres er på uforenlige skalaer. Cosinuslikhet gir verdier mellom -1 og 1, mens BM25 gir ubegrensede positive poengsummer som avhenger av korpusets størrelse. De kan ikke bare legges sammen. Standardløsningen er å bruke rangbasert fusjon i stedet for poengsumbasert fusjon – altså å slå sammen rangerte lister i stedet for rå poengsummer.
Praktisk beslutning: Når bør hver metode brukes
Bruk dense-only-søk når korpuset tilhører et snevert domene med et konsistent vokabular, og De trenger semantisk generalisering på tvers av parafraser. Bruk BM25-only når forespørslene hovedsakelig er oppslag med nøyaktige identifikatorer, og datasettet er lite nok til at brute force er gjennomførbart. Bruk hybrid i alle RAG-systemer i produksjon der forespørselstypene varierer – ekstrakostnaden er moderat, og økningen i recall er betydelig.
Avveininger mellom ytelse og infrastruktur
Dense retrieval krever GPU-akselerert approximate nearest neighbor-søk eller en vektordatabase, noe som øker infrastrukturkostnadene. BM25 kjører utelukkende på CPU med en invertert indeks og er svært raskt. Hybrid retrieval krever begge infrastrukturkomponentene samt et fusjonstrinn. Den økte kompleksiteten er berettiget på grunn av forbedringen i recall for de fleste produksjonsbruksområder, men må veies opp mot infrastrukturbudsjettet.
Hurtigsjekk
Test forståelsen Deres av avveiningene mellom dense og sparse retrieval fra denne leksjonen.
Oppsummering av leksjonen
I denne leksjonen lærte De at dense retrieval fanger opp semantisk betydning, men ikke fungerer godt for sjeldne, eksakte termer, at BM25 sparse retrieval håndterer eksakte nøkkelord, men går glipp av parafraser, og at hybrid retrieval konsekvent gir bedre resultater enn hver av metodene alene på tvers av ulike forespørselstyper. Poengsummene deres er uforenlige og må slås sammen ved hjelp av rangfusjon i stedet for å legges sammen. Neste steg er å implementere BM25-nøkkelordsøk i Python.
Lær deg Python med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 30
- Leksjoner
- 120
Ofte stilte spørsmål
Er leksjonen «Tett kontra spredt gjenfinning: avveininger» gratis?
Ja – hele teksten i «Tett kontra spredt gjenfinning: avveininger» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI Engineering Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI Engineering Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Tett kontra spredt gjenfinning: avveininger»?
Forstå når tette embedding-er ikke finner eksakte nøkkelordtreff, når BM25 ikke fanger opp semantiske parafraser, og hvorfor en kombinasjon konsekvent gir bedre resultater enn hver metode alene. Du øver på AI Engineering Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med AI Engineering Academy?
Ingen tidligere erfaring er nødvendig. AI Engineering Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.
Hvor lang tid tar leksjonen «Tett kontra spredt gjenfinning: avveininger»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne AI Engineering Academy-leksjonen?
Ja. Alle AI Engineering Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Tett kontra spredt gjenfinning: avveininger
- Implementere BM25-basert nøkkelordsøk
- Reciprocal Rank Fusion for sammenslåing av poengsummer
- Hybridsøk i Pinecone og pgvector