Lexique · Frameworks / outils IA

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).

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

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 de n dimensions, qui doit correspondre à la taille du modèle d'embedding. halfvec stocke 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.

python
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èrepgvectorPineconeQdrant
NatureExtension PostgreSQL open sourceService propriétaireBase vectorielle open source
HébergementPartout où tourne PostgreSQLCloud de l'éditeur uniquementVos serveurs ou cloud managé
ExploitationCelle de votre base existanteAucuneÀ votre charge si auto-hébergé
FiltrageSQL complet et jointuresFiltres sur métadonnéesFiltres sur payload
Recherche hybrideÀ composer avec le plein texteVecteurs denses et creuxVecteurs denses et creux, RRF
Idéal pourCorpus modestes, stack PostgreSQLÉquipes sans exploitationContrô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.

Pertinent si

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.
Moins adapté si

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.

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.

Ressources pour approfondir pgvector

Trois articles du blog Blent pour comprendre les bases vectorielles et les exploiter dans un RAG ou un agent.

Questions fréquentes

Questions fréquentes

Oui, l'extension est open source, distribuée sous la PostgreSQL License, et s'installe gratuitement sur votre base. Les services PostgreSQL managés qui la proposent facturent l'hébergement de la base, pas l'extension. Il faut prévoir le coût de la mémoire et du stockage des index.

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