Wie Drift-Detection funktioniert
Jede Chat-Antwort wird gegen den Voice-Fingerprint der Persona gescored. Unter der Schwelle versendet; darüber alertet sie. Hier ist, was im Score steckt.
Die kürzeste Zusammenfassung von Voice-Drift: Cosine-Distance, Voice-Fingerprint, Schwelle. Die längere Geschichte ist interessanter — was im Fingerprint steckt, warum Cosine, warum die Schwelle bei Default 0.30 landet, was Recovery tatsächlich tut.
Der Fingerprint
Zur Generation-Zeit fährt Moonborn fünfzig kurze Szenarien gegen die
Persona — „reagiere auf Überraschung," „erkläre deine Wunde einem
Fremden," „lehne einen Wunsch ab, mit dem du nicht einverstanden
bist." Jedes Szenario produziert eine kurze Antwort; jede Antwort
wird mit voyage-3-large embedded. Die fünfzig Embeddings werden zu
einem einzelnen Vektor gemittelt. Das ist der Voice-Fingerprint.
Warum fünfzig? Unter dreißig dominiert der Durchschnittsrauschen das Signal. Über achtzig hört marginale Information auf zu akkumulieren. Fünfzig ist der Sweet Spot aus internen Kalibrierungsläufen.
Warum Mittelung statt Konkatenation? Ein einzelner hochdimensionaler Durchschnittsvektor hält den Per-Antwort-Vergleich schnell — eine Cosine-Distance pro Chat-Turn statt fünfzig.
Der Score
Wenn eine Chat-Antwort landet, embedden wir sie mit demselben Modell. Cosine-Distance gegen den Fingerprint:
drift = 1 - dot(reply, fp) / (||reply|| * ||fp||)
Bereich [0, 1]. Null würde „identisch zum Durchschnitt" heißen;
eins „orthogonal." Echte Antworten clustern um 0.1–0.4.
Warum Cosine
Euklidische Distance ist magnitudenempfindlich — eine doppelt so lange Antwort heißt nicht, sie ist doppelt so off-voice. Cosine misst Winkel, was „Richtung im semantischen Raum" ohne die Magnituden- Kontamination erfasst. Der Voice-Fingerprint-Paper-Trail (Bommasani et al. 2023, andere) nutzt konsistent Cosine aus demselben Grund.
Die Schwelle
Default 0.30. Wir landeten hier aus manuellem Labeling: 50 Rater
scoring 500 Antworten als „in voice" oder „off voice"; Cosine 0.30
maximierte das F1 gegen die Labels. Engere Schwellen (0.20) fangen
mehr legitime Drift, flaggen aber zu viele saubere Antworten;
lockerere (0.40) verpasst Drift, die Menschen klar nennen.
Du kannst — und solltest — pro Audience tunen:
- Customer-Support, regulierte Stimme: 0.20.
- General-Product-Chat: 0.30 (Default).
- Creative-Play: 0.45.
Per-Persona-Overrides via Runtime-Contract.
Aktionen
engine.pipeline.drift_detection.action_on_alert:
warn(Default) — Antwort wird versendet, Alert wird geloggt, Webhook feuert.auto_recover— Moonborn regeneriert einmal mit re-injiziertem Fingerprint; versendet die mit dem niedrigeren Score.block— Antwort nicht zurückgegeben; Client bekommt 409.
auto_recover ist der interessanteste. Es kostet einen extra LLM-
Call pro Alert (vielleicht 5 % der Antworten in Produktion), aber
die recoverede Antwort scort etwa 80 % der Zeit unter Schwelle. Für
Support-Oberflächen ist das ein lohnenswertes Budget.
Was es nicht ist
Drift-Detection misst Stimme. Es misst nicht:
- Faktische Genauigkeit. Eine falsche Antwort in perfekter Stimme scort weiterhin niedrig.
- Hilfreichheit. Eine blasse, in-voice-Non-Answer scort niedrig.
- Sicherheit. Hate-Speech in perfekter Persona-Stimme scort niedrig.
Dafür brauchst du andere Signale: Ground-Truth-Verifikation, Qualitäts-Rubriken, die Moderations-Pipeline. Drift ist ein Input unter mehreren — kalibriere entsprechend.