AI Engineering Academy · Lektion

Tät kontra gles informationshämtning: avvägningar

Förstå när täta embeddings missar exakta nyckelordsträffar och när BM25 missar semantiska parafraser, samt varför en kombination konsekvent presterar bättre än någon av metoderna ensam.

Lektion 1 av 413 steg

Tät kontra gles informationshämtning: avvägningar är en gratis lektion i AI Engineering Academy på CoddyKit. Detta är lektion 1 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för AI Engineering Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i AI Engineering Academy innehåller totalt 4 lektioner.

Två fundamentalt olika signaler för hämtning

Moderna system för hämtning använder två distinkta signaler: tät hämtning kodar betydelse i kontinuerliga vektorrum, medan gles hämtning räknar exakta termförekomster. Dessa signaler kompletterar varandra och kan inte ersätta varandra. Att förstå deras individuella styrkor och svagheter är det första steget mot att bygga ett system som använder båda effektivt.

Så fungerar täta embeddingar

Tät hämtning mappar både frågan och varje dokument till en högdimensionell vektor med hjälp av en neural encoder. Likheten mäts med cosine distance eller skalärprodukt mellan vektorerna. Eftersom encodern har tränats på stora textkorpusar hamnar semantiskt relaterade fraser nära varandra i vektorrummet även om de inte delar några ord – detta är den täta hämtningens viktigaste fördel.

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 words

När tät hämtning misslyckas

Täta modeller har svårt för sällsynta termer som förekom sparsamt under träningen av encodern. En fråga som innehåller ett specifikt produktmodellnummer som RTX-4090-Ti-OC, ett medicinskt läkemedelsnamn eller en intern identifierare för företagets eget bruk misslyckas ofta med att matcha rätt dokument, eftersom encodern saknar en inlärd representation för den tokenföljden. Vektorn hamnar helt enkelt på en ohjälpsam plats i embeddingrymden.

Så fungerar gles BM25-hämtning

BM25 (Best Matching 25) är en probabilistisk rankningsfunktion som poängsätter dokument utifrån hur ofta frågans termer förekommer i dokumentet. Poängen normaliseras efter dokumentlängd och dämpas när termfrekvensen mättas. Resultatet är en gles poängvektor – de flesta dimensionerna är noll eftersom dokument bara innehåller en liten del av hela ordförrå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 length

BM25:s styrkor: exakta termer och fackspråk

BM25 är särskilt bra på frågor som innehåller exakta tekniska termer, produktnamn, felkoder och numeriska identifierare som ska matchas precis. En fråga efter ORA-01017 (en Oracle-felkod) rankar dokument som innehåller exakt den strängen långt högre än dokument som bara handlar om databasautentisering i allmänhet. Detta är omöjligt för en tät modell som aldrig har sett just den 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-01017

När BM25 misslyckas: parafraser och synonymer

BM25 kan inte hantera semantiska parafraser. Ett dokument om ”reparation av bilmotorer” får poängen noll för en fråga om ”underhåll av fordonsmotorer” om inga exakta ord överlappar. Detta problem med ordförrådsmismatch, som ibland kallas lexikalt gap, innebär att ren nyckelordssökning missar stora mängder relevant innehåll som helt enkelt använder andra ord för att uttrycka samma idé.

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 related

Benchmarkresultat: hybridmetoder vinner konsekvent

Benchmarktester på BEIR, MS MARCO och företagsdataset för frågor och svar visar konsekvent att hybrid hämtning presterar bättre än enbart tät eller gles hämtning, med 5–15 procents förbättring på NDCG@10. Förbättringen är störst i dataset med en blandning av faktasökningar (där BM25 hjälper) och parafrasfrågor (där täta embeddingar hjälper). Ingen enskild hämtningsmetod dominerar för alla frågetyper.

Analys av frågetyper: vilken hämtare vinner

Ni kan förutsäga vilken hämtare som presterar bäst genom att analysera frågetypen. Tät hämtning vinner för konceptuella frågor, parafraser och breda ämnesfrågor. BM25 vinner för frågor som innehåller egennamn, versionsnummer, kodfragment, akronymer och sällsynta tekniska termer. Hybrid hämtning vinner alltid när frågetypen inte är känd i förväg – vilket nästan alltid är fallet i produktion.

# 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 inkompatibla poäng

Att kombinera täta och glesa resultat är inte trivialt eftersom deras poäng ligger på oförenliga skalor. Cosinuslikhet ger värden mellan -1 och 1, medan BM25 ger obegränsade positiva poäng som beror på korpusens storlek. Ni kan inte bara addera dem. Standardlösningen är att använda rankbaserad fusion i stället för poängbaserad fusion – att slå samman rankade listor i stället för råa poäng.

Praktiskt beslut: när respektive metod bör användas

Använd enbart tät hämtning när er korpus tillhör ett smalt domänområde med konsekvent vokabulär och ni behöver semantisk generalisering över parafraser. Använd enbart BM25 när frågor huvudsakligen är uppslagsfrågor med exakta identifierare och datauppsättningen är tillräckligt liten för att brute force ska vara genomförbart. Använd hybrid hämtning i alla RAG-system i produktion där frågetyperna varierar – kostnaden är måttlig och förbättringen av återkallningen är betydande.

Avvägningar för prestanda och infrastruktur

Tät hämtning kräver GPU-accelererad approximerad sökning efter närmaste grannar eller en vektordatabas, vilket ökar kostnaden för infrastrukturen. BM25 körs helt på CPU med ett inverterat index och är extremt snabbt. Hybrid hämtning kräver båda infrastrukturkomponenterna samt ett fusionssteg. Den ökade komplexiteten motiveras av den förbättrade återkallningen i de flesta produktionsanvändningsfall, men måste vägas mot er infrastrukturbudget.

Snabb kontroll

Testa era kunskaper om avvägningarna mellan tät och gles hämtning från den här lektionen.

Sammanfattning av lektionen

I den här lektionen lärde ni er att tät hämtning fångar semantisk betydelse men misslyckas med sällsynta exakta termer, att gles BM25-hämtning hanterar exakta nyckelord men missar parafraser, och att hybrid hämtning konsekvent överträffar båda metoderna var för sig för varierande frågetyper. Deras poäng är oförenliga och måste slås samman med rankfusion i stället för genom att addera poäng. Nästa steg är att implementera BM25-baserad nyckelordssökning i Python.

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
30
Lektioner
120

Vanliga frågor

Är lektionen ”Tät kontra gles informationshämtning: avvägningar” gratis?

Ja – hela texten till ”Tät kontra gles informationshämtning: avvägningar” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i AI Engineering Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i AI Engineering Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Tät kontra gles informationshämtning: avvägningar”?

Förstå när täta embeddings missar exakta nyckelordsträffar och när BM25 missar semantiska parafraser, samt varför en kombination konsekvent presterar bättre än någon av metoderna ensam. Ni övar på AI Engineering Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig AI Engineering Academy?

Du behöver inga förkunskaper. Utbildningen i AI Engineering Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 1 av 4.

Hur lång tid tar lektionen ”Tät kontra gles informationshämtning: avvägningar”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här AI Engineering Academy-lektionen?

Ja. Varje AI Engineering Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Tät kontra gles informationshämtning: avvägningar
  2. Implementera BM25-baserad nyckelordssökning
  3. Reciprocal Rank Fusion för sammanslagning av poäng
  4. Hybrid sökning i Pinecone och pgvector
← Tillbaka till AI Engineering Academy