KI und Quelldokumente: Wie man LLM-Halluzinationen stoppt
TL;DR. LLM-„Halluzination" ist ein Symptom, keine Diagnose. Die Diagnose lautet: schlechtes Retrieval und/oder schlechte Zitation. Dieser Artikel beschreibt, wie man KI-Antworten auf Kundendokumenten so aufbaut, dass jede Aussage einen Verweis auf einen konkreten Abschnitt eines konkreten Dokuments enthält und jeder Entwickler die Antwort in 10 Sekunden verifizieren kann. Ansatz: citation-mandatory-Generierung + hybrides Retrieval + strukturiertes Ingest + ein solides Eval-Set.
1. Das Problem: „Die KI hat sich das ausgedacht"
Die Szene: Ein KI-Assistent wurde auf Kundendokumenten eingesetzt. Eine Woche später schreibt der Abteilungsleiter: „Er hat gesagt, unsere Vorschrift sagt X. Ich habe die Vorschrift geöffnet, und X steht dort nicht. Was machen wir jetzt?"
Wenn die Antwort des Teams lautet: „Nun, das ist eine LLM-Halluzination, das passiert, wir arbeiten am Prompt", dann ist das Projekt tot. Der Kunde hat das Vertrauen verloren, und Vertrauen kehrt selten zurück.
Das ist ein lösbares Problem. Die Lösung ist architektonischer Natur, nicht „bitten Sie das LLM, vorsichtiger zu sein." Die Kernidee: Jede Aussage in der Antwort muss einen Verweis auf einen konkreten Chunk eines konkreten Dokuments haben, und der Verweis muss automatisch überprüfbar sein.
2. Für wen das relevant ist
- Regulierte Branchen: Arbeitssicherheit, Medizin, Recht, Buchhaltung, also überall dort, wo „die KI hat sich geirrt" echten Schaden bedeutet.
- Interne Wissensdatenbanken: wo Mitarbeiter dem System vertrauen und schnell prüfen müssen.
- Kundensupport: wo eine falsche Antwort Rücksendungen / Beschwerden / Churn bedeutet.
- Jedes Projekt, wo „die KI hat geantwortet" irgendwann von einem Menschen überprüft wird und sich die Prüfzeit mit Tausenden von Anfragen multipliziert.
3. Der häufige Fehler
- Standard-RAG-Template nehmen: Chunking → Embeddings → top-K → LLM.
- Annehmen „das LLM ist klug, es findet die Quellen selbst."
- Antworten ohne Zitierungen erhalten. Oder Zitierungen im Stil „gemäß Dokument X", ohne Seitenzahl.
- Fragt die Juristin „Zeigen Sie mir, wo genau das steht", gibt es keine Antwort.
Weitere Fallen:
- Chunking nach Zeichenzahl. Dokumentstruktur geht verloren. Tabellen werden halbiert.
- Nur Dense-Retrieval. Exakte Codes und Kennzeichen werden nicht gefunden.
- Prompt „antworte nur aus dem Kontext" ohne Post-Validierung. Das LLM ignoriert ihn nach Belieben.
- Kein Eval-Set für „Verweigerungen." Niemand hat getestet, ob das System tatsächlich eine Antwort verweigert, wenn die Quelle die Antwort nicht enthält.
4. Der technische Ansatz: Strukturiertes Ingest + Citation-Mandatory-Generierung
Die Pipeline, wie sie sein sollte:
flowchart LR RAW[PDF / DOCX / HTML] --> PARSE[Strukturierter Parser<br/>Seite, Abschnitt, Tabelle] PARSE --> CHUNK[Intelligentes Chunking<br/>Struktur respektieren] CHUNK --> META[Metadaten-Anreicherung<br/>Seite, Abschnitt, Sprache] META --> EMB[Embeddings + FTS] EMB --> PG[(Postgres + pgvector)] QUERY[Benutzerfrage] --> HYBRID[Hybrides Retrieval<br/>BM25 + Dense + RRF] HYBRID --> RERANK[Cross-Encoder Rerank] RERANK --> PROMPT[Citation-Mandatory Prompt] PROMPT --> LLM[LLM] LLM --> VALIDATE[Zitierungs-Validator] VALIDATE -- ok --> ANSWER[Antwort mit Markierungen<br/>doc:42#p:18#§:4.2] VALIDATE -- fail --> RETRY[Retry mit Top-3 erzwungen] RETRY --> VALIDATE
4.1. Strukturierter Parser
Nicht „PDF → Text." Sondern „PDF → Folge von (Seite, Abschnitt, Zeichenbereich, Text, Tabelle?, Bild?)." Dafür:
- PDF:
pdfplumberoderpymupdfmit Koordinatenerhaltung. - DOCX:
python-docxmit Style-Runs. - Komplexe gescannte Dokumente: OCR (Tesseract oder PaddleOCR) mit Spracherkennung.
4.2. Intelligentes Chunking
Regeln, die wir anwenden:
- Satz nicht mittendrin trennen.
- Tabelle nicht trennen.
- Wenn ein Abschnitt kurz ist (< 500 Tokens), ist der ganze Abschnitt = ein Chunk.
- Bei langen Abschnitten: Sliding Window 400 Tokens mit Overlap 80, Reset an Abschnittsgrenzen.
- Jeder Chunk trägt Metadaten:
{Seite, Abschnitt, Elternabschnitt, Sprache, Quell-URI}.
4.3. Citation-Mandatory Prompt
Vorlage (vereinfacht):
Sie antworten nur auf Basis der unten stehenden Fragmente.
Jede Aussage in der Antwort MUSS mit einer Markierung
der Form [doc:ID#chunk:N] enden.
Wenn die Fragmente keine Antwort enthalten, antworten Sie:
„Die bereitgestellten Quellen enthalten keine Antwort auf diese Frage."
Fügen Sie keine Fakten hinzu, die nicht in den Fragmenten stehen.
Fragmente:
[doc:42#chunk:7] (Seite 18, §4.2) ... Text ...
[doc:42#chunk:8] (Seite 19, §4.3) ... Text ...
...
Frage: {frage}
4.4. Post-Validierung
Nach der Generierung prüft einfacher Code:
def validate_citations(answer: str, allowed_chunk_ids: set[str]) -> bool:
sentences = split_sentences(answer)
for s in sentences:
markers = re.findall(r"\[doc:(\d+)#chunk:(\d+)\]", s)
if not markers:
return False # Satz ohne Zitierung
for doc_id, chunk_id in markers:
if f"{doc_id}#{chunk_id}" not in allowed_chunk_ids:
return False # Zitierung auf falsche Quelle
return True
Schlägt die Validierung fehl, folgt ein erneuter LLM-Aufruf mit den drei besten Chunks als Pflichtkontext und einem strengeren Prompt. Scheitert auch das, antwortet das System: „Die Quellen enthalten keine Antwort."
5. Tabelle: Kriterien für „echte" Zitierung
| Kriterium | Schwach | Gut | Ausgezeichnet |
|---|---|---|---|
| Dokument identifiziert | „laut Vorschrift" | „laut Vorschrift X" | Dok-ID + Name |
| Seite identifiziert | nein | am Absatzende | pro Satz |
| Abschnitt identifiziert | nein | Kapitel | Kapitel + Paragraph |
| Zitierung automatisch prüfbar | nein | Regex | maschinenlesbar + Hyperlink |
| Verweigerung bei fehlender Quelle | nein | manchmal | immer |
| Eval-Set für Verweigerungen | nein | 5–10 Fragen | 30+ Sondierungsfragen |
6. SINTARIS-Minicase
Worksafety Superassistant ist unsere anspruchsvollste Zitierungs-Implementierung. Korpus: rund 3000 Seiten Arbeitsschutzvorschriften plus interne SOPs des Kunden.
Was gemacht wurde:
- Strukturierter Parser mit Erhalt von (Seite, Abschnitt, Paragraph).
- Hybrides Retrieval mit BM25-Priorität (Vorschriften sind schlüsselwortreich).
- Citation-mandatory Prompt + Validator.
- Sondierungsset mit 30 „Fangfragen" (z.B. „Was sind die PSA-Normen für Unterwasserschweißen in der Höhe?" Diese Norm existiert nicht, erwartete Antwort: „nicht gefunden").
- Eval-Set mit 120 echten Fragen und Referenz-Zitierungen.
Metriken nach 6 Monaten:
- Zitierungsgenauigkeit (Zitierung führt zu Chunk, der die Aussage tatsächlich stützt): 94 %.
- Verweigerungskorrektheit (Anteil korrekter Verweigerungen im Sondierungsset): 96 %.
- Medianlatenz: 2,1 Sek. (einschließlich Rerank).
- Beschwerden von Sicherheitsbeauftragten pro Quartal: 0.
Details: Worksafety § 6 RAG pipeline.
7. Checkliste (15 Punkte) für Citation-Mandatory RAG
- Parser erhält Struktur (Seite, Abschnitt, Paragraph), kein „ganzes PDF als Blob."
- Chunking respektiert Struktur und trennt keine Sätze und Tabellen.
- Metadaten (Seite, Abschnitt) werden in jedem Chunk gespeichert.
- Hybrides Retrieval (BM25 + Dense + RRF) statt reiner Embeddings.
- Cross-Encoder Rerank: Top-12 → Top-5.
- Prompt-Vorlage verlangt Zitierungsmarkierungen.
- Post-Validierung prüft das Vorhandensein von Markierungen.
- Verweigerungsmuster: „nicht in Quellen" als vollwertiges Verhalten.
- Eval-Set mit mindestens 30 Fragen mit Referenz-Zitierungen.
- Sondierungsset für Verweigerungen mit mindestens 20 nicht beantwortbaren Fragen.
- Zitierungsgenauigkeit wird gemessen und in Grafana angezeigt, nicht „manuell manchmal."
- Verweigerungsrate wird gemessen, getrennt von der Genauigkeit.
- Drift-Monitor prüft wöchentlich, ob die Metriken gesunken sind.
- Retrieval-Schwelle: Bei Top-1-Score < X wird abgelehnt.
- Hyperlinks in Antworten: Der Benutzer klickt und sieht das Quelldokument.
8. Risiken
- Latenz. Cross-Encoder Rerank + Validierung fügen 200–400 ms hinzu. Für Geschäftsszenarien in Ordnung, schlecht für Echtzeit-Chat. Lösung: häufige Anfragen cachen.
- „Zu vorsichtig." Bei zu hohem Schwellenwert sagt das System oft „ich weiß es nicht." Durch Kalibrierung am Eval-Set beheben.
- Strukturiertes Parsing komplexer PDFs. Gescannte Tabellen sind immer noch schwierig. Zeit für OCR-Überprüfung einplanen.
- Mehrsprachige Zitierungen. Wenn die Vorschriften auf Deutsch vorliegen, die Antworten aber auf Slowenisch kommen, müssen die Zitiermarken sprachunabhängig sein. Numerische IDs sind besser als „§4.2".
9. Was als Nächstes zu tun ist
Wenn Sie bereits einen RAG-Pilot haben, der gelegentlich „lügt", beginnen Sie mit zwei Schritten:
- Citation-mandatory Prompt + Validator einschalten.
- Sondierungsset mit 20 Fragen aufbauen, die keine Antwort im Korpus haben, und Verweigerungskorrektheit messen.
Oft reichen diese zwei Schritte aus, um die Qualität von „manchmal richtig" auf „immer entweder richtig oder ehrlich abgelehnt" zu heben.
Wenn Sie den vollständigen Zyklus durchlaufen möchten: Der KI-Pilot über 4–8 Wochen umfasst den Aufbau von RAG mit Zitierpflicht als Standardmuster. Umfang und Preis legen wir nach dem Erstgespräch fest.
10. Quellen
- Lewis, P. et al. (2020). Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks. arXiv:2005.11401.
- Karpukhin, V. et al. (2020). Dense Passage Retrieval for Open-Domain Question Answering. arXiv:2004.04906.
- Cormack, G., Clarke, C., Buettcher, S. (2009). Reciprocal Rank Fusion outperforms Condorcet and individual rank learning methods. SIGIR '09.
- Liu, N. F. et al. (2023). Lost in the Middle: How Language Models Use Long Contexts. arXiv:2307.03172.
- Es, S. et al. (2024). RAGAS: Automated Evaluation of Retrieval-Augmented Generation. arXiv:2309.15217.
- pdfplumber: https://github.com/jsvine/pdfplumber
- PaddleOCR: https://github.com/PaddlePaddle/PaddleOCR
SINTARIS baut RAG-Systeme mit überprüfbaren Quellenangaben für Unternehmen in der EU. Das Erstgespräch ist kostenlos und dauert 30 Minuten.