# Retrieval-augmented generation

## Hva det er

Retrieval-augmented generation er en måte å besvare et spørsmål med en
språkmodell på i to steg. Først søker applikasjonen i en samling dokumenter
etter de utdragene som mest sannsynlig inneholder svaret. Deretter legger den
utdragene inn i modellens inndata ved siden av spørsmålet, og modellen skriver
svaret ut fra dem i stedet for ut fra det den tok opp i seg under treningen.
Navnet, som som regel forkortes til RAG, kommer fra en forskningsartikkel fra
2020 om kunnskapskrevende språkoppgaver som å besvare åpne spørsmål.

Artikkelen beskrev to slags hukommelse. En forhåndstrent modell tar vare på det
den har lært, i parameterne sine, og det kalte forfatterne parametrisk
hukommelse. En separat indeks over dokumenter, som en trent søkemodell, en
såkalt retriever, søker i, er ikke-parametrisk hukommelse. Systemet deres koblet
en forhåndstrent sequence-to-sequence-modell til en tett vektorindeks over
Wikipedia, og de sammenlignet to måter å bruke funnene på: den ene lar hele
svaret bygge på de samme utdragene, den andre kan hente fra ulike utdrag for
hvert token den skriver. På tre referansetester for besvarelse av spørsmål i
åpne domener satte systemet nye rekorder, og forfatterne fant at teksten det
genererte, var mer spesifikk, mer variert og mer faktisk korrekt enn teksten fra
en sammenlignbar modell uten søk.

En applikasjon kan bygge det samme mønsteret av deler den allerede har: en
søkeindeks over sine egne dokumenter og en stor språkmodell den kaller via et
API. Søkedelen er vanlig søk, og begge familiene av søk dukker opp her. Sparse
retrieval matcher ord, slik fulltekstsøk rangerer dokumenter med en
poengfunksjon som BM25. Dense retrieval gjør spørsmålet og hvert utdrag om til
vektorer av tall og returnerer utdragene der vektorene ligger nærmest, og det er
vektorsøk. En artikkel fra 2020 om dense passage retrieval fant at en tett
retriever, trent på et beskjedent antall par av spørsmål og utdrag, slo en sterk
BM25-baseline med 9 til 19 prosentpoeng, målt på hvor ofte det riktige utdraget
var blant de tjue første resultatene. Et system kan kjøre begge og flette de to
listene.

## Hvorfor det er viktig

En språkmodell kjenner bare det som sto i treningsteksten, og den teksten
slutter på en fast dato og har aldri inneholdt kontraktene dine, prislistene
dine eller referatet fra forrige ukes møte. RAG-artikkelen peker på to svakheter
ved kunnskap som ligger i parametere: det er vanskelig å vise hvor et svar kom
fra, og vanskelig å oppdatere kunnskapen. Søket tar seg av begge deler. Svaret
kan vise til utdragene modellen fikk, så en leser kan åpne kilden og kontrollere
den, og ny kunnskap når fram til modellen i det øyeblikket et dokument kommer
inn i indeksen, helt uten en treningskjøring.

Det plasserer også spørsmålet om hvem som får se hva, der det hører hjemme. Et
søk kan kjøre med rettighetene til den som spør, slik at modellen bare får se
utdrag som den personen selv kunne ha åpnet. I en modell som var trent på de
samme dokumentene, finnes ikke den grensen: alt den har lært, er tilgjengelig
for alle som bruker den.

Prisen er at svaret aldri blir bedre enn det søket returnerer. En modell som får
feil utdrag, skriver et flytende svar ut fra dem, og en modell som ikke får noe
brukbart, svarer kanskje ut fra hukommelsen likevel. Mesteparten av arbeidet i
et system bygd på retrieval-augmented generation ligger derfor i dataene og
søket, ikke i modellen.

## Slik ser det ut i praksis

Sporet nedenfor følger ett spørsmål gjennom et slikt system. Søket kjører med
rettighetene til brukeren som spør, hvert utdrag kommer med filen og siden det
stammer fra, og instruksjonene ber modellen svare ut fra utdragene og ingenting
annet:

```text
spørsmål: Hvilke leveringsbetingelser gjelder for ordre 4471?
bruker:   salg-3 (rolle: salg, region: nord)

funnet, filtrert til det salg-3 får lese:
  [1] kontrakter/rammeavtale-2025.pdf, side 4
      «Varer leveres til kjøperens lager,
       med mindre ordren angir noe annet.»
  [2] ordrer/4471.txt, linje 12
      «Leveringsbetingelser: jf. rammeavtalen.»

instruksjoner:
  Svar bare ut fra utdragene nedenfor, og vis til dem som [n].
  Hvis de ikke besvarer spørsmålet, så si det.

svar:
  Ordre 4471 viser til rammeavtalen [2], som sier at
  varer leveres til kjøperens lager [1].
```

Hver del av sporet er data systemet kan kontrollere. En test kan bekrefte at de
riktige utdragene kom tilbake for et kjent spørsmål, et skript kan bekrefte at
hver `[n]` i svaret viser til et utdrag som faktisk ble funnet, og en person som
leser svaret, kan slå opp på side 4 i kontrakten.

Forarbeidet dette krever, er temaet for siden om
[bedriftsdata klare for AI-agenter](/nb/ai-data/) her på nettstedet. Den
beskriver hvordan gamle PDF-er, skanninger og e-postarkiver gjøres om til søkbar
tekst med kilden lagret ved siden av, og hvordan hver rad tar vare på hvor og
når den kom inn, nemlig systemet, innlastingen, filen og siden, slik at en agent
kan vise til posten bak et tall og et menneske kan åpne den. Siden legger også
reglene i dataene og ikke i prompten: agenten handler med brukerens rettigheter,
aldri med en administrators, og hvert oppslag logges med hvem det ble gjort for.

## Hvor det går galt

**Søket bommer, og modellen svarer likevel.** Når det riktige utdraget ikke blir
funnet, får modellen fortsatt noe og skriver fortsatt et svar. Mål søket for
seg: skriv ned ekte spørsmål sammen med utdragene som besvarer dem, og
kontroller hvor ofte de utdragene er blant resultatene modellen får. Be modellen
si fra når utdragene ikke besvarer spørsmålet, og ta med slike spørsmål blant
testsakene.

**Utdrag som skjærer svaret i to.** Når dokumenter deles i biter av fast lengde,
blir en tabell skilt fra overskriften sin og en klausul fra unntaket sitt, og
hver halvdel villeder når den blir funnet alene. Del langs strukturen dokumentet
allerede har, altså avsnittene, sidene og tabellradene, og hold dokumentets
tittel og plassering sammen med hver bit.

**Indeksen bryr seg ikke om hvem som spør.** En indeks som er bygd av en
tjeneste som kan lese alt, returnerer utdrag fra dokumenter den som spør, ikke
får åpne, og modellen oppsummerer dem for vedkommende. Filtrer på brukerens
rettigheter inne i søket, i indeksen eller databasen, før noe når modellen. En
regel i prompten er ikke tilgangskontroll.

**Instruksjoner plantet i et dokument.** Funnet tekst er tekst noen andre har
skrevet, og modellen kan ikke pålitelig skille et utdrag fra en instruksjon.
NISTs profil for generativ AI beskriver indirekte prompt injection som angrep på
applikasjoner bygd på språkmodeller gjennom data som sannsynligvis blir hentet
fram, og en artikkel fra 2023 demonstrerte slike angrep mot ekte systemer.
Behandle hvert funnet utdrag som inndata du ikke kan stole på, la ingen utdrag
utløse en handling uten en kontroll i kode, og gi verktøyene modellen kan kalle,
ikke flere rettigheter enn brukeren selv har.

**En indeks som henger etter.** Et dokument blir endret eller slettet, og
indeksen inneholder fortsatt de gamle utdragene, så systemet svarer selvsikkert
ut fra en kontrakt som ikke lenger gjelder. Oppdater indeksen hver gang en kilde
endres, fjern utdrag når dokumentet deres blir slettet, og vis datoen for hver
kilde ved siden av svaret.

**Kildehenvisninger som ikke sier det svaret påstår.** En modell kan vise til
utdrag [2] for en setning som utdrag [2] ikke underbygger, og NIST påpeker at
genererte kildehenvisninger selv kan være konfabulerte. Kontroller i kode at
hver henvisning peker på et utdrag som ble funnet, og la mennesker ta
stikkprøver av svar mot kildene deres som en fast del av testarbeidet.

## Les mer

- [Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks](https://arxiv.org/abs/2005.11401)
  — artikkelen fra 2020 som introduserte RAG-modellene og sammenlignet de to
  variantene på besvarelse av spørsmål og generering av tekst.
- [Dense Passage Retrieval for Open-Domain Question Answering](https://arxiv.org/abs/2004.04906)
  — en tett retriever, trent på par av spørsmål og utdrag og målt mot BM25 på å
  finne utdraget som inneholder svaret.
- [NIST AI 600-1: Generative Artificial Intelligence Profile](https://doi.org/10.6028/NIST.AI.600-1)
  — NISTs risikoprofil for generativ AI, med konfabulering, personvern og
  indirekte prompt injection.
- [Not what you've signed up for: Compromising Real-World LLM-Integrated Applications with Indirect Prompt Injection](https://arxiv.org/abs/2302.12173)
  — hvordan instruksjoner gjemt i funnede data tar over en applikasjon, med
  angrep på ekte systemer.

<https://engineer.company/nb/glossary/retrieval-augmented-generation/>
