Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O Banco de Dados do Azure para PostgreSQL integra-se perfeitamente com os principais pacotes de orquestração LLM (modelos de linguagem de grande escala), como LangChain. Essa integração permite que os desenvolvedores usem recursos avançados de IA em seus aplicativos. O LangChain pode simplificar o gerenciamento e o uso de LLMs, modelos de inserção e bancos de dados para que aplicativos de IA geradores sejam mais fáceis de desenvolver.
Este artigo mostra como usar o banco de dados vetor integrado no Banco de Dados do Azure para PostgreSQL para armazenar e gerenciar documentos em coleções com LangChain. Ele também mostra como criar índices e executar consultas de pesquisa de vetor usando algoritmos vizinhos mais próximos, como distância de cosseno, distância L2 (distância euclidiana) e produto interno para localizar documentos próximos aos vetores de consulta.
Suporte ao vetor
Você pode usar o Banco de Dados do Azure para PostgreSQL para armazenar e consultar com eficiência milhões de inserções de vetor no PostgreSQL. O serviço pode ajudá-lo a dimensionar os casos de uso de IA da prova de conceito para a produção. Ele oferece estes benefícios:
- Fornece uma interface SQL familiar para consultar inserções de vetor e dados relacionais.
- Impulsiona
pgvectorcom uma pesquisa de similaridade mais rápida e precisa em mais de 100 milhões de vetores por meio do uso do algoritmo de indexação DiskANN. - Simplifica as operações integrando metadados relacionais, inserções de vetor e dados de série temporal em um único banco de dados.
- Usa o poder do ecossistema robusto do PostgreSQL e da plataforma de nuvem do Azure para recursos de nível empresarial, incluindo replicação e alta disponibilidade.
Autenticação
O Banco de Dados do Azure para PostgreSQL dá suporte à autenticação baseada em senha e ao Microsoft Entra (antigo Azure Active Directory).
A autenticação do Microsoft Entra permite que você use a ID do Microsoft Entra para autenticar no servidor PostgreSQL. A ID do Microsoft Entra elimina a necessidade de gerenciar nomes de usuário e senhas separados para os usuários do banco de dados. Ele permite que você use os mesmos mecanismos de segurança que você usa para outros serviços do Azure.
Neste artigo, você pode usar qualquer um dos métodos de autenticação.
Configuração
O Banco de Dados do Azure para PostgreSQL usa o suporte do LangChain Postgres de software livre para se conectar ao Banco de Dados do Azure para PostgreSQL. Primeiro, baixe o pacote de parceiros:
%pip install -qU langchain-azure-postgresql
%pip install -qU langchain-openai
%pip install -qU azure-identity
Habilitar pgvector no Banco de Dados do Azure para PostgreSQL
Consulte Habilitar e usar pgvector no Banco de Dados do Azure para PostgreSQL.
Configurar credenciais
Você precisa obter os detalhes da conexão do Banco de Dados do Azure para PostgreSQL e adicioná-los como variáveis de ambiente.
Defina o USE_ENTRA_AUTH sinalizador para True se você quiser usar a autenticação do Microsoft Entra. Se você estiver usando a autenticação do Microsoft Entra, precisará fornecer os únicos nomes de host e banco de dados. Se você estiver usando a autenticação de senha, também precisará definir o nome de usuário e a senha.
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:")
Configurar inserções do 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",
)
Inicialização
Use a autenticação do Microsoft Entra
As seções a seguir demonstram como configurar o LangChain para usar a autenticação do Microsoft Entra. A classe AzurePGConnectionPool no pacote LangChain Azure Postgres recupera tokens para o serviço Banco de Dados do Azure para PostgreSQL usando DefaultAzureCredential da biblioteca azure.identity.
A conexão pode ser passada para o parâmetro connection do repositório vetorial AzurePGVectorStore do LangChain.
Entrar no Azure
Para entrar no Azure, verifique se você tem a CLI do Azure instalada. Execute o seguinte comando em seu terminal:
az login
Depois de entrar, o código a seguir busca o 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"]
)
)
Usar autenticação de senha
Se você não estiver usando a autenticação do Microsoft Entra, a classe BasicAuth permite o uso de nome de usuário e senha:
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"],
)
)
)
Criar o repositório de vetores
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,
)
Gerenciamento do repositório de vetores
Adicionar itens ao repositório de vetores
A adição de documentos por ID substitui todos os documentos existentes que correspondam a essa 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
Atualizar itens no repositório de vetores
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)
Confira itens do repositório vetorial
vector_store.get_by_ids([str(uuids[-1])])
Excluir itens do repositório de vetores
vector_store.delete(ids=[uuids[-1]])
Consultas ao repositório de vetores
Depois de criar seu repositório de vetores e adicionar os documentos relevantes, você pode consultar o repositório de vetores em sua cadeia ou agente.
Suporte à filtragem
O repositório vetorial dá suporte a um conjunto de filtros que podem ser aplicados aos campos de metadados dos documentos por meio do FilterCondition, OrFilter e AndFilter no pacote LangChain Azure PostgreSQL:
| Operador | Significado/Categoria |
|---|---|
= |
Igualdade (==) |
!= |
Desigualdade (!=) |
< |
Menor que (<) |
<= |
Menor ou igual a (<=) |
> |
Maior que (>) |
>= |
Maior ou igual a (>=) |
in |
Caso especial (in) |
not in |
Caso especial (not in) |
is null |
Caso especial (é nulo) |
is not null |
Caso especial (não é nulo) |
between |
Caso especial (between) |
not between |
Caso especial (não está entre) |
like |
Texto (como) |
ilike |
Texto (sem diferenciar maiúsculas de minúsculas como) |
AND |
Lógico (e) |
OR |
Lógico (ou) |
Consulta direta
Você pode executar uma pesquisa de similaridade simples da seguinte maneira:
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'}]
Se você fornecer um dicionário com vários campos, mas sem operadores, o nível superior será interpretado como um 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'}]
Se você quiser executar uma pesquisa de similaridade e receber as pontuações correspondentes, poderá executar:
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'}]
Se você quiser usar a pesquisa de relevância marginal máxima no seu repositório de vetores:
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 obter uma lista completa das pesquisas que você pode executar em um PGVector repositório de vetores, consulte a referência de API.
Transformação em um recuperador
Você também pode transformar o repositório de vetores em um recuperador para facilitar o uso em suas cadeias:
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')]
Conteúdo relacionado
- Referência do LangChain AzurePGVectorStore
- Integrações do Banco de Dados do Azure para PostgreSQL para aplicativos de IA
- Agentes de IA no Banco de Dados do Azure para PostgreSQL
- Gerar inserções de vetor com o Azure OpenAI no Banco de Dados do Azure para PostgreSQL
- IA generativa com o Banco de Dados do Azure para PostgreSQL
- Habilitar e usar pgvector no Banco de Dados do Azure para PostgreSQL