Faktenprüfung und Vermeidung von Halluzinationen
Verifikation durch Grounding: Jede Aussage muss auf eine abgerufene Quelle zurückführbar sein.
Faktenprüfung und Vermeidung von Halluzinationen ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Das Halluzinationsproblem bei Recherche-Agenten
LLMs können plausibel klingende Behauptungen erzeugen, die keine Grundlage in den abgerufenen Quellen haben. Bei einem Recherche-Agenten ist das besonders gefährlich, weil die Ausgabe autoritativ wirkt und mit Quellenangaben versehen ist, die die Behauptung möglicherweise gar nicht stützen.
Die Vermeidung von Halluzinationen muss ein zentrales Anliegen sein.
Verankerung: Jede Aussage lässt sich auf eine Quelle zurückführen
Das Kernprinzip der Verankerung: Jede Tatsachenbehauptung in der endgültigen Ausgabe muss sich auf mindestens ein abgerufenes Dokument zurückführen lassen. Aussagen, die sich nicht zurückführen lassen, sind entweder halluziniert oder unbelegt – beides ist in einem Forschungsbericht nicht akzeptabel.
def check_grounding(claim: str, retrieved_docs: list[dict]) -> dict:
doc_texts = '\n\n'.join(
f'[DOC {i+1}] ({d["url"]})\n{d["text"][:800]}'
for i, d in enumerate(retrieved_docs[:5])
)
return {
'claim': claim,
'docs': doc_texts,
'grounded': None # to be filled by LLM verifier
}
if __name__ == '__main__':
docs = [{'url': 'https://example.com/geo', 'text': 'Paris is the capital of France.'}]
result = check_grounding('Paris is the capital of France.', docs)
print('Claim:', result['claim'])
print('Supporting docs used:')
print(result['docs'])
LLM-as-Verifier-Muster
Verwenden Sie einen separaten LLM-Aufruf – den „Verifier“ –, um zu beurteilen, ob eine Aussage durch die bereitgestellten Quellen gestützt wird. Dadurch entsteht ein Kontrollmechanismus, bei dem Generator und Verifier unabhängige Aufrufe sind.
import openai, json
client = openai.OpenAI(api_key='YOUR_OPENAI_KEY')
def verify_claim(claim: str, source_texts: list[str]) -> dict:
sources_block = '\n---\n'.join(source_texts[:3])
prompt = (
f'Is the following claim directly supported by the provided sources?\n'
f'Claim: "{claim}"\n\n'
f'Sources:\n{sources_block}\n\n'
f'Return JSON: {{\n'
f' "supported": true/false,\n'
f' "confidence": 0.0-1.0,\n'
f' "reason": "one sentence explanation"\n'
f'}}'
)
resp = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content)Vertrauensgesteuerte Ausgabe
Setzen Sie Schwellenwerte für den Konfidenzwert des Verifiers. Aussagen über 0,85 werden veröffentlicht. Zwischen 0,5 und 0,85 werden sie mit einem Haftungsausschluss veröffentlicht. Unter 0,5 werden sie ausgeschlossen.
INCLUDE_THRESHOLD = 0.85
DISCLAIMER_THRESHOLD = 0.50
def gate_claim(claim: str, source_texts: list[str]) -> dict:
result = verify_claim(claim, source_texts)
conf = result.get('confidence', 0.0)
supported = result.get('supported', False)
if not supported or conf < DISCLAIMER_THRESHOLD:
return {'action': 'exclude', 'claim': claim, 'reason': result.get('reason')}
elif conf < INCLUDE_THRESHOLD:
return {
'action': 'include_with_disclaimer',
'claim': f'[LOW CONFIDENCE] {claim}',
'reason': result.get('reason')
}
else:
return {'action': 'include', 'claim': claim}Bestimmte Halluzinationsmuster erkennen
Bestimmte Muster von Aussagen bergen ein hohes Halluzinationsrisiko: exakte Statistiken (Prozentsätze, Geldbeträge), konkrete Daten, namentlich genannte Personen und Kausalzusammenhänge. Prüfen Sie diese besonders sorgfältig.
import re
def is_high_risk_claim(claim: str) -> bool:
patterns = [
r'\d+\.?\d*\s*%', # percentages: 9.1%
r'\$\s*\d+', # dollar amounts
r'\b(January|February|March|April|May|June|July|August|September|October|November|December)\s+\d{4}', # dates
r'\b[A-Z][a-z]+\s+[A-Z][a-z]+\s+(said|stated|argued|claimed)', # named quotes
r'(caused?|led to|resulted in)', # causal claims
]
return any(re.search(p, claim) for p in patterns)
print(is_high_risk_claim('Inflation hit 9.1% in June 2022')) # True
print(is_high_risk_claim('Inflation was elevated')) # FalseDie zerlegte Verifizierungsschleife
Zerlegen Sie bei langen Abschnitten den Text in einzelne Aussagen, verifizieren Sie jede Aussage unabhängig und setzen Sie den Abschnitt anschließend ausschließlich aus verifizierten Aussagen wieder zusammen.
def decompose_into_claims(section_text: str) -> list[str]:
prompt = (
f'Break this text into individual verifiable factual claims.\n'
f'Each claim should be a single sentence containing exactly one fact.\n'
f'Return JSON: {{"claims": ["..."]}}\n\n'
f'TEXT:\n{section_text}'
)
resp = client.chat.completions.create(
model='gpt-4o-mini',
messages=[{'role': 'user', 'content': prompt}],
response_format={'type': 'json_object'}
)
return json.loads(resp.choices[0].message.content).get('claims', [])Verifizierten Text wieder zusammensetzen
Setzen Sie nach der Prüfung jeder Aussage einen klaren, kohärenten Abschnitt ausschließlich aus den verifizierten Aussagen zusammen. Schließen Sie Aussagen mit niedriger Konfidenz aus und formulieren Sie den Text für bessere Lesbarkeit neu.
def reconstruct_section(verified_claims: list[str],
section_name: str) -> str:
claims_text = '\n'.join(f'- {c}' for c in verified_claims)
prompt = (
f'Rewrite these verified facts as a coherent {section_name} section.\n'
f'Do NOT add any new information not present in the claims.\n'
f'Only use the facts provided.\n\n'
f'VERIFIED CLAIMS:\n{claims_text}'
)
resp = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': prompt}]
)
return resp.choices[0].message.contentNumerische Abweichungen erkennen
LLMs verändern Zahlen aus der Quelle manchmal unmerklich (z. B. wird aus 9,1 % 9,2 %). Extrahieren Sie die Zahlen sowohl aus der Aussage als auch aus dem Quelltext und vergleichen Sie sie ausdrücklich.
import re
def extract_numbers(text: str) -> list[float]:
matches = re.findall(r'[-+]?\d*\.?\d+', text)
return [float(m) for m in matches]
def check_numeric_drift(claim: str, source_text: str,
tolerance: float = 0.01) -> bool:
claim_nums = extract_numbers(claim)
source_nums = extract_numbers(source_text)
for cn in claim_nums:
found_match = any(abs(cn - sn) <= tolerance for sn in source_nums)
if not found_match:
return True # numeric drift detected
return False
print(check_numeric_drift(
'Inflation reached 9.2% in June 2022',
'The CPI rose 9.1 percent in June 2022'
)) # True — 9.2 vs 9.1Attributionsprüfung
Führen Sie nach der Erstellung eines vollständigen Berichts eine Attributionsprüfung durch: Bestätigen Sie für jeden Satz im Bericht, dass er einer der Quellen zugeordnet werden kann. Kennzeichnen Sie jeden Satz, für den kein passender Quellenausschnitt vorhanden ist.
def attribution_audit(report_text: str, sources: list[dict]) -> list[str]:
sentences = [s.strip() for s in report_text.split('.') if len(s.strip()) > 20]
unattributed = []
for sentence in sentences:
found = False
for src in sources:
if any(word in src.get('text', '') for word in sentence.split()[:5]):
found = True
break
if not found:
unattributed.append(sentence)
return unattributed
# Flag unattributed sentences for manual review or re-verification
if __name__ == '__main__':
report = ("Water boils at 100 degrees Celsius at sea level. "
"The moon is made primarily of green cheese according to this document.")
sources = [{'text': 'Water boils at 100C (212F) at standard atmospheric pressure.'}]
unattributed = attribution_audit(report, sources)
print('Unattributed sentences (need manual review):')
for s in unattributed:
print(' -', s)
Unsichere Aussagen vorsichtig formulieren
Nicht alles lässt sich mit hoher Konfidenz verifizieren. Statt grenzwertige Aussagen vollständig auszuschließen, verwenden Sie vorsichtige Formulierungen: „Einige Analysten vermuten …“, „Laut X …“, „Es wurde berichtet, dass …“. So bleiben Informationen erhalten, während die Unsicherheit kenntlich gemacht wird.
def hedge_claim(claim: str, confidence: float) -> str:
if confidence >= 0.85:
return claim # state as fact
elif confidence >= 0.65:
hedges = ['Some sources suggest', 'According to available evidence',
'Analysts have noted']
return f'{hedges[hash(claim) % len(hedges)]}, {claim.lower()}'
else:
return f'It has been reported (with low confidence) that {claim.lower()}'
print(hedge_claim('Inflation peaked at 9.1%', 0.90))
print(hedge_claim('Supply chain disruptions contributed to inflation', 0.72))
print(hedge_claim('Specific policy caused inflation', 0.45))Halluzinationsrate überwachen
Verfolgen Sie die Halluzinationsrate im Zeitverlauf: Wie viel Prozent der generierten Aussagen bestehen die Verifizierung nicht? Legen Sie einen Schwellenwert für Warnungen fest. Wenn die Rate stark ansteigt, hat sich entweder Ihr Prompt Engineering oder die Qualität des Retrievals verschlechtert.
verification_log = [] # In production: a database
def log_verification(claim: str, supported: bool, confidence: float):
verification_log.append({
'claim': claim[:100],
'supported': supported,
'confidence': confidence
})
def hallucination_rate() -> float:
if not verification_log:
return 0.0
failed = sum(1 for v in verification_log if not v['supported'])
return failed / len(verification_log)
def check_hallucination_alert(threshold: float = 0.15):
rate = hallucination_rate()
if rate > threshold:
print(f'ALERT: Hallucination rate {rate:.1%} exceeds threshold {threshold:.1%}')
return rate
if __name__ == '__main__':
log_verification('The sky is blue', True, 0.95)
log_verification('The moon is made of cheese', False, 0.2)
log_verification('Water boils at 100C at sea level', True, 0.99)
rate = check_hallucination_alert(threshold=0.15)
print(f'Hallucination rate so far: {rate:.1%}')
Was ist der Hauptzweck des „LLM-as-verifier“-Musters?
Der LLM-as-Verifier ist ein wichtiges Architekturpattern zur Vermeidung von Halluzinationen. Es ist entscheidend zu verstehen, was dabei geprüft wird und warum dies in einem separaten Aufruf geschieht.
Zusammenfassung zur Halluzinationsvermeidung
Vermeiden Sie Halluzinationen durch: Verankerungsprüfungen (jede Aussage lässt sich auf eine Quelle zurückführen), LLM-as-Verifier (ein separater Aufruf prüft die Belegbarkeit), Konfidenzfilterung (Aussagen unterhalb des Schwellenwerts ausschließen), Erkennung numerischer Abweichungen, vorsichtige Formulierungen für grenzwertige Fälle und Überwachung der Halluzinationsrate zur Erkennung von Regressionen.
Häufig gestellte Fragen
Ist die Lektion „Faktenprüfung und Vermeidung von Halluzinationen“ kostenlos?
Ja — der vollständige Text von „Faktenprüfung und Vermeidung von Halluzinationen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Faktenprüfung und Vermeidung von Halluzinationen“?
Verifikation durch Grounding: Jede Aussage muss auf eine abgerufene Quelle zurückführbar sein. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Faktenprüfung und Vermeidung von Halluzinationen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Entwurf mehrstufiger Recherche-Schleifen
- Quellenprüfung und Zitierung
- Strukturierte Berichte generieren
- Faktenprüfung und Vermeidung von Halluzinationen