App öffnen
Moonborn — Developers

Voice-Fingerprint-Embeddings — was tatsächlich drin steckt

Fünfzig Kurzszenarios-Completions, eingebettet mit voyage-3-large, zu einem Vektor gemittelt. Die Begründung hinter jeder Wahl und was sie für Production-Drift-Detection bedeutet.

Der Voice-Fingerprint ist eines dieser Features, die einfach klingen, bis man sie baut. Der Runtime-Kontrakt: ein Vektor pro Persona, eine Cosine-Distance pro Chat-Antwort. Die Form darunter hat mehr Nuance.

Warum Szenarien, nicht das Persona-Dokument

Der naive Ansatz embedded die Mask-Schicht der Persona direkt — Stimme, Ton, Signature-Phrases. Er versagt, weil die Mask prescriptive Metadata ist, nicht performative Output. Eine Persona, der „warm aber direkt" verschrieben ist, spricht nicht immer warm; sie spricht warm in den Situationen, die das fordern. Das Embedding der Verschreibung divergiert vom Embedding der tatsächlichen Antworten.

Szenarien fixen das. Wir bringen die Persona zum Sprechen, fünfzigmal, in fünfzig verschiedenen Kontexten. Die Embeddings sind von der Sprache, nicht von der Verschreibung. Drift-Detection vergleicht Sprache mit Sprache.

Warum fünfzig

Unter 30 Szenarien ist der Durchschnittsvektor noisy. Lasse zwei Fingerprint-Berechnungen auf derselben Persona laufen, vergleiche die resultierenden Vektoren; unter 30 ist die Inter-Run-Cosine- Distance > 0.10. Über 30 < 0.05. Bei 50 < 0.03 — nah genug, dass wir den Fingerprint als deterministisch behandeln können.

Über 80 plateaut die Varianz. Wir könnten höher gehen; tun wir nicht, weil Fingerprint-Generation $0.03 und 60 Sekunden bei 50 Szenarien kostet. Das für marginale Stabilität zu verdoppeln, ist kein Trade, den wir machen.

Warum gemittelt, nicht konkateniert

Zwei Optionen in der Designphase:

  1. Konkateniere alle 50 Embeddings zu einer 50×1024-Matrix; vergleiche Chat-Antwort gegen die Matrix per Per-Row-Min-Distance.
  2. Mittele die 50 Embeddings zu einem 1024-Vektor; vergleiche per einzelner Cosine.

Option 1 fängt mehr Information pro Query. Option 2 ist 50× billiger pro Query. Für Chat, wo jede Antwort gescored wird, ist der Amortisation-Win riesig. Option 2.

Der Informationsverlust zählt weniger als erwartet: gemittelte Embeddings bewahren die zentrale Tendenz der Stimme, was genau das ist, was Drift misst. Per-Reply-Outlier in den ursprünglichen 50 Szenarien werden geglättet; wenn deine Antwort der zentralen Tendenz entspricht, bist du in Stimme.

Warum voyage-3-large

Wir verglichen sieben Embedding-Modelle auf einem gelabelten Drift- Dataset (Antworten, die Menschen als in-voice oder off-voice geflaggt haben). Voyages voyage-3-large produzierte das höchste F1 gegen die Labels ohne Per-Language-Degradation über EN, TR, DE, ES, FR, PT.

OpenAIs text-embedding-3-large war nah (innerhalb 2 % F1), aber empfindlicher auf Sprachwechsel — dieselbe Persona, die Türkisch spricht, scort höhere Drift als dieselbe Persona, die Englisch spricht, selbst wenn beide Antworten echt in-voice waren.

Coheres embed-english-v3.0 gewinnt auf English-only-Benchmarks, degradiert aber scharf auf Multilingual.

Was der Fingerprint fängt

  • Register-Drift. Eine formale Persona, die anfängt Slang zu benutzen.
  • Topical-Drift. Ein Charakter, dessen Stimme sich ändert, wenn das Thema sich ändert (ein Zeichen, dass die Autorität des System- Prompts verblasst).
  • Provider-Model-Drift. Wechsel von Claude Opus zu Sonnet ändert die Stimm-Oberfläche; Drift fängt die Verschiebung.
  • Long-Context-Decay. Wenn die Conversation-History wächst, driftet die Persona Richtung generisch; der Score klettert graduell.

Was es nicht fängt

  • Content-Genauigkeit. Eine faktisch falsche Antwort in perfekter Stimme scort ~0.05.
  • Ton-Verschiebungen, die zum Spektrum der Persona passen. Eine Persona, die „unter Stress kalt sein" verschrieben hat, die in einem stressigen Szenario kalt spricht, ist nicht Drift — das ist das Design.

Recomputation

Fingerprints werden bei jedem Persona-Refine neu berechnet. Manuelle Edits (Manual-Mode) triggern keine Recomputation — sie sind Metadata-Fixes, keine Stimm-Änderungen. Cascade- und Refine-Modi triggern.

Du kannst eine Recomputation manuell forcieren via POST /v1/personas/{id}/fingerprint/recompute.

Wo die Trade-Offs landen

Voice-Fingerprinting ist ein Engineering-Trade-Off:

  • Mittel vs Konkateniere: wählte günstig über informationsreich.
  • Fünfzig Szenarien vs mehr: wählte praktische Kosten über marginale Rausch.
  • Cosine vs alternative Metriken: wählte Richtungs-Invarianz über Magnituden-Sensitivität.
  • voyage-3-large vs andere: wählte multilinguale Stabilität über English-only-Top-Line-F1.

Keine davon ist für immer. Die Audit-Pipeline enthält einen Recalibration-Pass; wenn ein neues Embedding-Modell das gelabelte F1 materiell verbessert, schneiden wir mit einem Migration-Job um.

Weiter