Sdílet prostřednictvím


Použití jazyka LangChain se službou Azure Database for PostgreSQL

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 pgvector pomocí 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')]