- Je onderscheidt een ondersteunde claim van een plausibel klinkende zin.
- Je berekent coverage en fouten onder beantwoorde gevallen zonder ontbrekende antwoorden weg te poetsen.
Een chatbot schrijft: “De lamp is rood”, met een overtuigend klinkende bronvermelding. In jouw registratie staat alleen dat de lamp blauw is. De formulering en bronachtige tekst bewijzen dus nog niet dat de claim wordt ondersteund.
Een hallucinatie is hier een feitelijke bewering die onjuist of ongegrond is ten opzichte van het vereiste bewijs. TruthfulQA onderzoekt waarheidsgetrouwheid afzonderlijk van vloeiende tekst. Wij oefenen met eigen gestructureerde feiten, zonder algemene feitenchecker of actuele modelranglijst.
1. Zoek bewijs op dezelfde eigenschap
Een claim bevat entity, attribute en value. Een feitregel bevat diezelfde velden plus source. Zoek op het exacte paar entity/attribute; de kleur van een andere lamp is geen bewijs over deze lamp.
a = {'entity':'lamp',
'attribute':'kleur',
'value':'blauw'}
b = {**a,'value':'rood'}
c = {**a,'attribute':'gewicht'}
facts = [{**a,'source':'s1'}]
rows = claim_support([a,b,c],facts)
for row in rows:
print(row['status'])
# supported
# contradicted
# unknown
De blauwe claim past bij de enige bekende waarde: supported. Rood spreekt die waarde tegen: contradicted. Over gewicht staat niets geregistreerd: unknown is ontbrekend bewijs en geen bewezen onwaarheid.
Meerdere verschillende geregistreerde waarden geven conflict, ook wanneer één waarde bij de claim past. Zonder tijdstip of bronweging kunnen we dat verschil niet verantwoord oplossen. Geef alle relevante bron-IDs gesorteerd en zonder dubbelen terug.
mixed = facts + [{**b,'source':'s2'}]
r = claim_support([a],mixed)[0]
print(r['status'],r['sources'])
# conflict ['s1', 's2']
Maak claim_support voor maximaal 32 claims en 128 feitregels. Gebruik exact de genoemde velden, met niet-lege strings van maximaal 200 tekens. De registratie is zelf slechts een gekozen referentie: haar juistheid en actualiteit blijven een aparte verantwoordelijkheid.
012. Houd onthoudingen in de totale telling
Onthouden (abstention) betekent dat het systeem geen antwoord geeft. Neem drie vragen, waarvan twee beantwoord worden en één antwoord klopt. Coverage is dan 2/3, totale accuracy 1/3 en accuracy onder beantwoorde vragen 1/2.
Noem het totale aantal N, het aantal beantwoorde vragen A en het aantal juiste antwoorden H. Het risico onder antwoorden is het aandeel foute antwoorden binnen A:
targets = ['factuur','storing','vraag']
pred = ['factuur',None,'factuur']
r = abstention_metrics(pred,targets)
print(r['answered'],r['correct']) # 2 1
print(round(r['coverage'],4)) # .6667
print(round(r['overall_accuracy'],4))
# .3333
print(r['answered_accuracy'],r['risk'])
# 0.5 0.5
print(abstention_metrics(
[None]*3,targets)['risk']) # None
Maak abstention_metrics voor 1–1000 uitgelijnde gevallen. Alleen None betekent onthouden; een lege string is hier geen geldig label. Bij nul antwoorden zijn de voorwaardelijke accuracy en het risico ongedefinieerd, dus None.
Onthoudingen mogen niet uit de totale noemer verdwijnen. Anders lijkt een systeem met één goed antwoord en honderd geweigerde vragen al snel perfect. Welke prijs je aan weigeren geeft, hangt van de toepassing af en moet vooraf worden afgesproken.
023. Een hogere grens kan goede antwoorden verwijderen
De visualisatie gebruikt scores .1, .4, .7 en .9. Alleen het derde antwoord is fout. Bij grens nul zijn er vier antwoorden en één fout: risico .25; bij grens .5 blijven twee antwoorden met één fout over: risico .5.
scores = [.1,.4,.7,.9]
correct = [True,True,False,True]
rows = risk_coverage_curve(
scores,correct,[0,.5,.8,1])
for r in rows:
print(r['answered'],r['risk'])
# 4 0.25
# 2 0.5
# 1 0.0
# 0 None
Maak risk_coverage_curve met score≥drempel. Sorteer unieke drempels en rapporteer per drempel answered, correct, coverage en risk. Reële scores en drempels liggen tussen nul en één; correct bevat echte booleans.
Coverage kan bij een hogere grens alleen dalen of gelijk blijven. Risico hoeft niet te dalen, omdat deze scores geen gekalibreerde waarheidskansen zijn. Kies een grens op ontwikkeldata en toets daarna apart, inclusief aantallen en relevante groepen.
De twee laagste scores horen bij goede antwoorden. Een hoge score is hier geen gekalibreerde waarheidskans.
Bij geen antwoorden bestaat er geen risico onder beantwoorde gevallen. Dat is geen gemeten foutloos systeem.
Wat neem je mee?
- Ondersteuning, tegenspraak, ontbrekend bewijs en conflict zijn verschillende uitkomsten.
- Coverage en risico hebben verschillende noemers.
- Een hoge score of een bronvermelding bewijst geen waarheid.
Hierna bouw je een evaluatie die deze fouten zichtbaar houdt bij het vergelijken van varianten.