Fast jeder KI-Support-Chatbot zeigt unter seinen Antworten eine Zeile mit Quellen. Diese Funktion lässt die Antwort nachprüfbar wirken: Hier habe ich das her.
In den meisten Implementierungen lügt diese Zeile dich an. Nicht böswillig – aber sie beantwortet eine andere Frage als die, die der Nutzer stellt.
Gefunden ist nicht dasselbe wie benutzt
Ein Chatbot mit Retrieval-Augmented Generation antwortet ungefähr so: die Wissensdatenbank durchsuchen, die besten Treffer in den Kontext des Modells legen und es schreiben lassen. Der naheliegende Weg, die Quellenzeile zu bauen: anzeigen, was diese Suche zurückgegeben hat.
So machen es die meisten Produkte, und es ist auf eine ganz bestimmte Weise falsch. Eine semantische Suche liefert zehn Kandidaten, weil zehn eine vernünftige Auswahl für ein Sprachmodell ist. Das Modell liest sie und nutzt einen davon. Alle zehn als Quellen anzuzeigen sagt dem Nutzer, dass zehn Artikel in die Antwort eingeflossen sind, obwohl neun verworfen wurden.
Der Fehler ist leise. Niemand meldet einen Bug mit dem Titel „In der Quellenzeile stehen zu viele Einträge“. Die Nutzer merken einfach mit der Zeit, dass die Zeile nur Dekoration ist – und lesen sie nicht mehr. Du hast die vollen Entwicklungskosten für Quellenangaben bezahlt und nichts von dem Vertrauen bekommen, das sie bringen sollten.
Das Problem mit „alles auflisten“
Der Fehler wird deutlicher, sobald ein Nutzer etwas zur Struktur fragt.
„Zu welchen Themen habt ihr Artikel?“
Ein guter Assistent antwortet mit einer Liste deiner Artikel. Jetzt enthält die Quellenzeile jeden Artikel deines Hilfecenters und wiederholt direkt unter der Antwort genau die Links, die schon in der Antwort stehen. Der Nutzer sieht dieselben dreißig Titel zweimal.
An dieser Stelle bricht die Abstraktion sichtbar, und das solltest du ernst nehmen, denn es zeigt den eigentlichen Bug: Die Herkunft lässt sich nicht aus dem Retrieval ableiten. Du musst sie aus dem ableiten, was das Modell getan hat.
Drei Mengen, nicht eine
Die Lösung: Hör auf, das als eine einzige Liste zu behandeln. Hinter jeder Antwort stehen drei verschiedene Mengen von Dokumenten:
Gefunden – alles, was irgendein Tool während des Turns zurückgegeben hat. Diese Menge zeigen die meisten Produkte an. Ihre eigentliche Aufgabe ist eine andere, und sie ist wichtig: Sie ist die Allowlist. Wenn das Modell ein Dokument zitiert, das nie gefunden wurde, hat es die Quelle erfunden, und du verwirfst sie. Diese Prüfung ist nicht theoretisch. Bei meinen eigenen Tests hat ein Modell, das dreißig Dokument-IDs abschrieb, eine davon um ein einziges Zeichen falsch wiedergegeben – die Prüfung hat das abgefangen und aus der kaputten ID keine Quelle gemacht.
Zitiert – die Dokumente, auf die die Antwort tatsächlich verlinkt. Damit werden Inline-Quellenangaben klickbar, und das ist die ehrliche Grundlage für eine nutzungsbasierte Abrechnung.
Herangezogen – die Dokumente, deren Text das Modell gelesen hat. Nur diese Menge gehört in eine Quellenzeile.
Die dritte Menge berechnet niemand, und dabei ist das nicht schwer. Du weißt bereits, welches Tool welches Dokument zurückgegeben hat. Manche Tools geben dem Modell echten Inhalt: eine Suche, die Auszüge liefert, oder ein Aufruf „dieses Dokument holen“, der den ganzen Text liefert. Andere geben ihm ein Inhaltsverzeichnis: Kategorien auflisten, Artikel auflisten, einen Bereich durchblättern. Diese Tools liefern Titel.
Also:
Das Modell hat ein Dokument vollständig geöffnet → es ist eine Quelle, ob die Antwort es verlinkt oder nicht. Das Öffnen ist der Herkunftsnachweis. Wenn das Modell einen Artikel zusammenfasst und vergisst, einen Markdown-Link zu schreiben, ist das ein Formatierungsfehler, kein fehlender Beleg.
Eine Suche hat es geliefert und die Antwort hat es zitiert → es ist eine Quelle. Das Zitat zeigt, welcher der zehn Kandidaten verwendet wurde.
Das Modell hat es nur als Titel in einer Liste gesehen → es ist nie eine Quelle, auch wenn die Antwort es verlinkt.
Nach dieser Regel ergibt „Welche Artikel habt ihr?“ eine saubere Liste funktionierender Links und gar keine Quellenzeile, weil das Modell nichts gelesen hat. Und „Wie richte ich SSO ein?“ ergibt einen Absatz mit ein oder zwei Chips darunter – den Artikeln, die es wirklich gelesen hat.
Das Designdetail, an dem es hakt
Bei der Umsetzung gibt es eine Falle, und es lohnt sich, sie zu benennen. Man setzt das leicht so falsch um, dass alles gut aussieht, bis ein Nutzer etwas anklickt.
Dein Quellen-Array hat meist zwei Aufgaben. Es liefert die Daten hinter den Chips, und es ist die Nachschlagetabelle, die Inline-Quellenangaben klickbar macht: Der Klick-Handler sucht die Dokument-ID der Quellenangabe in diesem Array und öffnet das Dokument.
Du kannst das Array also nicht einfach auf die herangezogenen Dokumente verkleinern. Tust du es doch, ist jeder Link in einer Listen-Antwort tot: als Quellenangabe gerendert, als Quellenangabe gestylt und beim Klick ohne Wirkung.
Behalte die volle Menge der zitierten Dokumente im Payload, markiere jeden Eintrag mit einem Flag und filtere erst bei der Anzeige. Ein Boolean pro Quelle, gefiltert im Renderer. Die Links funktionieren weiter; die Chips sagen die Wahrheit.
Mach das Flag optional
Wenn du das als API-Änderung auslieferst, mach das Feld optional statt verpflichtend und behandle einen fehlenden Wert als „ja, anzeigen“.
Diese eine Entscheidung sorgt dafür, dass ein alter Client mit einem neuen Server weiter funktioniert und ein neuer Client mit einem alten Server auf das bisherige Verhalten zurückfällt, statt alle Quellen auszublenden. Du wirst nie beide Seiten im selben Moment deployen, und Nutzer haben gecachte Kopien deines Widgets länger, als dir lieb ist.
Warum sich der Aufwand lohnt
Eine Quellenzeile ist eine Behauptung: Diese Antwort stammt aus diesen Dokumenten. Wird die Behauptung aus dem Retrieval erzeugt, stimmt sie ungefähr, und Nutzer merken das irgendwann. Wird sie aus dem erzeugt, was das Modell tatsächlich gelesen hat, stimmt sie genau. Dann ist sie für dein Support-Team der schnellste Weg, eine missratene Antwort zu prüfen.
Und es gibt einen zweiten Gewinn. Sobald „keine Quellen“ verlässlich „das Modell hat nichts gelesen“ bedeutet, wird es zu einem echten Signal. Eine Antwort ohne Quellen auf eine inhaltliche Frage zum Produkt ist eine Lücke in der Dokumentation. Diese Antworten kannst du filtern und zu einer Liste von Artikeln machen, die du noch schreiben musst.
Das funktioniert nur, wenn die Zeile etwas bedeutet.
Der KI-Assistent im Website-Widget von Kookee folgt dieser Regel: Die Zeile „Quellen“ zeigt die Artikel, auf denen eine Antwort aufbaut, und jeder Artikel, den die Antwort verlinkt, bleibt klickbar. Die Einzelheiten stehen in So wählt der Assistent seine Quellen, das größere Bild in So baust du ein Hilfecenter für dein SaaS.