Torna al blog
7 min di letturaPostgreSQLRicercaLingRise

Ricerca semantica multilingue con pgvector

Come 9 lingue convivono in un unico indice vettoriale senza degradare la pertinenza.


Il problema

LingRise indicizza trascrizioni di podcast in 9 lingue. Un utente francofono che studia spagnolo deve poter cercare in francese e arrivare a un passaggio spagnolo pertinente.

L'approccio

  • Un modello di embedding realmente multilingue, non un modello inglese con traduzione preliminare.
  • Un unico indice ivfflat su una colonna vector(1536) in PostgreSQL, con un pre-filtro parziale su lang.
  • Un punteggio ibrido: 0.7 * similarità_coseno + 0.3 * BM25 per recuperare i nomi propri, che gli embedding gestiscono male.

La parte controintuitiva

Filtrare per lingua prima della ricerca vettoriale peggiorava il recall: i risultati migliori venivano spesso da un'altra lingua. La soluzione è stata cercare in modo ampio e poi ripesare a livello applicativo.