AI-systemen Onderzoeksartikel

Waarom je RAG-antwoord niet klopt: zoek de kapotte stap voordat je het model vervangt

Het model krijgt als laatste de schuld, niet als eerste.

Een blanco formulier op een lopende band met drie stations; bij het middelste is het onderste derde eraf geknipt, dat achterblijft op de band
Het antwoord klopte. De pagina die het kreeg niet.

Direct antwoord

Als een RAG-antwoord niet klopt, is de oorzaak meestal een van deze drie: de juiste informatie stond niet in de documentverzameling toen de vraag werd gesteld, de zoekstap leverde de juiste passage nooit af bij het model, of het model kreeg de passage wel, maar gaf haar verkeerd weer. Controleer ze in die volgorde. Bewaar de mislukte vraag, de passages die het model echt zag en het antwoord, en speel de vraag opnieuw af met de juiste passage. Vervang het model pas als de eerste twee oorzaken zijn uitgesloten.

Klopt een RAG-antwoord niet, dan is er een stap kapot, en die zoek je op drie plekken: het bewijs ontbrak in de verzameling, het stond erin maar bereikte het model nooit, of het bereikte het model en het antwoord gaf het verkeerd weer. Controleer ze in die volgorde: documenten, ophalen, antwoord. Dezelfde verkeerde zin kan uit elk van de drie voortkomen, en elk vraagt een andere reparatie.

RAG (retrieval-augmented generation) is een opzet waarbij een AI-systeem eerst je documenten doorzoekt en daarna antwoordt vanuit de gevonden passages. Wat is RAG? legt de basis uit. Deze pagina begint bij een antwoord waarvan je kunt aantonen dat het niet klopt, en herleidt het tot het bewijs dat het model echt zag.

Op 11 november 2022 overleed de grootmoeder van Jake Moffatt. Dezelfde dag vroeg Moffatt de chatbot op de website van Air Canada naar het rouwtarief, de korting die sommige luchtvaartmaatschappijen geven na een sterfgeval in de familie. Volgens de chatbot kon je dat lagere tarief ook na de reis nog aanvragen, “within 90 days of the date your ticket was issued” (binnen 90 dagen na de uitgifte van je ticket).

De eigen pagina van de maatschappij, “Bereavement Travel”, zei het tegenovergestelde: het rouwtarief geldt niet voor reizen die al zijn gemaakt. Toen Moffatt aan de bel trok, gaf een medewerker van Air Canada toe dat de chatbot misleidende bewoordingen had gebruikt, en wees erop dat het antwoord van de chatbot naar precies die pagina linkte.

In februari 2024 stelde een tribunaal voor kleine geschillen in Brits-Columbia (Canada) de maatschappij aansprakelijk. Volgens het tribunaal kwam het standpunt van Air Canada erop neer dat de chatbot een aparte juridische entiteit was, zelf verantwoordelijk voor zijn daden. Het tribunaal noemde dat een opmerkelijk betoog. Het schreef ook dat de chatbot nog altijd gewoon deel uitmaakt van de website van Air Canada, en oordeelde dat Air Canada niet de redelijke zorg had betracht om te waarborgen dat haar chatbot juiste informatie gaf.

Deze feiten en bewoordingen zijn ontleend aan CBC News en McCarthy Tétrault. Hoe de chatbot is gebouwd, is niet openbaar. De zaak is dus geen bewijs van een RAG-fout en laat niet zien welke interne stap misging.

Wat de zaak wel laat zien, is het symptoom. De juiste pagina bestond, het antwoord linkte ernaar, en toch sprak het antwoord die pagina tegen. Een juiste link is geen juist antwoord. In een RAG-systeem kunnen een ontbrekend document, een misser bij het ophalen en een verkeerd gelezen passage er in het chatvenster allemaal zo uitzien. Eronder vraagt elk om een andere reparatie.

Waarom is “het model hallucineerde” de verkeerde eerste diagnose?

Omdat het een symptoom benoemt, niet de stap die faalde. Een antwoord kan een verouderde passage nauwkeurig navertellen en toch niet kloppen. Het kan ook een bewering toevoegen die geen enkele aangeleverde passage onderbouwt. Aan het antwoord alleen zie je niet welke van de twee het is.

In hoofdstuk 9 van mijn boek De RAG-engineer geef ik de gewoonte om eerst het model de schuld te geven een naam: de Model-Blame Reflex. Mijn werkregel: sluit eerst de documenten en het ophalen uit voordat je aan het model komt, want die stappen zijn goedkoper te controleren. Dat is een volgorde van werken, geen bewering dat het model niet kan falen. Vragen waarvoor je over meerdere passages heen moet redeneren, kunnen ook misgaan als het juiste bewijs wél is aangekomen.

Begin bij de exacte zin die niet klopt en de regel die hij overtreedt: “Volgens de assistent mocht een teamlid een afgeronde aanvraag heropenen, maar het beleid beperkt dat tot de accounteigenaar.” Dan heeft het onderzoek een passage om te zoeken en een bewering om te toetsen. “Het model hallucineerde” geeft het niets.

Hoe vind je de kapotte stap?

Stel drie vragen, in deze volgorde. Een fout bij de ene stap pleit de stappen erna niet vrij.

1. Was het juiste bewijs er toen de vraag werd gesteld?

Zoek de passage die de vraag had moeten beantwoorden, in de versie die toen gold. Controleer dan:

  • Stond ze in de doorzoekbare verzameling (de index)? Is het document nooit ingeladen, dan vindt geen enkele zoekinstelling het.
  • Mocht deze gebruiker haar zien? Een passage terecht afschermen voor iemand zonder toegang is geen zoekfout. Verruim de rechten niet om het antwoord kloppend te krijgen.
  • Was het de geldende versie? Een beleidswijziging die de index nooit bereikte, laat het systeem antwoorden volgens de oude regel. RAG-actualiteit beschrijft dat actualiteitscontract.
  • Heeft ze de voorbewerking overleefd? Documenten worden omgezet naar tekst en opgeknipt in chunks: de korte tekststukken die een RAG-systeem opslaat en doorzoekt. Een kop, een tabelkolom of een uitzondering kan daarbij loskomen van de regel waar die bij hoort.

Ontbrak het bewijs, dan hoort de reparatie bij de documenten en de manier waarop ze worden ingeladen; geen zoekinstelling haalt terug wat niet in de verzameling staat. Tot het document erin staat, hoort het systeem het gat te benoemen en de vraag door te verwijzen naar de eigenaar van het beleid, in plaats van te gokken.

2. Bereikte de juiste passage het model?

Dat je de passage in de kennisbank vindt, bewijst dat ze is opgeslagen, niet dat dit antwoord haar gebruikte. Volg de overdrachten die jouw systeem heeft:

  1. Vraagvoorbereiding: de vraag wordt misschien herschreven of ingedeeld.
  2. Eerste zoekronde: de zoekstap levert kandidaat-passages op.
  3. Herordening, als je die gebruikt: een tweede model, de reranker, zet de kandidaten op volgorde van relevantie.
  4. Contextopbouw: het systeem kiest wat in de invoer van het model past en laat de rest vallen.

Bij elke overdracht kan het bewijs uitvallen. Bewaar de zoekopdracht, de filters, de teruggegeven passages met hun ID’s en de uiteindelijke context: de exacte tekst die naar het model ging. Vergelijk per stap wat erin ging en wat eruit kwam. Een schermafbeelding van zoekresultaten laat niet zien of de passage de contextopbouw heeft overleefd.

Let op een verschil in woordkeus (“mijn proefperiode eerder stoppen” tegenover “opzeggen van de proefperiode vóór het einde”), een oud document dat hoger scoort dan het actuele, of een juiste passage die net onder de afkapgrens valt. Kijk of de contextopbouw een samenvatting overhield en de voorwaarden van de regel liet vallen. Pas de stap aan die het bewijs kwijtraakte. Wie alle limieten tegelijk oprekt, maakt de oorzaak moeilijker te vinden.

3. Klopte het antwoord met de passage die het model kreeg?

Pas als de benodigde passage het model bereikte, wordt het antwoord de hoofdverdachte. Vergelijk die twee bewering voor bewering. Let op een beperkte regel die ineens voor iedereen geldt, een “mag” die een “moet” wordt, of een uitzondering die verdwijnt.

Een bronvermelding beslist dit niet. Open de geciteerde passage en controleer of ze de zin dekt, inclusief de voorwaarden en de reikwijdte. Wat is LLM-grounding? legt die toets uit. Lees daarna de rest van de context. Een verouderde samenvatting naast de actuele regel, of een instructie om altijd stellig te antwoorden, vraagt misschien om een reparatie van de context voordat je aan het model komt.

Welke reparatie hoort bij welke stap?

De tabel volgt de koppeling van fouten aan stappen uit hoofdstuk 9. Ze is ingedeeld volgens GRAIN, het framework uit De RAG-engineer (verkrijgbaar in het Nederlands en het Engels), dat retrievalwerk in vijf gebieden verdeelt. De stapnamen blijven ook in de Nederlandse editie Engels:

  • Gather corpora: welke documenten de verzameling in gaan, met hun rechten, hun versies en de manier waarop ze in chunks worden geknipt.
  • Rank and rerank: kandidaat-passages vinden en ze ordenen voor de vraag die echt gesteld is.
  • Assemble context: kiezen welke passages het model bereiken, in welke volgorde, binnen de invoerlimiet.
  • Inspect failures: een onjuist antwoord herleiden tot de stap die faalde, en de reparatie bij die stap neerleggen. Deze pagina is een Inspect-oefening.
  • Navigate freshness: de verzameling actueel houden en laten zien hoe oud een antwoord kan zijn.

Lees de tabel als wegwijzer naar de volgende controle, niet als oordeel op basis van alleen het antwoord. Wat is GRAIN? geeft een kort overzicht.

Wat je zietTe onderzoeken foutGRAIN-stap waar de reparatie hoortControleer eerst
Het antwoord volgt een oude versie van het beleidVerouderd bewijsNavigate freshnessVersie in de index tegenover versie van de bron
Het juiste document bestaat, maar verschijnt nooit in de zoekresultatenHet bewijs ontbreekt in de index, of de zoekstap mist hetRank and rerank (Gather corpora, als het nooit is ingeladen)Of het in de index staat, daarna de woorden in de vraag en de filters
De juiste passage is gevonden, maar ontbreekt in de contextDe contextbouwer liet haar vallenAssemble contextWat er is weggeknipt, en waarom
De opgeslagen chunk knipt een voorwaarde of uitzondering afDe passage is slecht geknipt bij de voorbewerkingGather corporaWaar de chunk begint en eindigt
De juiste passage zit in de context en het antwoord klopt nog steeds nietHet antwoord gaf de passage verkeerd weerAssemble context, daarna het modelDe zin tegenover de passage
Dezelfde vraag krijgt verschillende antwoordenOnbekend tot je runs kunt vergelijkenInspect failuresOf de context van elke run überhaupt wordt bewaard

Een verzonnen spoor, van begin tot eind

Dit spoor is verzonnen. Er is geen productiesysteem getest, en de rollen en de zeven dagen bestaan alleen voor dit voorbeeld.

Een teamlid vraagt een supportassistent: mag ik een afgeronde onderhoudsaanvraag heropenen? De assistent antwoordt: “Ja, afgeronde aanvragen kunnen worden heropend.” Het beleid is strenger. De accounteigenaar mag een aanvraag binnen zeven dagen heropenen; andere teamleden moeten het de eigenaar vragen.

  1. Was het bewijs er? Ja. Het actuele beleid staat in de verzameling, en deze gebruiker mag het zien.
  2. Kwam het bij het model aan? Gedeeltelijk. De zoekstap gaf de juiste alinea terug, maar de contextbouwer hield alleen een samenvatting van één zin uit de alinea ernaast over: “Afgeronde aanvragen kunnen worden heropend.” De beperking tot de eigenaar en de zeven dagen bereikten het model nooit.
  3. Klopte het antwoord met zijn passage? Ja, en dat is het ongemakkelijke deel. Het antwoord herhaalt de samenvatting bijna woord voor woord. Getoetst aan de context klopt het. Getoetst aan het beleid is het fout voor deze gebruiker.

De kapotte stap is de contextbouwer: een fout in Assemble context. Een ander model had met dezelfde samenvatting geen beter materiaal gehad. De reparatie houdt de regel en zijn voorwaarden bij elkaar. In deze verzonnen herhaling krijgt dezelfde vraag daarna het beperkte antwoord: vraag het de accounteigenaar, die de aanvraag binnen zeven dagen kan heropenen. Dat illustreert de controle; het is geen gemeten resultaat.

Hoe weet je dat de reparatie werkt?

