KI und Quelldokumente: Wie man LLM-Halluzinationen stoppt
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 — 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" — 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 — wo „die KI hatte Unrecht" = Schaden.
- 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 die Prüfzeit mit tausend 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.
- Wenn der Anwalt fragt „zeigen Sie mir genau wo" — 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.
- Wenn lang — 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 — 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
Bei Validierungsfehler — LLM-Wiederholung mit Top-3-Chunks erzwungen und strengerem Prompt. Wenn das auch scheitert — 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 — unsere anspruchsvollste Zitierungs-Implementierung. Korpus: ~3000 Seiten Arbeitsschutzvorschriften (RU + EAWU + EU) 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 (beim Sondierungsset — korrekte Verweigerungen): 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 — trennt keine Sätze und Tabellen.
- Metadaten (Seite, Abschnitt) werden in jedem Chunk gespeichert.
- Hybrides Retrieval (BM25 + Dense + RRF) — nicht nur 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 erstklassiges Verhalten.
- Eval-Set — mindestens 30 Fragen mit Referenz-Zitierungen.
- Sondierungsset für Verweigerungen — mindestens 20 nicht beantwortbare Fragen.
- Zitierungsgenauigkeit wird gemessen — in Grafana angezeigt, nicht „manuell manchmal."
- Verweigerungsrate wird gemessen — getrennt von der Genauigkeit.
- Drift-Monitor — prüft wöchentlich, ob Metriken nicht gesunken sind.
- Retrieval-Schwelle — bei Top-1-Score < X wird abgelehnt.
- Hyperlinks in Antworten — 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 Vorschriften auf Russisch sind, Antworten aber auf Deutsch — müssen Zitierungsbezeichnungen sprachstabil sein. Besser numerische IDs 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 ablehnen" zu heben.
Wenn Sie den vollständigen Zyklus durchlaufen möchten — KI-Pilot über 4–8 Wochen umfasst den Aufbau von citation-mandatory RAG als Standardmuster. Für slowenische Unternehmen −25 % vom 1. bis 30. Juni 2026.
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 erstellt RAG-Systeme mit überprüfbaren Zitierungen für Unternehmen in der EU und der GUS. Discovery-Call — kostenlos, 30 Minuten.