EUniversitetLaboration· ca 60 min· sandlåda på servern
Labb: BM25 och ett minimalt RAG-flöde
Implementera BM25 från formeln, hämta rätt stycke för en fråga och bygga en prompt med källhänvisning — hela RAG-kedjan utan LLM.
Teori
BM25(q, d) = Σ IDF(t) · tf(t,d)(k₁+1) / (tf(t,d) + k₁(1 − b + b·|d|/avgdl)). IDF(t) = ln((N − n(t) + 0,5)/(n(t) + 0,5) + 1).
Deluppgifter
- tokenize + idf —
tokenize(text)(gemener, a–ö och siffror);idf(term, docs). - bm25 —
bm25(query, docs, k1=1.5, b=0.75)→ poäng per dokument. - rag_prompt —
rag_prompt(query, docs, k)→ sträng med de k bästa styckena numrerade [1]…[k] + frågan.
Godkänt när: recall >= 0.8
Startkoden
körs i en isolerad sandlåda på servernimport math
import re
from collections import Counter
def tokenize(text):
# TODO: re.findall(r"[a-zåäö0-9]+", text.lower())
...
def idf(term, docs):
# TODO: docs = lista av tokenlistor
...
def bm25(query, docs, k1=1.5, b=0.75):
# TODO: returnera lista med poäng per dokument
...
def rag_prompt(query, docs_text, k=2):
# TODO: rangordna docs_text (strängar) med bm25, bygg "[1] ...\n[2] ...\n\nFråga: ..."
...
Du skriver koden, tester du inte ser avgör om den håller. Skapa ett gratis konto för att köra labben.
Prova diagnosenSkapa konto gratisFörväntade resultat
recall@1 ≥ 0,8 på de 10 frågorna mot 12 stycken.
Vanliga fel
- IDF utan +1 kan bli negativ för vanliga ord.
- Glömmer längdnormalisering (b).
- Tokeniserar inte frågan på samma sätt som dokumenten.