Accéder au contenu principal

Tutoriel pgvector : Intégrer la recherche vectorielle dans PostgreSQL

Découvrez comment améliorer PostgreSQL avec des capacités de recherche vectorielle en utilisant pgvector. Ce tutoriel vous guide à travers l'installation, les opérations de base et l'intégration avec les outils d'intelligence artificielle.
Actualisé 15 janv. 2025  · 25 min de lecture

La recherche vectorielle est devenue de plus en plus populaire ces dernières années, grâce à tous les progrès réalisés dans l'écosystème de l'IA générative et des grands modèles de langage.  

La recherche vectorielle est une méthode de recherche d'informations dans laquelle les documents et les requêtes sont représentés sous forme de vecteurs au lieu de texte brut. Cette représentation numérique est obtenue en utilisant un grand réseau neuronal entraîné qui peut convertir des données non structurées, telles que du texte, des images et des vidéos, en vecteurs.

Les bases de données relationnelles traditionnelles ne sont pas optimisées pour traiter de grands volumes de données vectorielles. C'est pourquoi de nombreuses bases de données vectorielles exclusives, libres ou propriétaires, ont vu le jour ces dernières années. Cependant, il n'est peut-être pas idéal pour toutes les entreprises de disposer d'une base de données dédiée aux vecteurs, séparée de la base de données principale.

Découvrez pgvector, une puissante extension pour PostgreSQL qui apporte des fonctionnalités de recherche de similarités vectorielles à l'une des bases de données relationnelles les plus populaires. 

Dans ce tutoriel, nous allons explorer les fonctionnalités de pgvector et montrer comment il peut vous aider dans votre travail.

Qu'est-ce que pgvector ?

pgvector est une extension open-source pour PostgreSQL qui ajoute le support des opérations vectorielles et des recherches de similarité. Il vous permet de stocker, d'indexer et d'interroger des données vectorielles directement dans votre base de données PostgreSQL. 

Cette intégration apporte la puissance des opérations vectorielles à votre infrastructure PostgreSQL existante, ce qui en fait un excellent choix pour les applications impliquant des encastrements, des systèmes de recommandation et des recherches de similarité.

Les caractéristiques de pgvector sont les suivantes

  • Stockage efficace de données vectorielles denses
  • Recherche rapide de similitudes à l'aide de diverses mesures de distance
  • Intégration avec le planificateur de requêtes et les mécanismes d'indexation existants de PostgreSQL
  • Prise en charge des recherches exactes et approximatives du plus proche voisin

L'importance des bases de données vectorielles

Les bases de données vectorielles sont des bases de données spécialisées conçues pour stocker et interroger des données vectorielles multidimensionnelles. Cette capacité est utile dans les applications modernes d'apprentissage automatique, notamment les systèmes de recommandation, la recherche d'images et les cas d'utilisation du traitement du langage naturel.

Une image montrant différents types de bases de données non relationnelles avec le titre "Les vecteurs ont besoin d'un nouveau type de base de données".

Les vecteurs ont besoin d'un nouveau type de base de données - une source d'images.

Les bases de données relationnelles traditionnelles ont du mal à gérer les données de haute dimension et à effectuer efficacement des recherches de similarité. Les bases de données vectorielles, en revanche, sont spécifiquement optimisées pour ces tâches, permettant une extraction rapide et précise des données sur la base de la proximité ou de la ressemblance des vecteurs. 

Cette approche permet d'effectuer des recherches fondées sur la pertinence sémantique ou contextuelle, ce qui donne des résultats plus significatifs que les recherches par correspondance exacte des bases de données conventionnelles.

Par exemple, une base de données vectorielle peut :

  • Recherchez des chansons qui entrent en résonance avec un air particulier sur la base de la mélodie et du rythme.
  • Découvrez des articles dont le thème et la perspective correspondent à ceux d'un autre article.
  • Identifiez les gadgets qui reflètent les caractéristiques et les critiques d'un appareil particulier.

Comment convertir en chiffres des données non structurées telles que du texte ou des images ? La réponse est l'intégration.

