PGVector balsui: išsamus žvilgsnis į didelės dimensijos embeddingus
November 5, 2024
•min read
Engineering
Parengė „IdentityCall” DI komanda | Inžinerija | 10 min skaitymo
Nuo garso prie matematikos
Kaip ieškoti „balso” duomenų bazėje? Negalite užklausti WHERE voice = 'John'.
Jums reikia vektorinių embeddingų.
Šis straipsnis paaiškina, kaip „IdentityCall” naudoja PostgreSQL + pgvector, kad žaibiškai greitai atliktų biometrinį identifikavimą tarp milijonų balso atspaudų.
Vektorizavimo procesas
- Spektrogramos generavimas: neapdorotas garsas (WAV) paverčiamas Mel dažnio kepstru (spektrograma).
- Koduotojo tinklas (ResNet/interaction): gilusis neuroninis tinklas apdoroja į paveikslą panašią spektrogramą.
- Embeddingo išgavimas: priešpaskutinis tinklo sluoksnis pateikia fiksuoto dydžio skaičių masyvą (float32).
- Dimensija: 256 balso ID (kompaktiška, orientuota į tapatybę).
- Dimensija: 768 semantinei paieškai (turtingesnė, orientuota į prasmę).
Embeddingo pavyzdys: [-0.024, 0.551, -0.112, ...]
Kodėl PGVector?
Tradiciškai vektoriai buvo saugomi specializuotose duomenų bazėse (Pinecone, Milvus).
pgvector leidžia mums saugoti embeddingus šalia reliacinių duomenų (naudotojo ID, skambučių žurnalai) mūsų pagrindinėje Postgres duomenų bazėje.
„Kosinuso panašumo” atstumas
Kad rastume atitikmenį, mes ieškome ne tikslaus atitikmens (garsas niekada nėra identiškas). Ieškome „artimiausio kaimyno” 256 dimensijų erdvėje.
Naudojame kosinuso atstumą (nustatantį kampą tarp dviejų vektorių).
- Atstumas 0.0: identiški.
- Atstumas < 0.2: aukšto pasitikėjimo atitikmuo (tas pats kalbėtojas).
- Atstumas > 0.4: kitas kalbėtojas.
Indeksavimas greičiui (IVFFlat ir HNSW)
Tiesiškai peržiūrėti 1 milijoną vektorių per lėta (delsa!). Naudojame indeksavimą.
- HNSW (Hierarchical Navigable Small World): aukso standartas. Jis sukuria grafą, leidžiantį paieškai per milisekundes „priartėti” prie aktualios vektorių kaimynystės.
-- Example PGVector Query
SELECT id, speaker_name, 1 - (embedding <=> '[...]'::vector) AS confidence
FROM voice_profiles
ORDER BY embedding <=> '[...]'::vector
LIMIT 1;
Architektūrinis pranašumas
Laikydami vektorius Postgres, išlaikome ACID atitiktį ir referencinį vientisumą. Galime akimirksniu ištrinti naudotoją ir kaskadiškai pašalinti jo balso vektorius – didžiulis pranašumas BDAR atžvilgiu (teisė būti pamirštam).
Išsaugokite balsą. Užklauskite matematiką. Kurkite su „IdentityCall” API.
Tags:
