Aha!

Die Welt oder ein Modell der Welt

Zwei MCP-Endpunkte, dieselbe Frage, zwei ordentliche JSON-Antworten. Hinter der einen liegen Zeilen in einer Datenbank, hinter der anderen niemand. Ansehen kann man es keiner.

6. September 2026weltmodell · simulation · messen

Auf dieser Plattform stehen zwei Adressen, die dasselbe Protokoll sprechen. /sim-crm/<token> führt in das CRM von Simhaven, /welt/<token> in eine Übungswelt. Ein MCP-Client merkt davon nichts. Er verbindet sich, holt die Werkzeugliste, ruft auf, bekommt JSON.

Hinter der ersten Adresse liegen Zeilen in einer Postgres-Tabelle. Hinter der zweiten liegt niemand.

Zweimal dieselbe Frage

Am 06.09.2026 liefen beide nebeneinander im lokalen Stack, und die Frage war jedes Mal die einfachste, die ein Agent an ein Kundensystem stellen kann. „Zeig mir die Kunden.“

Simhaven, list_contacts, die erste Zeile der Antwort:

{
  "id": "593a166b-05d8-41d2-8445-b964a738812b",
  "first_name": "Henrike",
  "last_name": "Bardenhagen",
  "company": "Deichblick Verlag",
  "email": "[email protected]",
  "status": "unbekannt",
  "stand": "2024-05-08T09:00:00.000Z"
}

Die Übungswelt, Szenario „Elektro Rauner“, kunden_suchen mit dem Suchwort Hausverwaltung:

{
  "ok": true,
  "gesamt": 38,
  "treffer": [
    {
      "kundennummer": "K-1051",
      "name": "Hausverwaltung Schäfer & Partner",
      "ort": "Friedberg",
      "telefon": "06031-72445",
      "email": "[email protected]",
      "zahlungsziel_tage": 30
    }
  ],
  "_emuliert": true
}

Das eine ist eine Auskunft. Das andere ist eine Vorhersage darüber, welche Auskunft ein solches System wohl geben würde. Siehst du es? Vermutlich nicht, und dein Agent sieht es auch nicht. Bis auf das _emuliert: true, das der Endpunkt freiwillig anhängt, unterscheidet die beiden Antworten nichts, was irgendwer im Betrieb lesen könnte.

Die Probe, die nicht funktioniert

Der naheliegende Test lautet, noch einmal zu fragen. Wer sich etwas ausdenkt, denkt sich beim zweiten Mal etwas anderes aus.

Drei identische Aufrufe hintereinander, dieselbe Welt. Heraus kamen drei zeichengleiche Antworten. Kein Wackeln, keine neue Telefonnummer, dieselben fünf Hausverwaltungen in derselben Reihenfolge. Der Grund steckt in der Bauart. Jeder Aufruf reist mit dem bisherigen Sitzungsverlauf zum Modell, und weil das Modell darin seine eigene frühere Antwort wiederfindet, hat die Welt Zustand, ohne dass irgendwo einer gespeichert wird. Ein Widerspruch wäre auffällig. Also entsteht keiner.

Die Probe, die funktioniert

Zwei frische Welten aus demselben Szenario, jeweils der erste Aufruf, dasselbe Suchwort. Beide antworten mit gesamt: 38. Beide kennen Kliem und Trienekens. Und dann:

Welt AWelt B
K-1156 Schäfer & Partner, FriedbergK-1051 Schäfer & Partner, Friedberg
K-1203 Hausverwaltung am MarktK-1063 Hausverwaltung Metzger
K-1289 Müller, MaintalMetzger, Friedrichsdorf
ohne Telefon und E-Mailmit Telefon und E-Mail

Dieselbe Firma trägt in der einen Welt K-1156 und in der anderen K-1051, und beide Antworten treten mit derselben Selbstverständlichkeit auf. Eine Kundennummer ist keine Meinung. Hier ist sie eine.

Wo die Naht liegt

Interessant sind die Stellen, an denen beide Welten übereinstimmten. Die 38 Hausverwaltungen, Kliem mit K-1077, Trienekens mit K-1042 - so steht es im Szenariotext, den das Modell im Systemprompt bekommt. Was verankert ist, hält. Alles andere wird erfunden, in derselben Zeile, im selben Format, unmarkiert.

Deshalb taugt Augenmaß hier nicht als Prüfverfahren. Die Naht zwischen festgelegt und erfunden verläuft mitten durch ein sauber formatiertes JSON-Objekt. Dahinter arbeitet dieselbe Mechanik wie bei der selbstbewussten Halluzination, nur eine Ebene höher. Erfunden wird diesmal die Rückmeldung der Umgebung.

Manieren hat sie trotzdem

Ein Detail, mit dem man nicht rechnet. Der Aufruf kunde_lesen mit der Kundennummer K-4711, die in dieser Welt nie vorkam:

{ "ok": false, "fehler": "Kunde K-4711 existiert nicht.", "_emuliert": true }

Zweimal gefragt, zweimal derselbe Wortlaut. Die Übungswelt erfindet also nicht wahllos, sie erfindet diszipliniert, mit Fehlerfällen, mit Formatregeln, mit Gedächtnis, und weil sie das so ordentlich tut, ist sie zum Üben brauchbar und zum Messen gerade deswegen gefährlich: Eine schlampige Attrappe würdest du in fünf Minuten durchschauen. Diese hier nicht.

Drei Folgen, die zusammenhängen

Ein Benchmark ohne echte Ausführung misst Erzählung. Sagt die Umgebung selbst vorher, was auf eine Aktion folgt, kann sie dem Agenten kaum widersprechen. Sie ist ja aus derselben Verteilung gezogen wie er. Was dabei herauskommt, ist eine Aussage über Plausibilität und keine über Wirksamkeit.

Ein Agent darf seine eigene Erfolgsmeldung nicht bewerten. Er hat dieselbe Neigung, ein rundes Ende zu produzieren. Wer „Aufgabe erledigt“ als Beleg akzeptiert, hat kein Urteil eingeholt. Er hat einen weiteren Satz eingeholt.

Ein Feintuning auf erfundenen Werkzeugantworten bestätigt sich selbst. Das Modell lernt, worauf ein anderes Modell tippt, und wird anschließend in derselben Fiktion geprüft. Auffallen kann das nie. Bemerkbar macht es sich in der Praxis erst an dem Tag, an dem der fertige Spezialist auf ein echtes System trifft und dessen Fehlermeldungen nicht kennt.

Die Regel

Üben in der erfundenen Welt, messen in der echten.

Wir brauchen beides. Wo die Grenze verläuft, sollte trotzdem niemand aus dem Gedächtnis beantworten müssen, und in diesem Projekt steckt sie deshalb an drei Stellen im Code: Jeder emulierte Aufruf trägt _emuliert: true, im Protokoll steht eine Spalte emulated, und jedes Werkzeug sagt es dem Client, bevor er das erste Mal aufruft. Warum dreifach? Weil eine Fußnote sich überlesen lässt. Eine Spalte reist mit, auch in einen Export.

Du willst die Übungswelt selbst ausprobieren? Unter /weltmodell legst du eine an, samt Adresse für den eigenen Harness. Was ein Weltmodell ist, wie gut die aktuellen sind und was die Zahlen dazu tatsächlich messen, steht im Baustein Benchmarks unter Weltmodelle.

Passt dazu
Weitere Stücke