Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Azure Database for PostgreSQL se bezproblémově integruje s předními balíčky orchestrace velkých jazykových modelů (LLM), jako je LangChain. Tato integrace umožňuje vývojářům používat pokročilé funkce AI ve svých aplikacích. LangChain může zjednodušit správu a používání LLM, modelů vkládání a databází, aby bylo snazší vyvíjet generativní aplikace AI.
V tomto článku se dozvíte, jak pomocí integrované vektorové databáze ve službě Azure Database for PostgreSQL ukládat a spravovat dokumenty v kolekcích pomocí jazyka LangChain. Také ukazuje, jak vytvořit indexy a provádět vektorové vyhledávací dotazy pomocí algoritmů nejbližšího souseda, jako je kosinus, vzdálenost L2 (euklidská vzdálenost) a vnitřní produkt k vyhledání dokumentů blízko vektorů dotazu.
Podpora vektorů
Azure Database for PostgreSQL můžete použít k efektivnímu ukládání a dotazování milionů vektorových vkládání do PostgreSQL. Služba vám může pomoct škálovat případy použití AI od testování konceptu do produkčního prostředí. Nabízí tyto výhody:
- Poskytuje známé rozhraní SQL pro dotazování vektorových vkládání a relačních dat.
- Zvyšuje
pgvectorpomocí rychlejšího a přesnějšího vyhledávání podobnosti ve více než 100 milionech vektorů za použití algoritmu indexování DiskANN. - Zjednodušuje operace integrací relačních metadat, vektorových vkládání a dat časových řad do izolované databáze.
- Využívá sílu robustního ekosystému PostgreSQL a cloudové platformy Azure pro funkce na podnikové úrovni, včetně replikace a vysoké dostupnosti.
Autentizace
Azure Database for PostgreSQL podporuje ověřování založené na heslech a Microsoft Entra (dříve Azure Active Directory).
Ověřování Microsoft Entra umožňuje použít ID Microsoft Entra k ověření na vašem serveru PostgreSQL. Microsoft Entra ID eliminuje potřebu spravovat samostatná uživatelská jména a hesla pro uživatele databáze. Umožňuje používat stejné mechanismy zabezpečení, které používáte pro jiné služby Azure.
V tomto článku můžete použít některou metodu ověřování.
Nastavení
Azure Database for PostgreSQL používá pro připojení ke službě Azure Database for PostgreSQL open source podporu LangChain Postgres . Nejprve stáhněte balíček partnera:
%pip install -qU langchain-azure-postgresql
%pip install -qU langchain-openai
%pip install -qU azure-identity
Povolení nástroje pgvector ve službě Azure Database for PostgreSQL
Viz Povolení a použití nástroje pgvector ve službě Azure Database for PostgreSQL.
Nastavení přihlašovacích údajů
Potřebujete získat podrobnosti o připojení ke službě Azure Database for PostgreSQL a přidat je jako proměnné prostředí.
Nastavte USE_ENTRA_AUTH příznak na True, pokud chcete použít ověřování Microsoft Entra. Pokud používáte ověřování Microsoft Entra, musíte zadat pouze názvy hostitelů a databází. Pokud používáte ověřování heslem, musíte také nastavit uživatelské jméno a heslo.
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:")
Nastavení embeddingů 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",
)
Inicializace
Použijte autentizaci Microsoft Entra
Následující části ukazují, jak nastavit JazykChain pro použití ověřování Microsoft Entra. Třída AzurePGConnectionPool v balíčku LangChain Azure Postgres načítá tokeny pro službu Azure Database for PostgreSQL pomocí DefaultAzureCredential knihovny azure.identity .
Připojení lze předat do connection parametru úložiště vektorů AzurePGVectorStore LangChain.
Přihlásit se do Azure
Pokud se chcete přihlásit k Azure, ujistěte se, že máte nainstalované Rozhraní příkazového řádku Azure. V terminálu spusťte následující příkaz:
az login
Po přihlášení následující kód načte 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"]
)
)
Použití ověřování heslem
Pokud nepoužíváte ověřování Microsoft Entra, BasicAuth třída umožňuje používat uživatelské jméno a heslo:
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"],
)
)
)
Vytvoření úložiště vektorů
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,
)
Správa úložiště vektorů
Přidání položek do úložiště vektorů
Přidání dokumentů podle ID přepíše všechny existující dokumenty, které odpovídají danému 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
Aktualizace položek v úložišti vektorů
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)
Zobrazení položek z úložiště vektorů
vector_store.get_by_ids([str(uuids[-1])])
Odstranění položek z úložiště vektorů
vector_store.delete(ids=[uuids[-1]])
Dotazy do úložiště vektorů
Po vytvoření vektorového úložiště a přidání příslušných dokumentů můžete dotazovat úložiště vektorů ve vašem řetězci nebo agentu.
Podpora filtrování
Úložiště vektorů podporuje sadu filtrů, které lze použít pro pole metadat dokumentů prostřednictvím FilterConditiona OrFilterAndFilter v balíčku LangChain Azure PostgreSQL:
| Operátor | Význam/kategorie |
|---|---|
= |
Rovnost (==) |
!= |
Nerovnost (!=) |
< |
Menší než (<) |
<= |
Menší než nebo rovno (<=) |
> |
Větší než (>) |
>= |
Větší než nebo rovno (>=) |
in |
Speciální případy použití (v) |
not in |
Speciální případ (není v) |
is null |
Speciální velká a malá písmena (má hodnotu null) |
is not null |
Speciální velká a malá písmena (není null) |
between |
Speciální úprava zápisu (mezi) |
not between |
Speciální velká písmena (ne mezi) |
like |
Text (jako) |
ilike |
Text (bez rozlišování malých a velkých písmen) |
AND |
Logické (a) |
OR |
Logické (nebo) |
Přímý dotaz
Jednoduché vyhledávání podobnosti můžete provést následujícím způsobem:
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'}]
Pokud zadáte slovník s více poli, ale žádné operátory, nejvyšší úroveň se interpretuje jako logický AND filtr:
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'}]
Pokud chcete provést vyhledávání podobnosti a přijmout odpovídající skóre, můžete spustit:
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'}]
Pokud chcete použít hledání maximální mezní relevance ve vašem vektorovém úložišti:
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'}]
Úplný seznam hledání, které můžete spustit v PGVector úložišti vektorů, najdete v referenčních informacích k rozhraní API.
Transformace na retriever
Vektorové úložiště můžete také transformovat na retriever pro snadnější použití v řetězech:
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')]
Související obsah
- Referenční informace k jazyku LangChain AzurePGVectorStore
- Integrace Azure Database for PostgreSQL pro aplikace AI
- Agenti AI ve službě Azure Database for PostgreSQL
- Generování vektorových vkládání pomocí Azure OpenAI ve službě Azure Database for PostgreSQL
- Generování umělé inteligence s využitím Azure Database for PostgreSQL
- Povolení a použití nástroje pgvector ve službě Azure Database for PostgreSQL