PGVector voor stem: verdieping in hoogdimensionale embeddings
November 5, 2024
•min read
Engineering
Door het IdentityCall AI-team | Engineering | 10 min leestijd
Van audio naar wiskunde
Hoe zoek je een “stem” in een database? Je kunt niet WHERE voice = 'John' opvragen.
Je hebt vector-embeddings nodig.
Dit artikel legt uit hoe IdentityCall PostgreSQL + pgvector gebruikt om razendsnelle biometrische identificatie uit te voeren op miljoenen stemafdrukken.
De vectorisatiepijplijn
- Spectrogramgeneratie: de ruwe audio (WAV) wordt omgezet in een Mel-frequentiecepstrum (spectrogram).
- Encodernetwerk (ResNet/interaction): een diep neuraal netwerk verwerkt het beeldachtige spectrogram.
- Embedding-extractie: de voorlaatste laag van het netwerk levert een array van getallen met vaste grootte (float32).
- Dimensie: 256 voor Voice ID (compact, gericht op identiteit).
- Dimensie: 768 voor semantisch zoeken (rijker, gericht op betekenis).
Voorbeeld-embedding: [-0.024, 0.551, -0.112, ...]
Waarom PGVector?
Traditioneel werden vectoren opgeslagen in gespecialiseerde databases (Pinecone, Milvus).
pgvector stelt ons in staat embeddings naast relationele data (gebruikers-ID, gesprekslogs) op te slaan in onze primaire Postgres-database.
De afstand op basis van “cosinusgelijkenis”
Om een match te vinden zoeken we niet naar een exacte match (audio is nooit identiek). We zoeken de “dichtstbijzijnde buur” in de 256-dimensionale ruimte.
We gebruiken cosinusafstand (die de hoek tussen twee vectoren bepaalt).
- Afstand 0.0: identiek.
- Afstand < 0.2: match met hoge betrouwbaarheid (dezelfde spreker).
- Afstand > 0.4: andere spreker.
Indexeren voor snelheid (IVFFlat vs HNSW)
1 miljoen vectoren lineair scannen is te traag (latentie!). We gebruiken indexering.
- HNSW (Hierarchical Navigable Small World): de gouden standaard. Het bouwt een graaf waarmee de zoekopdracht in milliseconden kan “inzoomen” op de relevante buurt van vectoren.
-- Example PGVector Query
SELECT id, speaker_name, 1 - (embedding <=> '[...]'::vector) AS confidence
FROM voice_profiles
ORDER BY embedding <=> '[...]'::vector
LIMIT 1;
Het architectuurvoordeel
Door de vectoren in Postgres te houden behouden we ACID-compliance en referentiële integriteit. We kunnen een gebruiker verwijderen en zijn stemvectoren onmiddellijk in cascade mee verwijderen—een grote winst voor de AVG (recht op vergetelheid).
Sla de stem op. Bevraag de wiskunde. Bouw met de IdentityCall-API.
Tags:
