Divinationsengines ohne Halluzination: deterministische Rust-Zustandsautomaten treffen auf LLM-Verankerung

Published · AI Daily — AI-assisted deep research, methodology & disclosure

Ein Sprachmodell, das Horoskope selbst berechnet, irrt bei wandelnden Linien und Sternpositionen, weil Token-Sampling diskrete Invarianten nicht wahrt. Diese Fallstudie liest InsightApps Architektur: Ein reiner Rust-Kern erzeugt einen JSON-Faktengraphen, das Modell schreibt nur den Text. Drei Lücken bleiben offen.

Offenlegung: InsightApp und sns.style werden vom selben Betreiber geführt. Alle Codezitate stammen aus dem InsightApp-Backend bei Commit `22cccf4`, jeweils mit Dateipfad zur Nachverfolgung; das Repository ist nicht öffentlich. Dies ist eine Fallstudie, keine unabhängige Bewertung. Die vollständige Fassung ist die chinesische Ausgabe; dies ist die deutsche Zusammenfassung.

Bittet man ein großes Sprachmodell, ein I-Ging-Hexagramm zu werfen oder ein Zi-Wei-Dou-Shu-Horoskop zu erstellen und es dann zu deuten, liest sich das Ergebnis meist gut, hält aber einer Prüfung nicht stand. Eine wandelnde Linie ist falsch, ein Hauptstern steht in zwei Palästen, oder die „Ji“-Transformation fällt auf einen Stern, der gar nicht im Horoskop steht. Das liegt nicht an mangelnder Intelligenz des Modells, sondern an der Form der Aufgabe. Die Berechnung ist diskrete Kombinatorik, die Deutung ist Sprache.

Die I-Ging- und Zi-Wei-Engine von InsightApp trennt beides. Ein deterministischer Rust-Kern berechnet das Horoskop und gibt einen strukturierten JSON-Faktengraphen aus; das Modell übersetzt diesen Graphen nur noch in Sprache. Das „null Halluzination“ im Titel gilt für die Horoskopschicht, nicht für die Textschicht.

Der Kern

Der Lebenspalast ergibt sich aus `mod12(lunar_month + 1 - hour)`, der Körperpalast aus `(lunar_month + 1 + hour) % 12`, und das Elementbüro aus einer 5×6-Tabelle `NA_YIN_JU` (`backend/src/ziwei/calc.rs`). Die 14 Hauptsterne müssen in den 12 Palästen genau einmal vorkommen. Ein Token-Sampler garantiert solche Invarianten nicht. Eine Fehlerquote für reine Sprachmodell-Berechnung haben wir nicht gemessen; das ist ein strukturelles Argument, kein Messergebnis.

Beim I Ging steckt der Zufall nur im Wurf der drei Münzen (`backend/src/agent/hexagram.rs`). Jede Münze zählt mit Wahrscheinlichkeit 1/2 als 2 oder 3; die Summe ist 6, 7, 8 oder 9 mit den Wahrscheinlichkeiten 1/8, 3/8, 3/8 und 1/8. Jede Linie wandelt sich mit Wahrscheinlichkeit 1/4, und in rund 17,8 % der Würfe gibt es keine wandelnde Linie. Schlägt die Suche nach einem Hexagramm fehl, liefert die Engine einen `EngineError` statt eines plausiblen Standardwerts. Siehe die Suche nach den 64 Hexagrammen und den vollständigen Leitfaden zu den 64 Hexagrammen.

Die Funktion `full_chart` (`backend/src/ziwei/chart.rs`) ist rein: keine Ein- und Ausgabe, kein Zufall. Die abgeleiteten Felder `patterns` und `feixing` stammen ausschließlich vom Server. Laut einem Codekommentar kam die Schaltmonat-Regel nach einem Abgleich mit der freien Bibliothek iztro über 505 Zufallsstichproben hinzu, danach ohne Abweichung. Die „Ji“-Kette (`backend/src/ziwei/feixing.rs`) ist eine begrenzte Graphsuche mit Tiefe 4, die Zyklen mit `is_loop` markiert. Siehe die Seite zu den fliegenden Sternen.

Die Grenzen

Die Deutungs-Endpunkte übernehmen das vom Client gesendete Horoskop und berechnen es serverseitig nicht neu. Der Jahresstamm nutzt die Näherung `(year - 4) mod 10`, die laut Code um Lichun herum ein bis zwei Tage danebenliegt. Nach der Generierung prüft nichts den Text gegen das Horoskop. Die Korrektur auf wahre Sonnenzeit erfolgt im Frontend, nicht in Rust.

Aus den Tabellen `STARS_14` und `PALACES_12` entstehen 168 Seiten „Stern im Palast“, etwa Zi Wei im Lebenspalast. Weitere Artikel stehen im InsightApp-Blog.

Sources

FAQ

Warum berechnet das Sprachmodell das Horoskop nicht selbst?

Die Berechnung ist eine Kette aus Modulo-Arithmetik und Tabellenabfragen mit Invarianten, etwa dass jeder der 14 Hauptsterne genau einmal vorkommt. Token-Sampling garantiert das nicht. Eine Fehlerquote wurde nicht gemessen; es ist ein strukturelles Argument.

Was bedeutet „null Halluzination“ hier?

Nur die Horoskopschicht: Der Rust-Kern ist rein und lässt sich mit iztro abgleichen. Der Text des Modells kann weiterhin falsch sein, und nach der Generierung prüft ihn nichts.

Welche Lücken bleiben?

Die Deutungs-Endpunkte vertrauen dem vom Client gesendeten Horoskop, der Jahresstamm ist um Lichun herum genähert, und es gibt keinen Validator nach der Generierung. Die wahre Sonnenzeit wird im Frontend korrigiert.