Du setter opp RAG over norske dokumenter, og søket returnerer feil avsnitt. Modellen bakerst er stor og dyr, men svarene blir likevel tynne. I ni av ti tilfeller ligger ikke problemet i språkmodellen. Det ligger i embeddings.
Symptomet: relevante avsnitt havner ikke øverst
De fleste embedding-modeller er trent tungt på engelsk, og på norsk tekst kollapser semantikken. Et avsnitt som svarer rett på spørsmålet får plutselig lavere likhet enn et helt irrelevant avsnitt som tilfeldigvis deler noen ord. Da får språkmodellen feil kontekst inn, og et godt svar er umulig uansett hvor kraftig LLM-en er.
Det er enkelt å bekrefte selv. Still et konkret spørsmål mot en norsk dokumentsamling, se på topp fem treff og les dem. Ligger fasiten på plass ni, er det ikke LLM-en som svikter. Det er gjenfinningen.
BGE-M3: flerspråklig, dense og sparse i samme modell

BGE-M3 er en flerspråklig embedding-modell som håndterer norsk godt. Den produserer både dense og sparse representasjon fra samme modell. Dense fanger semantikken, mens sparse fanger de eksakte termene: koder, egennavn og forkortelser som ellers drukner i en ren vektorlikhet. For norsk fagtekst full av produktnavn og interne begreper er den kombinasjonen verdt en del.
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True)
docs = ["Kontrollenheten tilbakestilles ved lang trykk på knappen.",
"Filteret byttes hver tredje måned."]
out = model.encode(docs, return_dense=True, return_sparse=True)
dense = out["dense_vecs"] # semantisk likhet
sparse = out["lexical_weights"] # eksakte termer
Chunking avgjør mer enn folk tror
Del dokumentene fornuftig. For store chunks fortynner det relevante innholdet med støy, mens for små chunks river setningen løs fra konteksten den trenger. Følg dokumentets egen struktur: avsnitt, overskrifter og naturlige grenser. Og ikke kutt midt i en tabell eller en prosedyre. Det er som å rive ut annenhver side av en oppskrift.
chunk_size = 512 # tokens, ikke tegn
overlap = 64 # behold kontekst over grensene
# del på avsnitt først, fall tilbake på lengde
Evaluer på dine egne norske dokumenter

Ikke stol på engelske benchmarks. De sier ingenting om hvordan modellen oppfører seg på akkurat din terminologi. Lag heller et lite sett med reelle spørsmål og kjente fasit-avsnitt, og mål gjenfinningen direkte.
# enkel recall@k på eget sett
hits = 0
for q, gold_id in eval_set:
top = retrieve(q, k=5)
if gold_id in top:
hits += 1
print("recall@5:", hits / len(eval_set))
Kjør det samme settet med en engelsk modell og med BGE-M3. Forskjellen på recall@5 er som regel tydelig, og det tallet forteller deg mer enn noen ekstern rangering noensinne gjør.
Konklusjon
Kvaliteten på embeddings avgjør RAG-svaret mer enn hvilken språkmodell du plasserer bakerst. Feil embedding-modell gir feil kontekst, og da hjelper ingen LLM. Start i riktig ende: bruk en flerspråklig modell som takler norsk, chunk etter struktur, og mål recall på egne dokumenter før du bruker penger på en større LLM.



