PGVector für Stimme: hochdimensionale Embeddings im Detail
November 5, 2024
•min read
Engineering
Vom IdentityCall AI Team | Engineering | 10 Min. Lesezeit
Vom Audio zur Mathematik
Wie sucht man in einer Datenbank nach einer „Stimme“? Man kann nicht WHERE voice = 'John' abfragen.
Sie brauchen Vektor-Embeddings.
Dieser Artikel erklärt, wie IdentityCall PostgreSQL + pgvector nutzt, um blitzschnelle biometrische Identifikation über Millionen von Stimmabdrücken durchzuführen.
Die Vektorisierungs-Pipeline
- Spektrogramm-Erzeugung: Das Rohaudio (WAV) wird in ein Mel-Frequenz-Cepstrum (Spektrogramm) umgewandelt.
- Encoder-Netz (ResNet/interaction): Ein tiefes neuronales Netz verarbeitet das bildähnliche Spektrogramm.
- Embedding-Extraktion: Die vorletzte Schicht des Netzes gibt ein Array von Zahlen fester Größe (float32) aus.
- Dimension: 256 für Voice ID (kompakt, identitätsfokussiert).
- Dimension: 768 für semantische Suche (reichhaltiger, bedeutungsfokussiert).
Beispiel-Embedding: [-0.024, 0.551, -0.112, ...]
Warum PGVector?
Traditionell wurden Vektoren in spezialisierten Datenbanken (Pinecone, Milvus) gespeichert.
pgvector erlaubt es uns, Embeddings zusammen mit relationalen Daten (User-ID, Anrufprotokolle) in unserer primären Postgres-Datenbank zu speichern.
Die Distanz der „Kosinus-Ähnlichkeit“
Um eine Übereinstimmung zu finden, suchen wir nicht nach einer exakten Übereinstimmung (Audio ist nie identisch). Wir suchen den „nächsten Nachbarn“ im 256-dimensionalen Raum.
Wir verwenden die Kosinus-Distanz (die den Winkel zwischen zwei Vektoren bestimmt).
- Distanz 0.0: identisch.
- Distanz < 0.2: Übereinstimmung mit hoher Konfidenz (derselbe Sprecher).
- Distanz > 0.4: anderer Sprecher.
Indexierung für Geschwindigkeit (IVFFlat vs. HNSW)
Eine Million Vektoren linear zu scannen ist zu langsam (Latenz!). Wir verwenden Indexierung.
- HNSW (Hierarchical Navigable Small World): der Goldstandard. Es baut einen Graphen auf, mit dem die Suche in Millisekunden auf die relevante Nachbarschaft der Vektoren „heranzoomen“ kann.
-- Example PGVector Query
SELECT id, speaker_name, 1 - (embedding <=> '[...]'::vector) AS confidence
FROM voice_profiles
ORDER BY embedding <=> '[...]'::vector
LIMIT 1;
Der Architekturvorteil
Indem wir die Vektoren in Postgres halten, wahren wir ACID-Konformität und referenzielle Integrität. Wir können einen Nutzer löschen und seine Stimmvektoren sofort per Kaskade mitlöschen – ein großer Gewinn für die DSGVO (Recht auf Vergessenwerden).
Speichern Sie die Stimme. Fragen Sie die Mathematik ab. Bauen Sie mit der IdentityCall API.
Tags:
