cours
Tutoriel pgvector : Intégrer la recherche vectorielle dans PostgreSQL
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.
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.
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;
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 :
- Création de bases de données PostgreSQL
- Développer des applications LLM avec LangChain
- Introduction à l'intégration avec l'API OpenAI
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
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.
Apprenez-en plus sur l'apprentissage automatique et l'IA grâce à ces cours !
cours
Vector Databases for Embeddings with Pinecone
cours
Introduction to Embeddings with the OpenAI API
blog
Les 32 meilleures questions d'entretien sur AWS et leurs réponses pour 2024
blog
Les 20 meilleures questions d'entretien pour les flocons de neige, à tous les niveaux

Nisha Arya Ahmed
20 min
blog
Q2 2023 DataCamp Donates Digest
blog
Célébration de Saghar Hazinyar : Une boursière de DataCamp Donates et une diplômée de Code to Inspire

Fereshteh Forough
4 min
blog
2022-2023 Rapport annuel DataCamp Classrooms
blog