Die Grenzen des Modells
Kurz gesagt: Ein Sprachmodell halluziniert: Es schreibt selbstsicher plausible, aber falsche Dinge, weil es wahrscheinlichen Text vorhersagt, statt die Wahrheit zu prüfen; deshalb wird die Antwort an der Quelle geprüft.
Problem
Dreißig Tage, die es nicht gibt
Der Support-Assistent antwortet einem Kunden: „Die Jacke kann innerhalb von 30 Tagen nach der Lieferung zurückgegeben werden.“ Die Antwort ist höflich, glatt und selbstsicher. Die Richtlinie des Shops sagt 14 Tage.
Am zwanzigsten Tag schickt der Kunde die Jacke zurück. Das Lager lehnt die Rücksendung ab, und der Kunde schreibt eine Ein-Stern-Bewertung, in der er den Assistenten zitiert.
Niemand hat „30 Tage“ programmiert. Woher kam die Zahl, und wie schützt du dich vor der nächsten?
Die Idee
Das Modell schreibt wahrscheinlichen Text, keine geprüften Fakten
Ein Sprachmodell wird darauf trainiert, einen Text mit einem wahrscheinlichen nächsten Wort fortzusetzen. Es führt keine Tabelle mit Fakten und prüft seine Antwort nicht. Wenn in seinem Lerntext auf „innerhalb von“ immer eine Zahl folgt, setzt es eine Zahl dorthin. Welche, entscheidet die Wahrscheinlichkeit, nicht die Richtlinie des Shops.
Eine glatte, selbstsichere Antwort, die falsch oder erfunden ist, heißt Halluzination. Das ist kein Fehler, den ein einzelner Patch behebt. Er kommt aus der Art, wie das Modell schreibt: Für es sind der wahre und der falsche Satz nur wahrscheinlicherer und weniger wahrscheinlicher Text.
Sieh es dir an
Ein kleines Modell, das das Falsche verspricht
Das Modell aus der Lektion über das nächste Token in seiner kleinsten Form: Zu jedem Wort merkt es sich die Wörter, die im Text darauf folgten. Die Wiederholungen bleiben, ein häufigeres Wort wird also öfter gezogen.
# für jedes Wort: die Wörter, die im Text darauf folgtendef train(corpus): follows = {} for sentence in corpus: words = (sentence + " .").split(" ") for word, after in zip(words, words[1:]): follows.setdefault(word, []).append(after) return followsDer Text besteht aus zehn kurzen Notizen aus dem Support des Shops:
corpus = [ "rückgabe innerhalb von 14 tagen", "verweigerte sendung geht innerhalb von 7 tagen zurück", "rückgabe ist kostenlos", "ab 50 euro ist der versand kostenlos", "lieferung nach hamburg innerhalb von 2 tagen", "lieferung nach münchen innerhalb von 3 tagen", "der kurier ruft vor der lieferung an", "lieferung nach berlin innerhalb von 2 tagen", "garantie 24 monate", "erstattung innerhalb von 5 werktagen",]Das wahrscheinlichste Wort jedes Mal:
# das häufigste (bei Gleichstand das erste im Text)def most_common(options): return max(options, key=options.count)
def greedy(follows, start): words = start.split(" ") while len(words) < 12: last = words[-1] word = most_common(follows[last]) if word == ".": break words.append(word) return " ".join(words)Und nach Wahrscheinlichkeit gezogen, mit einem Zufallsgenerator mit festem Seed, damit die Ausgabe bei jedem Lauf gleich ist:
def sample(follows, start, rng): words = start.split(" ") while len(words) < 12: options = follows[words[-1]] word = options[int(rng.next() * len(options))] if word == ".": break words.append(word) return " ".join(words)follows = train(corpus)print("das wahrscheinlichste Wort jedes Mal:")print(" " + greedy(follows, "rückgabe"))print("sechs Läufe, das Wort wird nach Wahrscheinlichkeit gezogen:")rng = Rng(3876)for i in range(1, 7): answer = sample(follows, "rückgabe", rng) mark = "steht im Text" if answer in corpus else "steht nicht im Text" print(f" {i}. {answer} ({mark})")das wahrscheinlichste Wort jedes Mal: rückgabe innerhalb von 2 tagensechs Läufe, das Wort wird nach Wahrscheinlichkeit gezogen: 1. rückgabe innerhalb von 5 werktagen (steht nicht im Text) 2. rückgabe innerhalb von 2 tagen (steht nicht im Text) 3. rückgabe innerhalb von 2 tagen zurück (steht nicht im Text) 4. rückgabe ist der lieferung an (steht nicht im Text) 5. rückgabe innerhalb von 14 tagen (steht im Text) 6. rückgabe innerhalb von 5 werktagen (steht nicht im Text)Die wahrscheinlichste Antwort ist „rückgabe innerhalb von 2 tagen“, und im Text steht 14. Von den sechs gezogenen Antworten ist nur eine ein Satz aus dem Text (der fünfte Lauf). Die anderen fünf sind falsch: „innerhalb von 5 werktagen“ gehört zur Erstattung (und kam zweimal), „innerhalb von 2 tagen“ zur Lieferung, und der vierte Lauf, „rückgabe ist der lieferung an“, ist nicht einmal mehr ein vernünftiger Satz.
Sieh es dir an
Woher die Zahl kam
# das häufigste (bei Gleichstand das erste im Text)def most_common(options): return max(options, key=options.count)
def greedy(follows, start): words = start.split(" ") while len(words) < 12: last = words[-1] word = most_common(follows[last]) if word == ".": break words.append(word) return " ".join(words)# das häufigste (bei Gleichstand das erste im Text)def most_common(options): return max(options, key=options.count)
def greedy(follows, start): words = start.split(" ") while len(words) < 12: last = words[-1] word = most_common(follows[last]) if word == ".": break words.append(word) return " ".join(words)# jede Zahl in der Antwort muss in der Quelle stehendef check(answer, source): known = numbers(source) claimed = numbers(answer) if not claimed: return "? keine Zahl zum Prüfen" for n in claimed: if n not in known: return f"✗ {n} steht nicht in der Quelle" return "✓ die Zahlen stehen in der Quelle"
def numbers(text): words = [w.strip(".,") for w in text.split(" ")] return [w for w in words if w.isdigit()]Schritt für Schritt, in Worten
- Das Modell setzt „rückgabe“ jedes Mal mit dem häufigsten nächsten Wort fort.
- „innerhalb von“ steht in 6 Sätzen, einer davon über die Rückgabe. Bis hierhin stimmt es.
- Nach „von“ kommt am häufigsten „2“: aus den zwei Sätzen über die Lieferung.
- Dann der Punkt. Ein glatter Satz, der nicht im Text steht: „rückgabe innerhalb von 2 tagen“.
- Die Prüfung nimmt die Zahlen aus der Antwort und aus den Rückgaberegeln.
- 2 steht nicht in den Regeln. Dort stehen 14 Tage.
- Jedes Wortpaar stammt aus dem Text des Shops. Der ganze Satz ist falsch, und er klingt so sicher wie ein wahrer.
Jedes Wortpaar der Antwort stimmt irgendwo im Text. Der ganze Satz stimmt nirgends. Große Modelle schauen viel weiter als ein Wort zurück und irren sich weit seltener, aber das Prinzip ist dasselbe: Sie schreiben, was wahrscheinlich ist, nicht, was geprüft ist.
Probier es aus
Sag die Ausgabe voraus
Das Modell ist mit drei Sätzen trainiert. Was schreibt es mit dem wahrscheinlichsten Wort jedes Mal, wenn es beim Wort für die Lieferung anfängt?
corpus = [ "lieferung nach berlin dauert 2 tage", "lieferung nach hamburg dauert 3 tage", "umtausch dauert 3 tage",]print(greedy(train(corpus), "lieferung"))Nach „lieferung“ kommt beide Male „nach“. Nach „nach“ kommen „berlin“ und „hamburg“ je einmal: Bei Gleichstand gewinnt das erste im Text, „berlin“. Dann „dauert“, und nach „dauert“ steht „3“ zweimal (Hamburg und der Umtausch) und „2“ einmal. Du bekommst „lieferung nach berlin dauert 3 tage“, einen Satz, der nicht im Text steht und falsch ist: Berlin braucht 2 Tage.
Die Idee
Dieselbe Frage, eine andere Antwort
Wenn das Wort nach Wahrscheinlichkeit gezogen wird, kann jeder Lauf eine andere Antwort ergeben. Im Programm ergaben die sechs Läufe fünf verschiedene Sätze. Das ist Nicht-Determinismus: dieselbe Eingabe, eine andere Ausgabe. Tests, Logs und Kundenbeschwerden werden schwieriger, denn „bei mir funktioniert es“ bedeutet nichts mehr.
Temperatur 0 (jedes Mal das wahrscheinlichste Wort) macht die Antwort wiederholbar, aber nicht richtig. Mit dem wahrscheinlichsten Wort kam im Programm jedes Mal „innerhalb von 2 tagen“. Bei echten Anbietern verspricht selbst Temperatur 0 keine völlig identische Antwort: Die Berechnungen auf dem Server laufen nicht immer in derselben Reihenfolge.
Die Idee
Der Wissensstichtag
Das Modell kennt nur den Text, mit dem es trainiert wurde. Dieser Text wurde bis zu einem bestimmten Datum gesammelt, dem Wissensstichtag. Was danach passiert ist, kennt das Modell nicht: die neue Rückgaberichtlinie, das neue Produkt, den heutigen Preis.
Und es kennt nichts, was nie in seinem Text stand: Der Status der Bestellung 1042 steht in der Datenbank des Shops, nicht im Modell. Von sich aus sagt das Modell nicht „Ich weiß es nicht“. Es schreibt eine wahrscheinliche Antwort, und daher kommt ein „kommt morgen an“, das niemand geprüft hat.
Deshalb gehören Fakten in die Anfrage: die Richtlinie als Text im Prompt, der Bestellstatus aus dem Programm. Wie das Modell den Status selbst abfragt, steht in der Lektion über Tool Use.
Die Idee
Die Antwort an der Quelle prüfen
Wenn die Antwort auf einem Dokument beruhen muss, kann das Programm wenigstens einen Teil davon prüfen. Die gröbste Prüfung: Jede Zahl in der Antwort muss in der Quelle stehen.
# jede Zahl in der Antwort muss in der Quelle stehendef check(answer, source): known = numbers(source) claimed = numbers(answer) if not claimed: return "? keine Zahl zum Prüfen" for n in claimed: if n not in known: return f"✗ {n} steht nicht in der Quelle" return "✓ die Zahlen stehen in der Quelle"
def numbers(text): words = [w.strip(".,") for w in text.split(" ")] return [w for w in words if w.isdigit()]Die sechs Antworten aus dem Programm oben gegen die Rückgaberichtlinie:
source = "Rückgabe innerhalb von 14 Tagen. Erstattung innerhalb von 5 Werktagen."answers = [ "rückgabe innerhalb von 5 werktagen", "rückgabe innerhalb von 2 tagen", "rückgabe innerhalb von 2 tagen zurück", "rückgabe ist der lieferung an", "rückgabe innerhalb von 14 tagen", "rückgabe innerhalb von 5 werktagen",]for a in answers: print(f"{a} → {check(a, source)}")rückgabe innerhalb von 5 werktagen → ✓ die Zahlen stehen in der Quellerückgabe innerhalb von 2 tagen → ✗ 2 steht nicht in der Quellerückgabe innerhalb von 2 tagen zurück → ✗ 2 steht nicht in der Quellerückgabe ist der lieferung an → ? keine Zahl zum Prüfenrückgabe innerhalb von 14 tagen → ✓ die Zahlen stehen in der Quellerückgabe innerhalb von 5 werktagen → ✓ die Zahlen stehen in der QuelleDie Prüfung fing zwei falsche Antworten ab: die beiden mit 2 Tagen (zweiter und dritter Lauf). Aber sie ließ „rückgabe innerhalb von 5 werktagen“ durch, und zwar zweimal (erster und sechster Lauf): 5 steht in der Richtlinie, nur gilt sie für die Erstattung. Diese Läufe bestehen die Prüfung aus dem falschen Grund. Zu „rückgabe ist der lieferung an“ kann sie nichts sagen, denn es steht keine Zahl darin. Nur der fünfte Lauf (14) besteht zu Recht. Eine grobe Prüfung senkt das Risiko, ohne es zu beseitigen. Deshalb haben echte Systeme mehrere Prüfungen, und wo ein Fehler teuer ist, schaut ein Mensch hin.
Probier es aus
Finde den Fehler
Ein Kollege vereinfacht die Prüfung. Jetzt gilt die Antwort „rückgabe innerhalb von 4 tagen“ als richtig, obwohl die Richtlinie 14 sagt. Welche Zeile hat den Fehler?
Wähle die Zeile mit dem Fehler.
Die Zahl wird als Stück des Quelltexts gesucht. „4“ ist Teil von „14“, also findet die Prüfung sie. Zahlen müssen ganz verglichen werden: Erst die Zahlen der Quelle herausnehmen, dann die gleiche Zahl unter ihnen suchen.
Probier es aus
Ergänze
Das Modell beendet den Satz, wenn das wahrscheinlichste nächste Wort das Ende ist. Wie sieht das Ende im Trainingstext aus?
def greedy(follows, start):
words = start.split(" ")
while len(words) < 12:
last = words[-1]
word = most_common(follows[last])
if word == :
break
words.append(word)
return " ".join(words)Beim Training bekommt jeder Satz am Ende " .", der Punkt ist also ein eigenes Wort. Wenn das Modell ihn wählt, endet der Satz. Ohne diese Prüfung schreibt das Modell bis zur Grenze von 12 Wörtern.
Die Idee
Wann ein Sprachmodell das falsche Werkzeug ist
- Es gibt eine exakte Antwort, die sich berechnen lässt. Die Bestellsumme, die Mehrwertsteuer, ein Kontostand. Eine Zeile Code irrt sich nicht; das Modell kann sich bei einer Ziffer irren.
- Die Daten sind live. Bestellstatus, Lagerbestand, der heutige Preis. Sie stehen in der Datenbank. Das Modell kann sie über ein Tool abfragen, darf sie aber nicht „aus dem Gedächtnis“ nennen.
- Die Regel ist fest. „Rückgabe innerhalb von 14 Tagen“ ist ein
if, kein Prompt. Was immer gleich sein muss, steht im Code. - Die Entscheidung muss erklärt und später überprüft werden. Eine abgelehnte Zahlung oder ein abgelehnter Kredit braucht einen Grund, der sich wiederholt. Für solche Entscheidungen gibt es Modelle wie die logistische Regression, und die Regeln werden ausdrücklich aufgeschrieben.
- Ein Fehler kostet mehr als Schweigen. Medizinische, rechtliche, finanzielle Antworten an einen Kunden. Dann schreibt das Modell einen Entwurf, und ein Mensch entscheidet.
Wo das Modell stark ist: Entwürfe, Zusammenfassungen, Übersetzung, freien Text sortieren (für welche Abteilung die E-Mail ist), Daten aus Text ziehen, Antworten aus einem Dokument, die geprüft werden. Aufgaben, bei denen eine kleine Ungenauigkeit leicht auffällt und nicht viel kostet.
Genauer, für Neugierige
Warum auch große Modelle halluzinieren. Sie werden mit einem riesigen Text trainiert und danach noch ein wenig, um Anweisungen zu folgen und „Ich weiß es nicht“ zu sagen. Das senkt die Fehler, beseitigt sie aber nicht: Das Modell wählt weiter wahrscheinlichen Text. Besonders gefährlich sind seltene Fakten (die Nummer eines Gesetzesartikels, ein Zitat, der Name einer Funktion in einer kleinen Bibliothek), zu denen der Trainingstext wenige Beispiele hat.
Was hilft, in Schichten. Fakten in der Anfrage (die Richtlinie als Text; das spätere Modul des Kurses über semantische Suche und RAG macht genau das). Ausgabe nach einem Schema und eine Prüfung im Code (strukturierte Ausgabe). Ein Testset von Fragen mit richtigen Antworten, bei jeder Änderung durchgelaufen (Evaluation). Eine Antwort „Ich weiß es nicht, ich übergebe an einen Kollegen“, wenn die Prüfung fehlschlägt. Und ein Mensch, wo ein Fehler teuer ist.
Wie klein das Modell hier ist. Das Bigramm-Modell merkt sich ein Wort zurück und ist mit zehn kurzen Notizen trainiert. Ein großes Modell schaut Tausende Tokens zurück und ist mit Billionen trainiert. Deshalb setzt es einen Satz wie „Rückgabe innerhalb von 2 Tagen“ selten aus zwei Sätzen zusammen. Aber wenn der Kontext keine Antwort enthält, schreibt es trotzdem die wahrscheinlichste Fortsetzung, nicht „Ich weiß es nicht“.
Halluzinationen messen. Der Anteil falscher Antworten hängt von der Aufgabe und den Daten ab. Zahlen aus fremden Tests sagen nichts über deinen Assistenten. Du misst sie selbst, an deinen Fragen, wie in der Lektion über Evaluation.
Übung
Die Antworten zur Lieferung
Löse die Aufgabe in deinem Editor.
Der Assistent antwortet zur Lieferung, und die Quelle lautet: „Die Lieferung nach Berlin dauert bis zu 2 Werktagen. Nach München dauert sie bis zu 3 Werktagen. Ab 50 Euro ist die Lieferung kostenlos.“ Prüfe fünf Antworten mit derselben Regel (jede Zahl in der Antwort muss in der Quelle stehen) und gib für jede das Urteil aus:
- Die Lieferung nach Berlin dauert bis zu 2 Tagen.
- Die Lieferung nach München dauert bis zu 4 Tagen.
- Ab 30 Euro ist die Lieferung kostenlos.
- Die Lieferung nach Hamburg dauert bis zu 1 Tag.
- Die Lieferung ist für alle Bestellungen kostenlos.
Die Lieferung nach Berlin dauert bis zu 2 Tagen. → ✓ die Zahlen stehen in der QuelleDie Lieferung nach München dauert bis zu 4 Tagen. → ✗ 4 steht nicht in der QuelleAb 30 Euro ist die Lieferung kostenlos. → ✗ 30 steht nicht in der QuelleDie Lieferung nach Hamburg dauert bis zu 1 Tag. → ✗ 1 steht nicht in der QuelleDie Lieferung ist für alle Bestellungen kostenlos. → ? keine Zahl zum PrüfenDie letzte Antwort ist falsch, und die Prüfung kann sie nicht fangen: Es steht keine Zahl darin.
Weitere Aufgaben
- Die Zahl an ihrem Platz. Prüfe nicht nur, dass die Zahl da ist, sondern auch das Wort davor: „bis zu 2“ für Berlin. Welche Antworten fängt das jetzt?
- Ablehnung. Wenn die Prüfung fehlschlägt, gibt das Programm „Ich verbinde Sie mit einem Kollegen.“ zurück statt der Antwort des Modells.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: List Comprehensions und Generatoren · Text in Stücken: Tokens · Das nächste Token vorhersagen · Das Kontextfenster
- Geht weiter in: Ein Modell über eine API aufrufen · Der Prompt ist Code · Strukturierte Ausgabe: JSON nach einem Schema · Tool Use: das Modell fragt, das Programm handelt
- Aufgaben zum Thema: Wie ein Sprachmodell funktioniert