Retour au blog
7 min de lecturePostgreSQLRechercheLingRise

Recherche sémantique multilingue avec pgvector

Comment 9 langues cohabitent dans un même index vectoriel sans dégrader la pertinence.


Le problème

LingRise indexe des transcriptions de podcasts en 9 langues. Un utilisateur francophone qui apprend l'espagnol doit pouvoir chercher en français et tomber sur un passage espagnol pertinent.

L'approche

  • Un modèle d'embedding réellement multilingue, pas un modèle anglais avec traduction préalable.
  • Un seul index ivfflat sur une colonne vector(1536) dans PostgreSQL, avec un filtre lang en pré-filtrage partiel.
  • Un score hybride : 0.7 * similarité_cosinus + 0.3 * BM25 pour rattraper les noms propres, que les embeddings gèrent mal.

Ce qui a été contre-intuitif

Filtrer par langue avant la recherche vectorielle dégradait le rappel : les meilleurs résultats venaient souvent d'une autre langue. La solution a été de chercher large puis de repondérer côté application.