L'incorporation est un processus qui transforme des données non structurées en vecteurs numériques de taille fixe, capturant la sémantique et les relations inhérentes aux données. Pour ce faire, de grands réseaux neuronaux apprennent à représenter les données dans un espace vectoriel continu, où les éléments similaires sont placés plus près les uns des autres.

Une image montrant le fonctionnement des bases de données vectorielles

Comment fonctionne une base de données vectorielle ? Source de l'image.

Tutoriel pgvector étape par étape

Dans ce tutoriel, nous allons configurer pgvector, utiliser ses fonctionnalités de base et construire une application simple en l'intégrant à OpenAI.

Nous couvrirons l'installation, les opérations de base, l'indexation et l'intégration avec Python et LangChain.

1. Conditions préalables

Pour suivre ce tutoriel, vous devez avoir des connaissances de base en SQL et PostgreSQL et être familier avec la programmation Python.

Avant de commencer, assurez-vous que vous disposez des éléments suivants :

  • PostgreSQL 11 ou une version plus récente installée sur votre système
  • Python 3.7 ou supérieur (pour la section intégration)
  • Une clé API OpenAI (pour l'application de recherche sémantique)

2. Comment installer pgvector

1. Tout d'abord, assurez-vous que les fichiers de développement PostgreSQL sont installés. Sur Ubuntu ou Debian, vous pouvez les installer avec :

sudo apt-get install postgresql-server-dev-all

Si vous utilisez Windows, vous pouvez télécharger le programme d'installation de PostgreSQL depuis le site officiel.

2. Clonez le dépôt GitHub de pgvector :

git clone https://github.com/pgvector/pgvector.git

3. Créez et installez l'extension pgvector:

cd pgvector
make
sudo make install

Si vous utilisez Windows, assurez-vous que le support C++ de Visual Studio Code est installé. La documentation d'installation officielle fournit une procédure étape par étape.

4. Connectez-vous à votre base de données PostgreSQL :

Vous disposez de plusieurs options pour vous connecter et interagir avec la base de données PostgreSQL : pgAdmin est l'une des interfaces les plus utilisées. Vous pouvez également utiliser pSQL (PostgreSQL command line interface) ou même une extension VS Code pour PostgreSQL.

5. Après vous être connecté à votre base de données PostgreSQL, créez l'extension :

CREATE EXTENSION vector;

Capture d'écran de l'interface pgAdmin

pgAdmin Interface

3. Utilisation de base de pgvector

Maintenant que pgvector est installé, explorons son utilisation de base.

1. Pour mettre en place notre première base de données vectorielle dans PostgreSQL en utilisant l'extension pgvector, créons un tableau pour stocker nos données vectorielles :

CREATE TABLE items (
  id SERIAL PRIMARY KEY,
  embedding vector(3)
);

Cela crée un tableau nommé items avec une colonne id et une colonne embedding de type vector(3), qui stockera des vecteurs tridimensionnels.

2. Insérons maintenant quelques données dans notre tableau :

INSERT INTO items (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'), ('[1,1,1]');

3. Nous pouvons maintenant effectuer des opérations vectorielles. Par exemple, pour trouver le plus proche voisin du vecteur [2,3,4]:

SELECT * FROM items ORDER BY embedding <-> '[2,3,4]' LIMIT 1;

Cette requête utilise l'opérateur <->, qui calcule la distance euclidienne entre les vecteurs.

4. Nous pouvons également utiliser d'autres mesures de distance, comme la distance cosinusoïdale :

SELECT * FROM items ORDER BY embedding <=> '[2,3,4]' LIMIT 1;

L'opérateur <=> calcule la distance en cosinus entre les vecteurs.

4. Indexation de données vectorielles avec pgvector

L'indexation dans les bases de données vectorielles, y compris pgvector, est nécessaire pour améliorer les performances de recherche, en particulier lorsque votre ensemble de données s'accroît.

On ne saurait trop insister sur l'importance de l'indexation, qui présente plusieurs avantages :

  • Tout d'abord, il améliore considérablement la vitesse. Sans index, chaque recherche de similarité nécessiterait un balayage complet du tableau, comparant le vecteur de la requête à tous les vecteurs de la base de données. Ce processus prend de plus en plus de temps au fur et à mesure que vos données augmentent. Les index créent une structure qui permet des recherches beaucoup plus rapides. 
  • Deuxièmement, l'indexation améliore l'évolutivité, permettant à votre base de données de gérer efficacement des ensembles de données plus importants. Au fur et à mesure que vous ajoutez des vecteurs, les recherches correctement indexées conservent leurs performances. 
  • Enfin, l'indexation contribue à l'efficacité des ressources en réduisant la charge de l'unité centrale et des entrées/sorties lors des recherches. Cela est particulièrement important pour les systèmes très sollicités ou ceux qui fonctionnent avec des ressources limitées, car cela garantit un fonctionnement sans heurts, même dans des conditions exigeantes.

Deux types d'index sont disponibles pour pgvector : ivfflat et hnsw. Les deux servent des objectifs différents :

  • Index IVFFlat (Inverted File Flat) :
    • Convient pour les recherches exactes sur les voisins les plus proches
    • Divise l'espace vectoriel en grappes, ce qui accélère les recherches en identifiant d'abord les grappes pertinentes.
    • Bon équilibre entre la vitesse et la précision de la recherche
  • Index HNSW (Hierarchical Navigable Small World) :
    • Conçu pour la recherche approximative du plus proche voisin
    • Crée une structure de graphe pour une navigation rapide entre les vecteurs
    • Extrêmement rapide, mais peut parfois manquer le voisin le plus proche.

Quand utiliser chaque indice :

  • Utilisez IVFFlat lorsque vous avez besoin de résultats précis et que vous pouvez tolérer des recherches un peu plus lentes.
  • Utilisez HNSW lorsque vous avez besoin de recherches rapides et que vous pouvez accepter de légères inexactitudes.

1. Créons un index ivfflat:

CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);

Cela permet de créer un index à l'aide de l'algorithme IVFFlat, qui convient aux recherches exactes sur les plus proches voisins.

2. Pour les recherches approximatives du plus proche voisin, nous pouvons utiliser l'index hnsw:

CREATE INDEX ON items USING hnsw (embedding vector_l2_ops) WITH (m = 16, ef_construction = 64);

Après avoir créé un index, nos requêtes l'utiliseront automatiquement le cas échéant.

5. intégration de pgvector avec d'autres outils

Pgvector supporte l'intégration de quelques frameworks, ce qui facilite l'interaction avec notre base de données vectorielles. Passons en revue deux d'entre elles : Python et LangChain.

Utiliser pgvector avec Python

pgvector peut être facilement intégré à Python à l'aide de la bibliothèque psycopg2. Mettons en place un environnement Python et effectuons quelques opérations de base.

1. Installez d'abord les bibliothèques nécessaires :

!pip install psycopg2-binary numpy

2. Maintenant, créons un script Python pour interagir avec notre base de données vectorielles :

import psycopg2
import numpy as np

# Connect to the database
conn = psycopg2.connect("dbname=your_database user=your_username")
cur = conn.cursor()

# Insert a vector
embedding = np.array([1.5, 2.5, 3.5])
cur.execute("INSERT INTO items (embedding) VALUES (%s)", (embedding.tolist(),))

# Perform a similarity search
query_vector = np.array([2, 3, 4])
cur.execute("SELECT * FROM items ORDER BY embedding <-> %s LIMIT 1", (query_vector.tolist(),))
result = cur.fetchone()
print(f"Nearest neighbor: {result}")

conn.commit()
cur.close()
conn.close()

Ce script montre comment insérer un vecteur et effectuer une recherche de similarité à l'aide de Python.

Utilisation de pgvector avec LangChain

pgvector peut également être intégré à LangChain, un cadre populaire pour le développement d'applications avec de grands modèles de langage. 

Voici un exemple simple de l'utilisation de pgvector comme magasin de vecteurs dans LangChain :

from langchain_postgres.vectorstores import PGVector
from langchain.embeddings.openai import OpenAIEmbeddings

# Set up the connection string and embedding function
connection_string = "postgresql://user:pass@localhost:5432/db_name"
embedding_function = OpenAIEmbeddings()

# Create a PGVector instance
vector_store = PGVector.from_documents(
    documents,
    embedding_function,
    connection_string=connection_string
)

# Perform a similarity search
query = "Your query here"
results = vector_store.similarity_search(query)

Cet exemple suppose que vous avez mis en place les embeddings OpenAI et que vous disposez d'une liste de documents à intégrer.

6. Construire un exemple d'application avec pgvector et OpenAI

Construisons maintenant un moteur de recherche sémantique simple en utilisant pgvector et les embeddings OpenAI !

Cette application permettra aux utilisateurs d'effectuer des recherches dans une collection de documents textuels à l'aide de requêtes en langage naturel.

import openai
import psycopg2
import numpy as np

# Set up OpenAI API (replace with your actual API key)
openai.api_key = "your_openai_api_key"

# Connect to the database
conn = psycopg2.connect("dbname=your_database user=your_username")
cur = conn.cursor()

# Create a table for our documents
cur.execute("""
    CREATE TABLE IF NOT EXISTS documents (
        id SERIAL PRIMARY KEY,
        content TEXT,
        embedding vector(1536)
    )
""")

# Function to get embeddings from OpenAI
def get_embedding(text):
    response = openai.embeddings.create(input=text, model="text-embedding-ada-002")
    return response['data'][0]['embedding']

# Function to add a document
def add_document(content):
    embedding = get_embedding(content)
    cur.execute("INSERT INTO documents (content, embedding) VALUES (%s, %s)", (content, embedding))
    conn.commit()

# Function to search for similar documents
def search_documents(query, limit=5):
    query_embedding = get_embedding(query)
    cur.execute("""
        SELECT content, embedding <-> %s AS distance
        FROM documents
        ORDER BY distance
        LIMIT %s
    """, (query_embedding, limit))
    return cur.fetchall()

# Add some sample documents
sample_docs = [
    "The quick brown fox jumps over the lazy dog.",
    "Python is a high-level programming language.",
    "Vector databases are essential for modern AI applications.",
    "PostgreSQL is a powerful open-source relational database.",
]
for doc in sample_docs:
    add_document(doc)

# Perform a search
search_query = "Tell me about programming languages"
results = search_documents(search_query)
print(f"Search results for: '{search_query}'")
for i, (content, distance) in enumerate(results, 1):
    print(f"{i}. {content} (Distance: {distance:.4f})")

# Clean up
cur.close()
conn.close()

Cette application simple montre comment utiliser pgvector pour créer un moteur de recherche sémantique.

Il incorpore des documents en utilisant le modèle d' incorporation de texte d'OpenAI et les stocke dans une base de données PostgreSQL avec pgvector. La fonction de recherche permet de trouver les documents les plus similaires à une requête donnée en utilisant la similarité cosinusoïdale.

Analyse comparative de pgvector

Comparons pgvector avec d'autres bases de données vectorielles populaires. Cette comparaison vous aidera à comprendre les différences de fonctionnalités, d'options de déploiement, d'évolutivité, d'intégration et de coût entre pgvector et d'autres solutions disponibles sur le marché.

pgvector versus Pinecone

Pinecone est une base de données vectorielle entièrement gérée, conçue pour une grande évolutivité et une grande facilité d'utilisation.

Fonctionnalité

pgvector

Pomme de pin

Type de base de données

Extension pour PostgreSQL

Base de données vectorielles entièrement gérée

Déploiement

Auto-hébergé

Basé sur le cloud

Évolutivité

Limité par PostgreSQL

Hautement modulable

Integration

Fonctionne avec la pile PostgreSQL existante 

Nécessite une intégration séparée

Coût

Gratuit, open-source

Tarification à la carte

pgvector est un excellent choix pour ceux qui veulent tirer parti de leur infrastructure PostgreSQL existante sans coûts supplémentaires. En même temps, Pinecone fournit une solution gérée et hautement évolutive avec une tarification à la carte pour une plus grande facilité d'utilisation.

pgvector contre Milvus

Milvus est une base de données vectorielle dédiée qui offre des fonctionnalités avancées et une grande évolutivité.

Fonctionnalité

pgvector

Milvus

Type de base de données

Extension pour PostgreSQL

Base de données vectorielle dédiée

Déploiement

Auto-hébergé

Auto-hébergé ou cloud

Évolutivité

Limité par PostgreSQL

Hautement modulable

Integration

Fonctionne avec la pile PostgreSQL existante

Nécessite une intégration séparée

Ensemble de caractéristiques

Opérations vectorielles de base

Fonctionnalités avancées telles que le schéma dynamique

Alors que pgvector fournit des opérations vectorielles de base dans l'environnement familier de PostgreSQL, Milvus offre une solution plus riche en fonctionnalités et plus évolutive, spécifiquement pour traiter des données vectorielles à grande échelle.

pgvector versus Weaviate

Weaviate est une base de données vectorielle avec stockage d'objets intégré, offrant une modélisation flexible des données et une grande évolutivité.

Fonctionnalité

pgvector

Weaviate

Type de base de données

Extension pour PostgreSQL

Base de données vectorielle avec stockage d'objets

Déploiement

Auto-hébergé

Auto-hébergé ou cloud

Évolutivité

Limité par PostgreSQL

Conçu pour l'évolutivité

Integration

Fonctionne avec la pile PostgreSQL existante

Nécessite une intégration séparée

Modèle de données

Vecteurs uniquement

Objets avec vecteurs et propriétés

La simplicité de pgvector et son intégration avec PostgreSQL en font un outil adapté aux utilisateurs existants qui ont besoin de fonctionnalités vectorielles de base. En revanche, le modèle de données plus sophistiqué et l'évolutivité de Weaviate conviennent aux applications complexes nécessitant un stockage d'objets et de vecteurs.

Conclusion

pgvector apporte de puissantes capacités de recherche de similarités vectorielles à PostgreSQL, ce qui en fait un excellent choix pour les développeurs qui souhaitent ajouter des fonctionnalités d'IA à leurs applications existantes basées sur PostgreSQL. 

Dans ce tutoriel, nous avons exploré son installation, son utilisation de base, ses capacités d'indexation et son intégration avec Python et LangChain.

Bien que pgvector n'offre pas la même évolutivité et les mêmes fonctionnalités spécialisées que les bases de données vectorielles dédiées comme Pinecone ou Milvus, son intégration transparente avec PostgreSQL en fait une option attrayante pour de nombreux cas d'utilisation. 

Il est particulièrement adapté aux projets qui utilisent déjà PostgreSQL et qui ont besoin d'ajouter des fonctionnalités de recherche vectorielle sans introduire un nouveau système de base de données.

Nous vous encourageons à essayer pgvector dans vos propres projets. Que vous construisiez un système de recommandation, un moteur de recherche sémantique ou toute autre application nécessitant des recherches de similarité, pgvector peut être un outil précieux dans votre boîte à outils de science des données.

Pour approfondir votre apprentissage, pensez à explorer ces cours gratuits de DataCamp :

Ces cours vous aideront à approfondir votre compréhension des bases de données et des applications modernes du LLM.

Développer des applications d'IA

Apprenez à créer des applications d'IA à l'aide de l'API OpenAI.
Commencez à Upskiller gratuitement

FAQ

Dois-je changer toute ma base de données pour utiliser pgvector ?

Non, il s'agit d'un complément à votre base de données PostgreSQL existante.

Puis-je utiliser pgvector avec d'autres langages que Python ?

Oui, avec n'importe quel langage disposant d'un adaptateur PostgreSQL.

Comment puis-je surveiller les performances des requêtes pgvector ?

Vous pouvez utiliser les outils intégrés de PostgreSQL tels que EXPLAIN et ANALYZE pour surveiller les performances des requêtes. En outre, les extensions de journalisation et de surveillance telles que pg_stat_statements peuvent fournir des informations sur les performances des requêtes et aider à identifier les goulets d'étranglement.

Est-il possible de combiner la recherche vectorielle avec des requêtes SQL traditionnelles ?

Oui, pgvector vous permet de combiner la recherche vectorielle avec des requêtes SQL traditionnelles. Vous pouvez inclure des opérations de similarité vectorielle dans vos requêtes SQL avec d'autres conditions, ce qui permet d'effectuer des recherches complexes qui exploitent à la fois les données vectorielles et relationnelles.

pgvector peut-il être utilisé avec d'autres cadres d'apprentissage machine que OpenAI ?

Oui, pgvector peut être intégré à divers cadres et bibliothèques d'apprentissage automatique. Vous pouvez générer des embeddings en utilisant des modèles issus de frameworks comme TensorFlow, PyTorch, ou Hugging Face, et stocker et interroger ces embeddings en utilisant pgvector dans PostgreSQL.

Comment gérer les mises à jour de pgvector ?

Lors de la mise à jour de pgvector, assurez-vous de suivre les instructions officielles de mise à jour fournies dans la documentation de pgvector. Sauvegardez vos données avant d'effectuer une mise à niveau. Après la mise à niveau, testez soigneusement votre application pour vous assurer de sa compatibilité et de ses performances.

pgvector peut-il traiter efficacement des vecteurs de haute dimension ?

Bien que pgvector puisse gérer des vecteurs de haute dimension, les performances peuvent être limitées par les capacités de PostgreSQL. Pour les données à très haute dimension, envisagez d'optimiser votre installation PostgreSQL ou d'explorer des bases de données vectorielles dédiées comme Milvus ou Pinecone.


Moez Ali's photo
Author
Moez Ali
LinkedIn
Twitter

Scientifique de données, fondateur et créateur de PyCaret

Sujets

Apprenez-en plus sur l'apprentissage automatique et l'IA grâce à ces cours !

cours

Generative AI Concepts

2 hr
45.9K
Discover how to begin responsibly leveraging generative AI. Learn how generative AI models are developed and how they will impact society moving forward.
Afficher les détailsRight Arrow
Commencer le cours
Voir plusRight Arrow
Apparenté

blog

Les 32 meilleures questions d'entretien sur AWS et leurs réponses pour 2024

Un guide complet pour explorer les questions d'entretien AWS de base, intermédiaires et avancées, ainsi que des questions basées sur des situations réelles. Il couvre tous les domaines, garantissant ainsi une stratégie de préparation bien équilibrée.
Zoumana Keita 's photo

Zoumana Keita

30 min

blog

Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Vous êtes actuellement à la recherche d'un emploi qui utilise Snowflake ? Préparez-vous à répondre à ces 20 questions d'entretien sur le flocon de neige pour décrocher le poste !
Nisha Arya Ahmed's photo

Nisha Arya Ahmed

20 min

blog

Q2 2023 DataCamp Donates Digest

DataCamp Donates a offert plus de 20k bourses d'études à nos partenaires à but non lucratif au deuxième trimestre 2023. Découvrez comment des apprenants défavorisés et assidus ont transformé ces opportunités en réussites professionnelles qui ont changé leur vie.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

blog

Célébration de Saghar Hazinyar : Une boursière de DataCamp Donates et une diplômée de Code to Inspire

Découvrez le parcours inspirant de Saghar Hazinyar, diplômée de Code to Inspire, qui a surmonté les défis en Afghanistan et s'est épanouie grâce à une bourse de DataCamp Donates.
Fereshteh Forough's photo

Fereshteh Forough

4 min

blog

2022-2023 Rapport annuel DataCamp Classrooms

À l'aube de la nouvelle année scolaire, DataCamp Classrooms est plus motivé que jamais pour démocratiser l'apprentissage des données, avec plus de 7 650 nouveaux Classrooms ajoutés au cours des 12 derniers mois.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

8 min

blog

Nous avons fait don de bourses DataCamp Premium à un million de personnes, et ce n'est pas fini.

Réparties entre nos deux programmes d'impact social, DataCamp Classrooms et #DCDonates, les bourses offrent un accès illimité à tout ce que DataCamp Premium a à offrir.
Nathaniel Taylor-Leach's photo

Nathaniel Taylor-Leach

Voir plusVoir plus