Pgvector est l'extension très populaire de Postgres pour stocker, indexer et interroger des vecteurs. Les vecteurs sont un type de données utile depuis longtemps, mais ils ont récemment gagné en popularité en raison de leur utilité dans les architectures RAG (Retrieval Augmented Generation) des applications basées sur l'IA. Les vecteurs alimentent généralement la partie récupération : en utilisant la recherche de similarité vectorielle et les algorithmes du plus proche voisin, on peut trouver les documents les plus pertinents pour une question utilisateur donnée.
Avoir la possibilité de stocker des vecteurs dans votre base de données relationnelle normale, par opposition à un magasin de vecteurs dédié, signifie que vous pouvez utiliser toutes les fonctionnalités normales de la base de données relationnelle avec la recherche de vecteurs - joindre des tables vectorielles avec d'autres données et métadonnées, utiliser des champs supplémentaires pour le filtrage. , récupérer les informations associées, etc.
Nile prend en charge pgvector depuis notre première version bêta privée, il y a environ un an. Nous avons d'innombrables exemples de code qui utilisent pg_vector pour la recherche de similarité vectorielle. À partir de conversations avec nos utilisateurs et avec la communauté pg_vector, il est devenu clair qu'il existe des idées fausses et des malentendus courants concernant ses meilleures pratiques et son utilisation. En raison de ces malentendus, certaines personnes évitent complètement pg_vector ou l'utilisent moins efficacement qu'elles ne le feraient autrement. Alors réparons ça !
Ce mythe est le résultat du fait que certains magasins de vecteurs et bibliothèques populaires utilisent le terme « index » pour décrire toute méthode de stockage de vecteurs. Cela a conduit à l’idée fausse selon laquelle les index sont le seul moyen de stocker des vecteurs.
Ce n'est pas vrai dans la terminologie Postgres. L’astuce est que d’autres magasins de vecteurs ont ce qu’ils appellent un index « plat ». L'index plat signifie essentiellement « pas de hiérarchie ». Dans Postgres, la structure de table par défaut est plate. Donc si vous créez simplement une table avec une colonne de type vectoriel, insérez des vecteurs et ne crée...
[Courte citation de 8% de l'article original]