Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
Azure Database pour PostgreSQL s’intègre en toute transparence avec les principaux packages d’orchestration de modèle de langage (LLM) tels que LangChain. Cette intégration permet aux développeurs d’utiliser des fonctionnalités d’IA avancées dans leurs applications. LangChain peut simplifier la gestion et l’utilisation des machines virtuelles, des modèles incorporés et des bases de données afin que les applications IA génératives soient plus faciles à développer.
Cet article explique comment utiliser la base de données vectorielle intégrée dans Azure Database pour PostgreSQL pour stocker et gérer des documents dans des collections avec LangChain. Il vous montre également comment créer des index et effectuer des requêtes de recherche vectorielle à l’aide d’algorithmes voisins les plus proches tels que la distance cosinus, la distance L2 (distance euclide) et le produit interne pour localiser des documents proches des vecteurs de requête.
Prise en charge des vecteurs
Vous pouvez utiliser Azure Database pour PostgreSQL pour stocker et interroger efficacement des millions d’incorporations vectorielles dans PostgreSQL. Le service peut vous aider à mettre à l’échelle vos cas d’usage IA de la preuve de concept en production. Il offre ces avantages :
- Fournit une interface SQL familière pour interroger les incorporations de vecteurs et les données relationnelles.
- Augmente
pgvectoravec une recherche de similarité plus rapide et plus précise sur plus de 100 millions de vecteurs à l’aide de l’algorithme d’indexation DiskANN. - Simplifie les opérations en intégrant des métadonnées relationnelles, des incorporations de vecteurs et des données de série chronologique dans une base de données unique.
- Utilise la puissance de l’écosystème PostgreSQL robuste et de la plateforme cloud Azure pour les fonctionnalités de niveau entreprise, notamment la réplication et la haute disponibilité.
Authentification
Azure Database pour PostgreSQL prend en charge l’authentification basée sur un mot de passe et Microsoft Entra (anciennement Azure Active Directory).
L’authentification Microsoft Entra vous permet d’utiliser l’ID Microsoft Entra pour vous authentifier auprès de votre serveur PostgreSQL. Microsoft Entra ID élimine la nécessité de gérer des noms d’utilisateur et des mots de passe distincts pour vos utilisateurs de base de données. Il vous permet d’utiliser les mêmes mécanismes de sécurité que ceux que vous utilisez pour d’autres services Azure.
Dans cet article, vous pouvez utiliser l’une ou l’autre méthode d’authentification.
Configuration
Azure Database pour PostgreSQL utilise LangChain Postgres en support open source pour se connecter à Azure Database pour PostgreSQL. Tout d’abord, téléchargez le package partenaire :
%pip install -qU langchain-azure-postgresql
%pip install -qU langchain-openai
%pip install -qU azure-identity
Activer pgvector sur Azure Database pour PostgreSQL
Consultez Activer et utiliser pgvector dans Azure Database pour PostgreSQL.
Configurer les informations d’identification
Vous devez obtenir les détails de connexion de votre base de données Azure pour PostgreSQL et les ajouter en tant que variables d’environnement.
Définissez l’indicateur USE_ENTRA_AUTH sur True si vous souhaitez utiliser l’authentification Microsoft Entra. Si vous utilisez l’authentification Microsoft Entra, vous devez fournir les seuls noms d’hôte et de base de données. Si vous utilisez l’authentification par mot de passe, vous devez également définir le nom d’utilisateur et le mot de passe.
import getpass
import os
USE_ENTRA_AUTH = True
# Supply the connection details for the database
os.environ["DBHOST"] = "<server-name>"
os.environ["DBNAME"] = "<database-name>"
os.environ["SSLMODE"] = "require"
if not USE_ENTRA_AUTH:
# If you're using a username and password, supply them here
os.environ["DBUSER"] = "<username>"
os.environ["DBPASSWORD"] = getpass.getpass("Database Password:")
Configurer des incorporations Azure OpenAI
os.environ["AZURE_OPENAI_ENDPOINT"] = "<azure-openai-endpoint>"
os.environ["AZURE_OPENAI_API_KEY"] = getpass.getpass("Azure OpenAI API Key:")
AZURE_OPENAI_ENDPOINT = os.environ["AZURE_OPENAI_ENDPOINT"]
AZURE_OPENAI_API_KEY = os.environ["AZURE_OPENAI_API_KEY"]
from langchain_openai import AzureOpenAIEmbeddings
embeddings = AzureOpenAIEmbeddings(
model="text-embedding-3-small",
api_key=AZURE_OPENAI_API_KEY,
azure_endpoint=AZURE_OPENAI_ENDPOINT,
azure_deployment="text-embedding-3-small",
)
Initialisation
Utiliser l’authentification Microsoft Entra
Les sections suivantes montrent comment configurer LangChain pour utiliser l’authentification Microsoft Entra. La classe AzurePGConnectionPool du package LangChain Azure Postgres récupère des jetons pour le service Azure Database pour PostgreSQL à l’aide du DefaultAzureCredential de la bibliothèque azure.identity.
La connexion peut être passée dans le paramètre connection du magasin de vecteurs LangChain AzurePGVectorStore.
Connexion à Azure
Pour vous connecter à Azure, vérifiez que l’interface de ligne de commande Azure est installée. Exécutez la commande suivante dans votre terminal :
az login
Une fois connecté, le code suivant extrait le jeton :
from langchain_azure_postgresql.common import (
BasicAuth,
AzurePGConnectionPool,
ConnectionInfo,
)
from langchain_azure_postgresql.langchain import AzurePGVectorStore
entra_connection_pool = AzurePGConnectionPool(
azure_conn_info=ConnectionInfo(
host=os.environ["DBHOST"],
dbname=os.environ["DBNAME"]
)
)
Utiliser l’authentification par mot de passe
Si vous n’utilisez pas l’authentification Microsoft Entra, la classe BasicAuth autorise l’utilisation du nom d’utilisateur et du mot de passe :
basic_auth_connection_pool = AzurePGConnectionPool(
azure_conn_info=ConnectionInfo(
host=os.environ["DBHOST"],
dbname=os.environ["DBNAME"],
credentials=BasicAuth(
username=os.environ["DBUSER"],
password=os.environ["DBPASSWORD"],
)
)
)
Créer le magasin de vecteurs
from langchain_core.documents import Document
from langchain_azure_postgresql.langchain import AzurePGVectorStore
collection_name = "my_docs"
# The connection is either using Entra ID or Basic Auth
connection = entra_connection_pool if USE_ENTRA_AUTH else basic_auth_connection_pool
vector_store = AzurePGVectorStore(
embeddings=embeddings,
table_name=table_name,
connection=connection,
)
Gestion du magasin vectoriel
Ajouter des éléments au magasin de vecteurs
L’ajout de documents par ID remplace tous les documents existants qui correspondent à cet ID.
docs = [
Document(
page_content="there are cats in the pond",
metadata={"doc_id": 1, "location": "pond", "topic": "animals"},
),
Document(
page_content="ducks are also found in the pond",
metadata={"doc_id": 2, "location": "pond", "topic": "animals"},
),
Document(
page_content="fresh apples are available at the market",
metadata={"doc_id": 3, "location": "market", "topic": "food"},
),
Document(
page_content="the market also sells fresh oranges",
metadata={"doc_id": 4, "location": "market", "topic": "food"},
),
Document(
page_content="the new art exhibit is fascinating",
metadata={"doc_id": 5, "location": "museum", "topic": "art"},
),
Document(
page_content="a sculpture exhibit is also at the museum",
metadata={"doc_id": 6, "location": "museum", "topic": "art"},
),
Document(
page_content="a new coffee shop opened on Main Street",
metadata={"doc_id": 7, "location": "Main Street", "topic": "food"},
),
Document(
page_content="the book club meets at the library",
metadata={"doc_id": 8, "location": "library", "topic": "reading"},
),
Document(
page_content="the library hosts a weekly story time for kids",
metadata={"doc_id": 9, "location": "library", "topic": "reading"},
),
Document(
page_content="a cooking class for beginners is offered at the community center",
metadata={"doc_id": 10, "location": "community center", "topic": "classes"},
),
]
uuids = vector_store.add_documents(docs)
uuids
Mettre à jour les éléments dans le magasin de vecteurs
updated_docs = [
Document(
page_content="Updated - cooking class for beginners is offered at the community center",
metadata={"doc_id": 10, "location": "community center", "topic": "classes"},
id=uuids[-1],
)
]
vector_store.add_documents(docs, ids=[uuids[-1]], on_conflict_update=True)
Afficher les éléments à partir du magasin de vecteurs
vector_store.get_by_ids([str(uuids[-1])])
Supprimer des éléments du magasin de vecteurs
vector_store.delete(ids=[uuids[-1]])
Requêtes au magasin de vecteurs
Après avoir créé votre magasin vectoriel et ajouté les documents pertinents, vous pouvez interroger le magasin vectoriel dans votre chaîne ou agent.
Prise en charge du filtrage
Le magasin de vecteurs prend en charge un ensemble de filtres qui peuvent être appliqués aux champs de métadonnées des documents via le FilterCondition, le OrFilter et le AndFilter dans le package LangChain Azure PostgreSQL :
| Opérateur | Signification/Catégorie |
|---|---|
= |
Égalité (==) |
!= |
Inégalité ( !=) |
< |
Inférieur à (<) |
<= |
Inférieur ou égal (<=) |
> |
Supérieur à (>) |
>= |
Supérieur ou égal (>=) |
in |
Cas particulier (en) |
not in |
Cas particulier (non inclus) |
is null |
Casse spéciale (est null) |
is not null |
Casse spéciale (n’est pas null) |
between |
Casse spéciale (entre) |
not between |
Casse spéciale (pas entre) |
like |
Texte (comme) |
ilike |
Texte (comme, insensible à la casse) |
AND |
Logique (et) |
OR |
Logique (ou) |
Requête directe
Vous pouvez effectuer une recherche de similarité simple comme suit :
from langchain_azure_postgresql import FilterCondition, AndFilter
results = vector_store.similarity_search(
"kitty",
k=10,
filter=FilterCondition(
column="(metadata->>'doc_id')::int",
operator="in",
value=[1, 5, 2, 9],
),
)
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
* there are cats in the pond [{'doc_id': 1, 'topic': 'animals', 'location': 'pond'}]
* ducks are also found in the pond [{'doc_id': 2, 'topic': 'animals', 'location': 'pond'}]
* the new art exhibit is fascinating [{'doc_id': 5, 'topic': 'art', 'location': 'museum'}]
* the library hosts a weekly story time for kids [{'doc_id': 9, 'topic': 'reading', 'location': 'library'}]
Si vous fournissez un dictionnaire avec plusieurs champs, mais aucun opérateur, le niveau supérieur est interprété comme un filtre logique AND :
results = vector_store.similarity_search(
"ducks",
k=10,
filter=AndFilter(
AND=[
FilterCondition(
column="(metadata->>'doc_id')::int",
operator="in",
value=[1, 5, 2, 9],
),
FilterCondition(
column="metadata->>'location'",
operator="in",
value=["pond", "market"],
),
]
),
)
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
* ducks are also found in the pond [{'topic': 'animals', 'doc_id': 2, 'location': 'pond'}]
* there are cats in the pond [{'topic': 'animals', 'doc_id': 1, 'location': 'pond'}]
Si vous souhaitez exécuter une recherche de similarité et recevoir les scores correspondants, vous pouvez exécuter :
results = vector_store.similarity_search_with_score(query="cats", k=1)
for doc, score in results:
print(f"* [SIM={score:3f}] {doc.page_content} [{doc.metadata}]")
* [SIM=0.528338] there are cats in the pond [{'doc_id': 1, 'topic': 'animals', 'location': 'pond'}]
Si vous souhaitez utiliser la recherche par pertinence marginale maximale sur votre magasin de vecteurs :
results = vector_store.max_marginal_relevance_search(
"query about cats",
k=10,
lambda_mult=0.5,
filter=FilterCondition(
column="(metadata->>'doc_id')::int",
operator="in",
value=[1, 2, 5, 9],
),
)
for doc in results:
print(f"* {doc.page_content} [{doc.metadata}]")
* there are cats in the pond [{'doc_id': 1, 'topic': 'animals', 'location': 'pond'}]
* ducks are also found in the pond [{'doc_id': 2, 'topic': 'animals', 'location': 'pond'}]
* the new art exhibit is fascinating [{'doc_id': 5, 'topic': 'art', 'location': 'museum'}]
* the library hosts a weekly story time for kids [{'doc_id': 9, 'topic': 'reading', 'location': 'library'}]
Pour obtenir la liste complète des recherches que vous pouvez exécuter sur un PGVector magasin vectoriel, reportez-vous à la référence d’API.
Transformation en récupérateur
Vous pouvez également transformer le magasin de vecteurs en extracteur pour faciliter l’utilisation dans vos chaînes.
retriever = vector_store.as_retriever(search_type="mmr", search_kwargs={"k": 1})
retriever.invoke("kitty")
[Document(id='9fe8bc1c-9a8e-4f83-b546-9b64527aa79d', metadata={'doc_id': 1, 'topic': 'animals', 'location': 'pond'}, page_content='there are cats in the pond')]
Contenu connexe
- Informations de référence sur LangChain AzurePGVectorStore
- Intégrations d’Azure Database pour PostgreSQL pour les applications IA
- Assistants IA dans Azure Database pour PostgreSQL
- Générer des incorporations vectorielles avec Azure OpenAI dans Azure Database pour PostgreSQL
- IA générative avec Azure Database pour PostgreSQL
- Activer et utiliser pgvector dans Azure Database pour PostgreSQL