L'apprentissage de l'IA est gourmand en ressources. Il faut d'énormes ensembles de données, des algorithmes avancés et du matériel spécialisé (lire : des GPU coûteux) pour apprendre à un modèle à comprendre le langage, les images ou l'audio. Mais même une fois la formation terminée, l'exécution d'inférences (le processus de génération de résultats) peut s'avérer tout aussi exigeante.
Interroger un LLM en temps réel pour chaque demande d'un utilisateur n'est pas seulement coûteux, c'est aussi inefficace. Surtout si la réponse existe déjà. Pour résoudre ce problème, les équipes de développement se sont tournées vers les bases de données vectorielles.
Contrairement aux bases de données traditionnelles qui reposent sur des correspondances exactes de mots-clés, les bases de données vectorielles stockent les informations sous forme d'enchâssements à haute dimension, comme des représentations numériques de données telles que des textes, des images ou des sons. Cela permet d'effectuer des recherches sémantiques. Ainsi, au lieu de rechercher des mots exacts, vous recherchez le sens.
Cette distinction est essentielle dans des cas d'utilisation tels que :
- Génération augmentée par récupération (RAG)
- Moteurs de recommandation
- Systèmes de réponse aux questions
- Recherche sémantique
Avec les bases de données vectorielles, les systèmes d'intelligence artificielle peuvent récupérer des informations pertinentes plus rapidement et plus efficacement en sautant les appels d'inférence inutiles lorsque la réponse existe déjà dans l'index vectoriel. Il existe de nombreuses solutions de bases de données vectorielles, mais aujourd'hui je parlerai de pgvector, une extension PostgreSQL open-source que j'utilise personnellement et que je recommande. Nous verrons pourquoi je pense qu'il s'agit d'un outil formidable et comment vous pouvez commencer à l'utiliser.
Pourquoi pgvector est un excellent outil pour les développeurs
Pour commencer, pgvector intègre des capacités de recherche vectorielle directement dans PostgreSQL, l'une des bases de données relationnelles les plus largement adoptées dans le monde. Pour les développeurs et les équipes qui travaillent déjà dans un environnement PostgreSQL, il s'agit d'une option transparente et peu contraignante pour la création d'applications intelligentes.
Plutôt que d'introduire une nouvelle pile distincte à gérer, pgvector permet aux équipes de stocker et d'interroger les données relationnelles et vectorielles en un seul endroit. Cette unification élimine la complexité de la synchronisation de bases de données disparates et permet un cycle de développement plus simple. Les applications d'IA nécessitent souvent de combiner différents types de requêtes comme les filtres structurés, la recherche plein texte et la similarité sémantique, le tout en une seule opération. pgvector prend en charge ce modèle de recherche hybride de manière native en permettant aux développeurs de combiner l'évaluation de la similarité vectorielle avec des filtres et des jointures basés sur le langage SQL. Cela vous permet de rechercher un corpus de documents non seulement par mot-clé, mais aussi par signification sémantique, tout en appliquant des filtres tels que la catégorie de document ou les permissions de l'utilisateur, au sein d'une seule requête SQL.
pgvector est conçu pour être évolutif et performant dans le monde réel. Pour les applications qui doivent fournir des résultats rapides à partir de millions d'enregistrements, pgvector prend en charge la recherche approximative du plus proche voisin (ANN) grâce à la méthode d'indexation IVFFlat. Cela permet des réponses rapides pour les applications sensibles à la latence comme les barres de recherche alimentées par l'IA ou les systèmes de recommandation, tout en maintenant un bon équilibre entre la précision et la vitesse. Pour les équipes développant en Python, pgvector s'intègre facilement dans les bibliothèques client PostgreSQL populaires telles que psycopg2, asyncpg et SQLAlchemy, ce qui facilite son intégration dans vos pipelines de données existants et vos flux de travail de ML.
La polyvalence de pgvector s'avère précieuse dans tous les secteurs d'activité. Les entreprises de commerce électronique s'en servent pour formuler des recommandations personnalisées afin d'augmenter les conversions. Une grande plateforme médiatique l'utilise pour faire remonter à la surface des contenus pertinents, afin de maintenir l'intérêt des utilisateurs. Les équipes du secteur de la santé et des sciences de la vie s'en servent pour accélérer la recherche, la découverte de composés et l'établissement de diagnostics. Dans de nombreuses entreprises technologiques, elle permet une assistance basée sur le LLM et des outils internes plus intelligents.
Ce qui rend pgvector encore plus puissant, c'est son déploiement sur une plate-forme telle que le Cloud d'Akamai. La solution dans le Cloud d'Akamai offre aux équipes l'infrastructure gérée, la montée en charge et l'avantage en termes de performances globales dont elles ont besoin pour les charges de travail de niveau production. Managed PostgreSQL sur Akamai permet aux développeurs de déployer des applications soutenues par pgvector sans se soucier des frais généraux d'exploitation. Grâce aux sauvegardes automatisées, à la sécurité intégrée et aux options de montée en charge automatique, votre pile reste résiliente pendant que votre équipe se concentre sur la construction. Et comme l'infrastructure de calcul et de réseau d'Akamai est optimisée pour une diffusion mondiale, les applications qui s'appuient sur des moteurs d'inférence rapide ou de recommandation en temps réel bénéficient d'une latence réduite et d'une plus grande fiabilité à grande échelle.
Si vous utilisez déjà PostgreSQL ou si vous recherchez un moteur de recherche vectoriel prêt pour l'IA qui ne nécessite pas une refonte complète de la pile, je vous expliquerai comment démarrer avec pgvector dans la section suivante.
Premiers pas avec pgvector sur Akamai
- Provisionnez un cluster PostgreSQL à l'aide du tableau de bord des bases de données gérées d'Akamai.
- Connectez-vous à Cloud Manager.
- Dans le menu principal, sélectionnez Bases de données.
- Cliquez sur Créer un cluster de bases de données.
- Dans le champ Étiquette du cluster, saisissez une étiquette qui vous permettra d'identifier facilement le cluster sur votre compte. Le libellé doit être alphanumérique et comporter entre 3 et 32 caractères.
- Sélectionnez le moteur de base de données pour votre nouvelle base de données.
- Sélectionnez la région dans laquelle résidera le cluster de base de données.
- Chaque nœud d'un cluster de base de données est construit sur son propre Linode. Dans la section Choisir un plan, sélectionnez le type de linode et le plan que les nœuds utiliseront.
- Cliquez sur Créer un cluster de base de données. Il faut environ 10 à 15 minutes pour approvisionner complètement le cluster. Vous pouvez suivre l'état d'avancement en consultant la page Statut dans la liste des clusters de bases de données.
Note : Vous pouvez également provisionner en utilisant les API.
- Connectez-vous à votre cluster
Pour vous connecter directement à la base de données à partir de la ligne de commande, vous pouvez utiliser l'outil psql. Cet outil est inclus dans la plupart des installations de serveurs PostgreSQL, mais vous pouvez également l'installer séparément sur la plupart des systèmes d'exploitation.
Utilisez la commande psql ci-dessous pour vous connecter à votre base de données, en remplaçant[host]
et[username]
avec les valeurs correspondantes dans la section des détails de connexion.psql --host=[host] --username=[username] --password --dbname=postgres
- Installer une extension
Pour installer l'une des extensions disponibles sur votre base de données, utilisez la commande CREATE EXTENSION, en remplaçant [nom_de_l'extension] par le nom de l'extension que vous souhaitez installer. Dans ce cas, l'extension estvector
.CREATE EXTENSION vector;
- Définir les colonnes du vecteur
Après avoir installé l'extension vectorielle, vous avez accès à un nouveau type de données appelé vecteur. La taille du vecteur (indiquée entre parenthèses) représente le nombre de dimensions stockées dans ce vecteur. Pour cet exemple, nous utiliserons 13, mais pour un cas d'utilisation réel, ce nombre serait de l'ordre de plusieurs milliers.CREATE TABLE items ( id serial PRIMARY KEY, description text, embedding vector(13) );
- Insérez les embeddings de votre modèle ML (comme L'équipe d'OpenAI ou Visage étreint). Pour recueillir des exemples d'encastrements, vous pouvez utiliser le script Python ci-dessous, qui a été adapté à partir de la démo Hugging Face. Vous devrez obtenir un jeton Hugging Face pour que cet exemple fonctionne.
import requests
import psycopg2
import os
# Hugging Face Configuration
model_id = "sentence-transformers/all-MiniLM-L6-v2"
hf_token = os.environ.get("HF_TOKEN") # Set an environmental variable called HF_TOKEN with your Hugging Face token
api_url = f"https://router.huggingface.co/hf-inference/models/{model_id}"
headers = {"Authorization": f"Bearer {hf_token}"}
# Database Configuration
db_conn_string = os.environ.get("DB_CONN_STRING") # Replace with your connection string or set an env var
# Source for Embeddings
source_sentence = "How do I get Medicare?"
sentences = [
"How do I get a replacement Medicare card?",
"What is the monthly premium for Medicare Part B?",
"How do I terminate my Medicare Part B (medical insurance)?",
"How do I sign up for Medicare?",
"Can I sign up for Medicare Part B if I am working and have health insurance through an employer?",
"How do I sign up for Medicare Part B if I already have Part A?",
"What are Medicare late enrollment penalties?",
"What is Medicare and who can get it?",
"How can I get help with my Medicare Part A and Part B premiums?",
"What are the different parts of Medicare?",
"Will my Medicare premiums be higher because of my higher income?",
"What is TRICARE ?",
"Should I sign up for Medicare Part B if I have Veterans' Benefits?"
]
# Hugging Face API Query Function
def get_embeddings(source_sentence, sentences):
"""Queries the Hugging Face API to get sentence embeddings."""
try:
response = requests.post(
Api_url,
headers=headers,
json={"inputs": { "source_sentence": source_sentence, "sentences": sentences }, "options": {"wait_for_model": True}}
)
response.raise_for_status() # Raise an exception for bad status codes (4xx or 5xx)
return response.json()
except requests.exceptions.RequestException as e:
print(f"Error querying Hugging Face API: {e}")
return None
# Main Execution
print("Fetching embeddings from Hugging Face...")
embeddings = get_embeddings(source_sentence, sentences)
if embeddings:
print(f"Successfully fetched {len(embeddings)} embeddings.")
conn = None
Try:
# Establish connection to the database
print("Connecting to the PostgreSQL database...")
conn = psycopg2.connect(db_conn_string)
cur = conn.cursor()
print("Connection successful.")
# Insert descriptions and embeddings into the database
print("Inserting data into the 'items' table...")
for description, embedding in zip(sentences, embeddings):
# The pgvector extension expects the vector as a string representation of a list
cur.execute(
"INSERT INTO items (description, embedding) VALUES (%s, %s)",
(description, embeddings)
)
# Commit the transaction to make the changes permanent
conn.commit()
print(f"Successfully inserted {cur.rowcount} records into the database.")
except psycopg2.Error as e:
print(f"Database error: {e}")
if conn:
conn.rollback() # Rollback the transaction on error
Finally:
# Ensure the connection is closed
if conn:
cur.close()
conn.close()
print("Database connection closed.") - Utiliser l'indexation et la recherche de pgvector
Create the index after the table has some data
CREATE INDEX ON items USING ivfflat (embedding vector_cosine_ops);
SELECT *, embedding <-> query_embedding AS similarity FROM items ORDER BY similarity LIMIT 5;
Les bases de données vectorielles aident les équipes à optimiser les performances, à réduire les coûts d'inférence et à offrir des expériences utilisateur plus intelligentes et plus rapides. Des extensions comme pgvector facilitent l'intégration de la recherche sémantique et des requêtes hybrides dans des environnements familiers comme PostgreSQL, sans revoir votre architecture.
Commentaires