Zum Inhalt
wannacode

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 folgten
static Dictionary<string, List<string>> Train(string[] corpus)
{
var follows = new Dictionary<string, List<string>>();
foreach (var sentence in corpus)
{
var words = (sentence + " .").Split(' ');
for (var i = 0; i + 1 < words.Length; i++)
{
if (!follows.TryGetValue(words[i], out var list)) follows[words[i]] = list = [];
list.Add(words[i + 1]);
}
}
return follows;
}

Der Text besteht aus zehn kurzen Notizen aus dem Support des Shops:

string[] 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)
static string MostCommon(List<string> options) =>
options.MaxBy(o => options.Count(x => x == o));
static string Greedy(
Dictionary<string, List<string>> follows, string start)
{
var words = start.Split(' ').ToList();
while (words.Count < 12)
{
var last = words[^1];
var word = MostCommon(follows[last]);
if (word == ".") break;
words.Add(word);
}
return string.Join(" ", words);
}

Und nach Wahrscheinlichkeit gezogen, mit einem Zufallsgenerator mit festem Seed, damit die Ausgabe bei jedem Lauf gleich ist:

static string Sample(Dictionary<string, List<string>> follows, string start, Rng rng)
{
var words = start.Split(' ').ToList();
while (words.Count < 12)
{
var options = follows[words[^1]];
var word = options[(int)(rng.Next() * options.Count)];
if (word == ".") break;
words.Add(word);
}
return string.Join(" ", words);
}
var follows = Train(corpus);
Console.WriteLine("das wahrscheinlichste Wort jedes Mal:");
Console.WriteLine(" " + Greedy(follows, "rückgabe"));
Console.WriteLine("sechs Läufe, das Wort wird nach Wahrscheinlichkeit gezogen:");
var rng = new Rng(3876);
for (var i = 1; i <= 6; i++)
{
var answer = Sample(follows, "rückgabe", rng);
var mark = corpus.Contains(answer) ? "steht im Text" : "steht nicht im Text";
Console.WriteLine($" {i}. {answer} ({mark})");
}
Ausgabe
das wahrscheinlichste Wort jedes Mal:
rückgabe innerhalb von 2 tagen
sechs 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)
static string MostCommon(List<string> options) =>
options.MaxBy(o => options.Count(x => x == o));
static string Greedy(
Dictionary<string, List<string>> follows, string start)
{
var words = start.Split(' ').ToList();
while (words.Count < 12)
{
var last = words[^1];
var word = MostCommon(follows[last]);
if (word == ".") break;
words.Add(word);
}
return string.Join(" ", words);
}
Schritt für Schritt, in Worten
  1. Das Modell setzt „rückgabe“ jedes Mal mit dem häufigsten nächsten Wort fort.
  2. „innerhalb von“ steht in 6 Sätzen, einer davon über die Rückgabe. Bis hierhin stimmt es.
  3. Nach „von“ kommt am häufigsten „2“: aus den zwei Sätzen über die Lieferung.
  4. Dann der Punkt. Ein glatter Satz, der nicht im Text steht: „rückgabe innerhalb von 2 tagen“.
  5. Die Prüfung nimmt die Zahlen aus der Antwort und aus den Rückgaberegeln.
  6. 2 steht nicht in den Regeln. Dort stehen 14 Tage.
  7. 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?

string[] corpus =
[
"lieferung nach berlin dauert 2 tage",
"lieferung nach hamburg dauert 3 tage",
"umtausch dauert 3 tage",
];
Console.WriteLine(Greedy(Train(corpus), "lieferung"));
Antwort

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 stehen
static string Check(string answer, string source)
{
var known = Numbers(source);
var claimed = Numbers(answer);
if (claimed.Count == 0)
{
return "? keine Zahl zum Prüfen";
}
foreach (var n in claimed)
{
if (!known.Contains(n))
{
return $"✗ {n} steht nicht in der Quelle";
}
}
return "✓ die Zahlen stehen in der Quelle";
}
static List<string> Numbers(string text) =>
text.Split(' ')
.Select(w => w.Trim('.', ','))
.Where(w => w.Length > 0 && w.All(char.IsDigit))
.ToList();

Die sechs Antworten aus dem Programm oben gegen die Rückgaberichtlinie:

var source = "Rückgabe innerhalb von 14 Tagen. Erstattung innerhalb von 5 Werktagen.";
string[] 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",
];
foreach (var a in answers)
{
Console.WriteLine($"{a} → {Check(a, source)}");
}
Ausgabe
rückgabe innerhalb von 5 werktagen → ✓ die Zahlen stehen in der Quelle
rückgabe innerhalb von 2 tagen → ✗ 2 steht nicht in der Quelle
rückgabe innerhalb von 2 tagen zurück → ✗ 2 steht nicht in der Quelle
rückgabe ist der lieferung an → ? keine Zahl zum Prüfen
rückgabe innerhalb von 14 tagen → ✓ die Zahlen stehen in der Quelle
rückgabe innerhalb von 5 werktagen → ✓ die Zahlen stehen in der Quelle

Die 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.

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?

static string Greedy(
    Dictionary<string, List<string>> follows, string start)
{
    var words = start.Split(' ').ToList();
    while (words.Count < 12)
    {
        var last = words[^1];
        var word = MostCommon(follows[last]);
        if (word == ) break;
        words.Add(word);
    }
    return string.Join(" ", words);
}

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.
Ausgabe
Die Lieferung nach Berlin dauert bis zu 2 Tagen. → ✓ die Zahlen stehen in der Quelle
Die Lieferung nach München dauert bis zu 4 Tagen. → ✗ 4 steht nicht in der Quelle
Ab 30 Euro ist die Lieferung kostenlos. → ✗ 30 steht nicht in der Quelle
Die Lieferung nach Hamburg dauert bis zu 1 Tag. → ✗ 1 steht nicht in der Quelle
Die Lieferung ist für alle Bestellungen kostenlos. → ? keine Zahl zum Prüfen

Die 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

1. Was ist eine Halluzination eines Sprachmodells?
2. Du stellst die Temperatur auf 0, und der Assistent gibt jedes Mal dieselbe Antwort. Heißt das, dass die Antwort stimmt?
3. Die Rückgaberichtlinie hat sich gestern geändert. Warum nennt das Modell noch die alte?
4. Die Prüfung „stehen die Zahlen der Antwort in der Quelle“ ließ „rückgabe innerhalb von 5 werktagen“ durch. Warum?
5. Für welche Aufgabe ist ein Sprachmodell das falsche Werkzeug?

Erstellt von Ivo Gergov im Rahmen der Kampagne von Evo Tech für zugängliche Programmierausbildung ·