pgvector : définition, fonctionnement et exemple SQL
L'extension PostgreSQL open source qui ajoute un type vecteur et la recherche de similarité à une base existante : index HNSW et IVFFlat, exemple SQL, RAG et comparatif avec les bases vectorielles dédiées.
Par Équipe Blent· Mis à jour le · 14 min de lecture· Niveau intermédiaire
pgvector en bref
- Type
- Extension PostgreSQL pour la recherche vectorielle
- Créateur
- Andrew Kane, puis communauté open source
- Licence
- PostgreSQL License
- Langage
- C
Définition : pgvector
pgvector est une extension open source de PostgreSQL qui ajoute un type de colonne pour stocker des vecteurs et des opérateurs pour mesurer leur distance. Elle permet de conserver des embeddings, c'est-à-dire des représentations numériques du sens d'un texte ou d'une image, à côté des données relationnelles, puis de retrouver les plus proches d'un vecteur de requête avec une simple requête SQL. Des index approximatifs, HNSW et IVFFlat, accélèrent la recherche sur de gros volumes. pgvector sert de brique de recherche dans les systèmes RAG sans déployer de base vectorielle dédiée.
En une phrase : pgvector transforme PostgreSQL en base vectorielle : vous stockez et interrogez vos embeddings en SQL, dans la base que vous exploitez déjà.
Dans cette définition
Qu'est-ce que pgvector ?
pgvector est une extension de PostgreSQL qui lui donne les moyens de stocker et de comparer des vecteurs. Dans une application d'IA générative, chaque document, paragraphe ou image est converti en embedding, une liste de nombres qui encode son sens. Retrouver les contenus pertinents pour une question revient alors à chercher les vecteurs les plus proches de celui de la question, ce que pgvector permet directement en SQL.
Le projet a été créé par Andrew Kane et développé en open source, sous la PostgreSQL License. Son atout est de ne pas ajouter de système : au lieu de déployer une base vectorielle séparée comme Pinecone, Qdrant ou Weaviate, on active une extension sur la base que l'on exploite déjà. L'essor du RAG en a fait l'un des choix par défaut pour les corpus de taille modeste.
Les index HNSW, qui ont fait passer l'extension du prototype à la production, sont disponibles depuis la version 0.5.0. Les versions suivantes ont ajouté les types halfvec (demi-précision), sparsevec (vecteurs creux) et bit, ainsi que des améliorations pour combiner filtres et index approximatif.
À retenir : pgvector n'est pas une base de données à part. C'est une capacité ajoutée à PostgreSQL, avec ses avantages (SQL, transactions, écosystème) et ses limites (une base généraliste).
Sous le capot : types, distances et index
pgvector repose sur un type, trois familles de distances et deux index, à choisir avant d'indexer le premier vecteur.
- Type
vector(n): un vecteur dendimensions, qui doit correspondre à la taille du modèle d'embedding.halfvecstocke les valeurs en demi-précision pour réduire la taille. - Opérateurs de distance :
<->pour la distance euclidienne,<=>pour la distance cosinus et<#>pour le produit scalaire négatif. - Index : sans index, la recherche est exacte et parcourt toutes les lignes. Avec un index, elle devient approximative et rapide.
HNSW et IVFFlat
L'index HNSW (Hierarchical Navigable Small World) organise les vecteurs en graphe à plusieurs niveaux. Il offre en général un meilleur compromis entre vitesse et rappel, ne demande pas de données préexistantes, mais consomme plus de mémoire et se construit plus lentement. Ses paramètres m et ef_construction règlent la construction, et hnsw.ef_search règle la recherche.
L'index IVFFlat répartit les vecteurs en listes autour de centroïdes. Il se construit plus vite et occupe moins de mémoire, mais il faut le créer une fois la table remplie et régler le nombre de listes, puis le nombre de listes sondées (ivfflat.probes) à la requête.
Exemple : un RAG minimal en SQL et Python
Une équipe veut retrouver les articles d'une base de connaissances les plus proches d'une question, filtrés par langue. Le script suivant utilise le pilote psycopg face à une base PostgreSQL où l'extension est disponible, par exemple lancée avec l'image Docker pgvector/pgvector. Les vecteurs sont fictifs, sur trois dimensions : en pratique, ils proviennent d'un modèle d'embedding.
import psycopg
with psycopg.connect("postgresql://postgres:postgres@localhost:5432/postgres") as conn:
# 1. Activer l'extension et créer la table avec une colonne vectorielle
conn.execute("CREATE EXTENSION IF NOT EXISTS vector")
conn.execute("""
CREATE TABLE IF NOT EXISTS articles (
id bigserial PRIMARY KEY,
contenu text,
langue text,
embedding vector(3)
)
""")
# 2. Insérer un contenu avec son embedding (au format texte pgvector)
conn.execute(
"INSERT INTO articles (contenu, langue, embedding) VALUES (%s, %s, %s::vector)",
("Le remboursement intervient sous 14 jours.", "fr", "[0.01, 0.45, 0.67]"),
)
# 3. Index HNSW pour la distance cosinus
conn.execute(
"CREATE INDEX IF NOT EXISTS articles_hnsw ON articles "
"USING hnsw (embedding vector_cosine_ops)"
)
# 4. Recherche : filtre sur la langue, tri par distance cosinus
lignes = conn.execute(
"""
SELECT contenu, embedding <=> %s::vector AS distance
FROM articles
WHERE langue = 'fr'
ORDER BY embedding <=> %s::vector
LIMIT 3
""",
("[0.02, 0.40, 0.70]", "[0.02, 0.40, 0.70]"),
).fetchall()
for contenu, distance in lignes:
print(round(distance, 4), contenu)
La requête est vectorisée avec le même modèle que les documents, et la classe d'opérateurs de l'index (vector_cosine_ops) doit correspondre à l'opérateur utilisé dans le ORDER BY, sinon PostgreSQL n'emploie pas l'index. Le texte reste dans la même ligne que son vecteur, ce qui évite une seconde requête. Dans un RAG, les lignes renvoyées sont ensuite injectées dans le prompt du LLM, souvent par LangChain ou LlamaIndex, qui disposent d'intégrations avec PostgreSQL.
Les principaux cas d'usage de pgvector
pgvector convient quand la recherche vectorielle est une fonction de l'application, pas un système séparé à exploiter.
RAG sur base existante
Fournir à un LLM les passages d'un corpus stocké avec les données métier.
Recherche sémantique
Trouver des fiches, tickets ou documents proches par le sens d'une question.
Recommandation
Suggérer des produits ou contenus proches de ceux qu'un utilisateur consulte.
Mémoire d'agent
Conserver les faits d'un agent IA dans la base qui porte déjà son état.
Déduplication
Repérer des textes ou images quasi identiques par la distance entre embeddings.
Prototypage rapide
Valider un RAG avec la base du projet avant de choisir une infrastructure dédiée.
Quels sont les avantages de pgvector ?
pgvector tire sa force de PostgreSQL : on ajoute une capacité à un outil que l'équipe connaît, au lieu de multiplier les systèmes.
- Une seule base pour les données relationnelles et les vecteurs, sans synchronisation entre deux systèmes.
- Des filtres et des jointures SQL complets, appliqués dans la même requête que la recherche de similarité.
- Les garanties de PostgreSQL : transactions ACID, sauvegardes, réplication et gestion des droits.
- Un code ouvert, une adoption large et une disponibilité dans la plupart des services PostgreSQL managés.
- Aucune brique supplémentaire à superviser, sécuriser ou facturer pour un corpus modeste.
- Des outils connus de l'équipe : SQL, ORM, pilotes, migrations, et intégrations dans LangChain et LlamaIndex.
Quelles sont les limites de pgvector ?
Une base généraliste n'a pas été conçue d'abord pour la recherche vectorielle : les limites apparaissent avec le volume et la charge.
- Les index vectoriels consomment beaucoup de mémoire et leur construction est longue sur de gros volumes.
- La montée en charge dépend de PostgreSQL : réplicas et partitionnement, sans distribution native des vecteurs.
- Les index HNSW et IVFFlat sont approximatifs : le rappel doit être mesuré et réglé.
- Un filtre très sélectif combiné à un index approximatif peut renvoyer moins de résultats que demandé.
- La recherche hybride n'est pas clé en main : il faut composer le plein texte PostgreSQL et la similarité.
- Les calculs vectoriels partagent les ressources de la base transactionnelle et peuvent concurrencer le reste de l'application.
pgvector vs base vectorielle dédiée : quelles différences ?
Le choix se joue moins sur la qualité de la recherche, comparable à index équivalent, que sur le modèle d'exploitation et le volume. Voici comment pgvector se situe face à Pinecone et Qdrant.
| Critère | pgvector | Pinecone | Qdrant |
|---|---|---|---|
| Nature | Extension PostgreSQL open source | Service propriétaire | Base vectorielle open source |
| Hébergement | Partout où tourne PostgreSQL | Cloud de l'éditeur uniquement | Vos serveurs ou cloud managé |
| Exploitation | Celle de votre base existante | Aucune | À votre charge si auto-hébergé |
| Filtrage | SQL complet et jointures | Filtres sur métadonnées | Filtres sur payload |
| Recherche hybride | À composer avec le plein texte | Vecteurs denses et creux | Vecteurs denses et creux, RRF |
| Idéal pour | Corpus modestes, stack PostgreSQL | Équipes sans exploitation | Contrôle des données, gros volumes |
Une démarche fréquente consiste à démarrer avec pgvector, qui évite toute infrastructure nouvelle, puis à migrer vers une base dédiée si le volume ou la charge l'exigent. Notre article Pinecone : la base de données vectorielle managée détaille le fonctionnement des bases vectorielles côté managé.
Ce n'est pas un choix définitif. Conservez les documents sources et le pipeline de vectorisation : changer de base reste alors une simple réindexation.
pgvector pour la mémoire et l'état des agents
Beaucoup d'agents IA persistent déjà leur état dans PostgreSQL. Ajouter une colonne vectorielle à cette base permet de retrouver les souvenirs d'un agent par similarité, filtrés par utilisateur ou par session, dans la même transaction que l'état. Les articles Mémoire des agents IA et Gérer l'état des agents IA détaillent ces stratégies.
Quand choisir pgvector ?
Le critère décisif est le volume et la charge de la recherche, comparés à la complexité d'ajouter un système à exploiter.
PostgreSQL est déjà au centre de votre stack
- Le corpus se compte en dizaines ou centaines de milliers de fragments.
- Les requêtes combinent similarité, filtres relationnels et jointures.
- L'équipe maîtrise PostgreSQL et veut éviter une brique de plus.
- La cohérence transactionnelle entre données et vecteurs compte.
La recherche vectorielle devient un service à part entière
- Le volume dépasse largement ce qu'une instance PostgreSQL absorbe confortablement.
- La charge de recherche doit être isolée de la base transactionnelle.
- Il faut une recherche hybride avancée ou une distribution native des index.
- Aucune base PostgreSQL n'existe et personne ne veut en exploiter une.
Technologies et outils associés à pgvector
pgvector s'insère dans une chaîne qui comprend PostgreSQL, un modèle d'embedding, un framework d'orchestration et des bases concurrentes évaluées en parallèle.
- Alternative managée
Pinecone
Base vectorielle propriétaire, proposée uniquement en service managé.
- Alternative open source
Qdrant
Base vectorielle en Rust, auto-hébergeable ou managée, aux filtres soignés.
- Alternative open source
Weaviate
Base vectorielle avec recherche hybride native et vectorisation intégrée.
- Orchestration
LangChain
Intégration pour utiliser une table PostgreSQL avec pgvector comme vector store.
- Orchestration
LlamaIndex
Framework de données pour LLM, qui prend en charge PostgreSQL comme vector store.
- Déploiement
Docker
Image PostgreSQL embarquant pgvector pour un environnement local reproductible.
- Orchestration de conteneurs
Kubernetes
Plateforme pour déployer PostgreSQL et pgvector en production.
- Modèles
Hugging Face
Modèles d'embedding open source pour produire les vecteurs à stocker.
Les concepts à connaître autour de pgvector
Ces notions expliquent ce que pgvector stocke, comment il compare les vecteurs et où il se place dans une application IA.
- EmbeddingLe vecteur qui représente le sens d'un contenu, unité de base de pgvector.
- RAGL'architecture qui utilise une recherche vectorielle pour alimenter un LLM.
- Recherche hybrideLa combinaison de la similarité vectorielle et de la recherche par mots-clés.
- Mémoire d'agentLe mécanisme qui permet à un agent de conserver et retrouver des informations passées.
- État d'agentL'ensemble des informations qu'un agent persiste d'un tour à l'autre, souvent dans PostgreSQL.
- LLMLe modèle de langage qui exploite les passages retrouvés par pgvector.
Ressources pour approfondir pgvector
Trois articles du blog Blent pour comprendre les bases vectorielles et les exploiter dans un RAG ou un agent.
- Comparatif
Pinecone : la base de données vectorielle managée
Le fonctionnement des bases vectorielles et le point de comparaison managé de pgvector.
Lire l'article - Guide
Mémoire des agents IA : stratégies, outils et bonnes pratiques
Utiliser une base vectorielle comme mémoire à long terme d'un agent.
Lire l'article - Article
Gérer l'état des agents IA
Persister l'état d'un agent, un usage naturel de PostgreSQL et de pgvector.
Lire l'article
Questions fréquentes
Questions fréquentes
Expertise
À propos de l'auteur
Équipe Blent
Les ingénieurs et mentors Blent conçoivent, évaluent et mettent en production des applications LLM, et forment chaque année des centaines de professionnels à l'IA générative.
Sources et méthodologie
- Dépôt GitHub pgvector/pgvector (README, licence, types, index, opérateurs)
- Documentation officielle de PostgreSQL (extensions)
- Retours d'expérience des projets et formations Blent
Comment fonctionne pgvector ?
Utiliser pgvector revient à suivre cinq étapes, de l'activation de l'extension à l'exploitation des résultats par un LLM ou une application.
Activer l'extension
La commande CREATE EXTENSION vector ajoute les types et opérateurs à la base. Les services PostgreSQL managés proposent souvent l'extension déjà installée.
Déclarer une colonne vectorielle
On ajoute une colonne de type vector(n) à une table, où n est la taille du modèle d'embedding. Le vecteur vit à côté du texte, des métadonnées et des clés étrangères.
Insérer les embeddings
Un modèle d'embedding, exécuté chez vous ou chez un fournisseur, vectorise chaque contenu. L'application écrit le vecteur avec un INSERT classique, dans la même transaction que le reste.
Créer un index
Sans index, la recherche compare la requête à chaque ligne, avec un résultat exact. Un index HNSW ou IVFFlat échange un peu de précision contre une grande vitesse.
Interroger par similarité
Une clause ORDER BY avec un opérateur de distance et un LIMIT renvoie les plus proches voisins. Un WHERE ordinaire filtre sur les métadonnées, et un JOIN rejoint d'autres tables.