Gebruik twee soorten herhaling. Eerst een gecontroleerde: geef het model de bekende juiste passage, en houd de vraag, het model en de instructies gelijk. Komt het antwoord dan goed terug, dan wijst dat naar de aflevering van het bewijs, niet naar het model. Repareer daarna de stap en controleer de reparatie via het hele systeem, ophalen inbegrepen:

  1. Speel de oorspronkelijke vraag opnieuw af. Bewaar de context van vóór en na, zodat een collega kan zien wat er veranderde.
  2. Test verwante gevallen. Vraag in het verzonnen beleid als accounteigenaar naar een aanvraag die tien dagen geleden is afgerond: het antwoord moet de grens van zeven dagen toepassen. Vraag naar een aanvraag die gisteren is afgerond: de eigenaar moet nog steeds ja krijgen. Een reparatie die het makkelijke geval oplost maar de grens kwijtraakt, is geen reparatie.
  3. Leg regressietests vast. Bewaar elke vraag met het verwachte antwoord, inclusief de voorwaarden die dat antwoord moet behouden. Draai ze na elke wijziging opnieuw. Een test bewaakt het patroon dat hij dekt; dezelfde fout kan nog terugkomen via een vraag die je niet hebt bewaard.

Een geslaagde herhaling is bewijs over die vraag onder die omstandigheden. Op zichzelf bewijst ze de oorzaak niet, en ze laat niet zien dat het systeem elders betrouwbaar is.

Hoe merk je dat het onderzoek vastloopt?

  • Iemand houdt vol dat de bron “erin staat”, maar kan niet laten zien welke versie het mislukte antwoord gebruikte.
  • Het team verruimt het zoeken tot het juiste antwoord verschijnt, zonder te kijken welke irrelevante of tegenstrijdige tekst daarbij meekwam.
  • Bij een herhaling veranderen model, prompt, index en vraag tegelijk. Het antwoord wordt beter en de oorzaak blijft onbekend.
  • De prompt krijgt er een zin bij als “zeg dat je het niet weet als je twijfelt”. Hoofdstuk 9 waarschuwt daar juist voor: het gat in het ophalen blijft open, en het model gaat ook twijfelen bij vragen waarvoor het wél het juiste bewijs had.
  • De test controleert alleen of er een bronvermelding staat, niet of de passage de bewering dekt.

Probeer het vandaag

  1. Kies één antwoord uit je systeem waarvan je weet dat het niet klopt.
  2. Leg het dossier vast: de vraag, het tijdstip, de rechten van de gebruiker, de documentversies, de teruggegeven passages, de exacte context en het antwoord. Bewaar het onder je bestaande toegangsregels.
  3. Markeer waar het bewijs faalde: ontbrekend in de verzameling, aanwezig maar niet afgeleverd of afgeleverd maar verkeerd weergegeven. Noteer elke verdere fout die het spoor laat zien.
  4. Ontbreekt een deel van het dossier, voeg die logging dan toe vóór de volgende herhaling; wat je niet bewaart, kun je niet debuggen. Is het dossier compleet, test dan de vermoedelijke stap met de juiste passage en controleer een verwant geval.

Sluit af met één opgeschreven bevinding: welke passage nodig was, bij welke stap ze verloren ging of verkeerd werd weergegeven, en welke test de fout vangt als hij terugkomt. Repareer dan die stap. Een nieuw model kan ooit de juiste reparatie zijn; laat het spoor dat eerst aantonen.

Citeer deze pagina:Waarom je RAG-antwoord niet klopt: zoek de kapotte stap voordat je het model vervangt.Len P. van der Hof. https://lenvanderhof.com/nl/blog/waarom-je-rag-antwoord-niet-klopt/ ·

Begrippen

Bronnen

  1. Wat is RAG? Als AI een bron opzoekt voordat het antwoordt
  2. RAG-actualiteit: de pdf van vorige maand is geen zoekprobleem
  3. Wat is LLM-grounding? De zin moet een map kunnen openen
  4. Wat is GRAIN? De inspecteerbare retrieval-loop
  5. De RAG-engineer
  6. Air Canada found liable for chatbot's bad advice on plane tickets · CBC News
  7. Moffatt v. Air Canada: A Misrepresentation by an AI Chatbot · McCarthy Tétrault (TechLex blog)

Verder lezen

Markdown voor LLMs