Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Azure Database for PostgreSQL se integra perfectamente con paquetes de orquestación de modelos de lenguaje grande (LLM), como LangChain. Esta integración permite a los desarrolladores usar funcionalidades avanzadas de inteligencia artificial en sus aplicaciones. LangChain puede simplificar la administración y el uso de modelos de lenguaje grandes, insertar modelos y bases de datos, lo que facilita aún más el desarrollo de aplicaciones de IA generativa.
En este artículo se muestra cómo usar la base de datos vectorial integrada en Azure Database for PostgreSQL para almacenar y administrar documentos en colecciones con LangChain. También se muestra cómo crear índices y realizar consultas de búsqueda vectorial mediante algoritmos vecinos más cercanos, como la distancia coseno, la distancia L2 (distancia euclidiana) y el producto interno para localizar documentos cerca de los vectores de consulta.
Compatibilidad con vectores
Puede usar Azure Database for PostgreSQL para almacenar y consultar de forma eficaz millones de incrustaciones de vectores en PostgreSQL. El servicio puede ayudarle a escalar sus casos de uso de IA desde la prueba de concepto hasta su producción. Ofrece estas ventajas:
- Proporciona una interfaz SQL conocida para consultar incrustaciones de vectores y datos relacionales.
- Mejora
pgvectormediante una búsqueda de similitud más rápida y precisa en más de 100 millones de vectores utilizando el algoritmo de indexación DiskANN. - Simplifica las operaciones mediante la integración de metadatos relacionales, incrustaciones de vectores y datos de serie temporal en una base de datos única.
- Usa la eficacia del sólido ecosistema de PostgreSQL y la plataforma en la nube de Azure para las características de nivel empresarial, incluida la replicación y la alta disponibilidad.
Autenticación
Azure Database for PostgreSQL admite la autenticación basada en contraseña y Microsoft Entra (anteriormente Azure Active Directory).
La autenticación de Microsoft Entra permite usar microsoft Entra ID para autenticarse en el servidor postgreSQL. Microsoft Entra ID elimina la necesidad de administrar nombres de usuario y contraseña independientes para los usuarios de la base de datos. Permite usar los mismos mecanismos de seguridad que se usan para otros servicios de Azure.
En este artículo, puede usar cualquiera de los métodos de autenticación.
Configuración
Azure Database for PostgreSQL usa la compatibilidad de LangChain Postgres de código abierto para conectarse a Azure Database for PostgreSQL. En primer lugar, descargue el paquete del asociado:
%pip install -qU langchain-azure-postgresql
%pip install -qU langchain-openai
%pip install -qU azure-identity
Habilitación de pgvector en Azure Database for PostgreSQL
Consulte Habilitación y uso de pgvector en Azure Database for PostgreSQL.
Configuración de credenciales
Debe obtener los detalles de conexión de Azure Database for PostgreSQL y agregarlos como variables de entorno.
Establezca el indicador USE_ENTRA_AUTH en True si desea usar autenticación de Microsoft Entra. Si usa la autenticación de Microsoft Entra, debe proporcionar los únicos nombres de host y base de datos. Si usa la autenticación de contraseña, también debe establecer el nombre de usuario y la contraseña.
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:")
Configuración de incrustaciones de 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",
)
Inicialización
Uso de la autenticación de Microsoft Entra
En las siguientes secciones se muestra cómo configurar LangChain para usar la autenticación de Microsoft Entra. La clase AzurePGConnectionPool del paquete LangChain de Azure Postgres recupera tokens para el servicio Azure Database for PostgreSQL mediante DefaultAzureCredential desde la biblioteca azure.identity.
La conexión se puede pasar al parámetro connection del almacén de vectores LangChain AzurePGVectorStore.
Inicio de sesión en Azure
Para iniciar sesión en Azure, asegúrese de que tiene instalada la CLI de Azure . Ejecute el siguiente comando en el terminal:
az login
Después de iniciar sesión, el código siguiente captura el token:
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"]
)
)
Uso de la autenticación de contraseña
Si no usa la autenticación de Microsoft Entra, la clase BasicAuth permite el uso de nombre de usuario y contraseña:
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"],
)
)
)
Creación del almacén de vectores
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,
)
Administración del almacén de vectores
Agregar elementos al almacén de vectores
Al agregar documentos por identificador, se sobrescriben los documentos existentes que coincidan con ese identificador.
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
Actualizar elementos en el almacén vectorial
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)
Ver elementos del almacén de vectores
vector_store.get_by_ids([str(uuids[-1])])
Eliminar elementos del almacén de vectores
vector_store.delete(ids=[uuids[-1]])
Consultas al almacén de vectores
Después de crear tu almacén de vectores y añadir los documentos pertinentes, puedes realizar consultas al almacén de vectores en tu cadena o agente.
Compatibilidad con el filtrado
El almacén de vectores admite un conjunto de filtros que se pueden aplicar a los campos de metadatos de los documentos a través de FilterCondition, OrFilter y AndFilter en el paquete de LangChain Azure PostgreSQL:
| Operator | Significado/Categoría |
|---|---|
= |
Igualdad (==) |
!= |
Desigualdad (!=) |
< |
Menor que (<) |
<= |
Menor o igual que (<=) |
> |
Mayor que (>) |
>= |
Mayor o igual que (>=) |
in |
Cased especial (en) |
not in |
Cased especial (no en) |
is null |
Mayúsculas y minúsculas especiales (es null) |
is not null |
Mayúsculas y minúsculas especiales (no es null) |
between |
Cased especial (entre) |
not between |
Mayúsculas y minúsculas especiales (no entre) |
like |
Texto (como) |
ilike |
Texto (sin distinción entre mayúsculas y minúsculas, como) |
AND |
Lógico (y) |
OR |
Lógico (o) |
Consulta directa
Puede realizar una búsqueda de similitud simple de la siguiente manera:
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 proporciona un diccionario con varios campos pero no operadores, el nivel superior se interpreta como un filtro lógico 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 desea ejecutar una búsqueda de similitud y recibir las puntuaciones correspondientes, puede ejecutar:
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 desea utilizar la búsqueda de relevancia marginal máxima en su almacén de vectores:
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'}]
Para obtener una lista completa de las búsquedas que puede ejecutar en un PGVector almacén de vectores, consulte la referencia de API.
Transformación en un sistema de recuperación
También puede transformar el almacén de vectores en un recuperador para facilitar el uso en las cadenas:
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')]
Contenido relacionado
- Referencia de LangChain AzurePGVectorStore
- Integraciones de Azure Database for PostgreSQL para aplicaciones de IA
- Agentes de IA en Azure Database for PostgreSQL
- Generación de incrustaciones de vectores con Azure OpenAI en Azure Database for PostgreSQL
- Inteligencia artificial generativa con Azure Database for PostgreSQL
- Habilitación y uso de pgvector en Azure Database for PostgreSQL