Megosztás a következőn keresztül:


A LangChain használata az Azure Database for PostgreSQL-hez

Az Azure Database for PostgreSQL zökkenőmentesen integrálható a vezető nagy nyelvi modell (LLM) vezénylési csomagokkal, például a LangChainnel. Ez az integráció lehetővé teszi a fejlesztők számára, hogy fejlett AI-képességeket használjanak alkalmazásaikban. A LangChain leegyszerűsíti az LLM-k, a beágyazási modellek és az adatbázisok kezelését és használatát, hogy a generatív AI-alkalmazások könnyebben fejleszthetők legyenek.

Ez a cikk bemutatja, hogyan használhatja az integrált vektoradatbázist az Azure Database for PostgreSQL-ben a dokumentumok gyűjteményekben való tárolására és kezelésére a LangChain használatával. Azt is bemutatja, hogyan hozhat létre indexeket, és hogyan hajthat végre vektorkeresési lekérdezéseket a legközelebbi szomszéd algoritmusok, például a koszinusz távolság, az L2 távolság (euklideszi távolság) és a belső termék használatával a lekérdezésvektorokhoz közeli dokumentumok megkereséséhez.

Vektortámogatás

Az Azure Database for PostgreSQL használatával hatékonyan tárolhat és kérdezhet le több millió vektoros beágyazást a PostgreSQL-ben. A szolgáltatás segít a MI esetek skálázásában a koncepció igazolásától az éles környezetig. A következő előnyöket kínálja:

  • Ismerős SQL-felületet biztosít a vektoros beágyazások és a relációs adatok lekérdezéséhez.
  • pgvector Több mint 100 millió vektor gyorsabb és pontosabb hasonlósági keresésével növeli a DiskANN indexelési algoritmusát.
  • Leegyszerűsíti a műveleteket a relációs metaadatok, a vektorbeágyazások és az idősoros adatok egyetlen adatbázisba való integrálásával.
  • A robusztus PostgreSQL-ökoszisztéma és az Azure-felhőplatform erejét használja nagyvállalati szintű funkciókhoz, beleértve a replikációt és a magas rendelkezésre állást.

Hitelesítés

Az Azure Database for PostgreSQL támogatja a jelszóalapú és a Microsoft Entra (korábbi nevén Azure Active Directory) hitelesítést.

A Microsoft Entra-hitelesítés lehetővé teszi, hogy a Microsoft Entra-azonosítóval hitelesítse magát a PostgreSQL-kiszolgálón. A Microsoft Entra ID nem szükséges külön felhasználóneveket és jelszavakat kezelni az adatbázis felhasználói számára. Ez lehetővé teszi, hogy ugyanazokat a biztonsági mechanizmusokat használja, mint más Azure-szolgáltatások esetében.

Ebben a cikkben bármelyik hitelesítési módszert használhatja.

Beállítás

Az Azure Database for PostgreSQL a nyílt forráskódú LangChain Postgres-támogatással csatlakozik az Azure Database for PostgreSQL-hez. Először töltse le a partnercsomagot:

%pip install -qU langchain-azure-postgresql
%pip install -qU langchain-openai
%pip install -qU azure-identity

A pgvector engedélyezése az Azure Database for PostgreSQL-ben

Lásd: A pgvector engedélyezése és használata az Azure Database for PostgreSQL-ben.

Hitelesítő adatok beállítása

Le kell kérnie az Azure Database for PostgreSQL kapcsolati adatait , és környezeti változókként kell hozzáadnia őket.

Állítsa be a USE_ENTRA_AUTH jelzőt, True ha Microsoft Entra-hitelesítést szeretne használni. Ha a Microsoft Entra-hitelesítést használja, csak a gazdagép- és adatbázisneveket kell megadnia. Ha jelszóhitelesítést használ, a felhasználónevet és a jelszót is be kell állítania.

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:")

Azure OpenAI-beágyazások beállítása

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",
)

Inicializálás

Microsoft Entra-hitelesítés használata

Az alábbi szakaszok bemutatják, hogyan állíthatja be a LangChaint a Microsoft Entra-hitelesítés használatára. A LangChain Azure Postgres-csomag osztálya AzurePGConnectionPool a kódtár használatával DefaultAzureCredential lekéri az Azure Database for PostgreSQL szolgáltatás azure.identity jogkivonatait.

A kapcsolat átadható a connection LangChain vektortároló paraméterének AzurePGVectorStore .

Bejelentkezés az Azure-ba

Az Azure-ba való bejelentkezéshez győződjön meg arról, hogy telepítve van az Azure CLI . Futtassa a következő parancsot a terminálon:

az login

A bejelentkezés után a következő kód lekéri a tokent:

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"]
        )
    )

Jelszóhitelesítés használata

Ha nem Microsoft Entra-hitelesítést használ, az BasicAuth osztály engedélyezi a felhasználónév és a jelszó használatát:

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"],
        )
    )
)

A vektortároló létrehozása

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,
)

A vektortároló kezelése

Elemek hozzáadása a vektortárolóhoz

A dokumentumok azonosító szerinti hozzáadása felülírja az adott azonosítónak megfelelő meglévő dokumentumokat.

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

Elemek frissítése a vektortárolóban

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)

Elemek megtekintése a vektortárolóból

vector_store.get_by_ids([str(uuids[-1])])

Elemek törlése a vektortárolóból

vector_store.delete(ids=[uuids[-1]])

Lekérdezések a vektortárolóba

Miután létrehozta a vektortárolót, és hozzáadta a vonatkozó dokumentumokat, lekérdezheti a vektortárolót a láncban vagy az ügynökben.

Szűrési támogatás

A vektortároló olyan szűrőket támogat, amelyek a dokumentumok metaadatmezőire alkalmazhatók a FilterConditionOrFilterAndFilterLangChain Azure PostgreSQL-csomagban:

Operátor Jelentés/kategória
= Egyenlőség (==)
!= Egyenlőtlenség (!=)
< Kevesebb, mint (<)
<= Kisebb vagy egyenlő (<=)
> Nagyobb, mint (>)
>= Nagyobb vagy egyenlő (>=)
in Speciális eset (in)
not in Speciális eset (nincs benne)
is null Speciális kisbetűs (null)
is not null Speciális kisbetűs (nem null)
between Speciálisan kezelve (között)
not between Speciális eset (nem a kettő között)
like Szöveg (tetszik)
ilike Szöveg (nincs különbség kis- és nagybetűk között)
AND Logikai (és)
OR Logikai (vagy)

Közvetlen lekérdezés

Az alábbiak szerint végezhet egyszerű hasonlósági keresést:

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'}]

Ha több mezőt tartalmazó szótárat ad meg, de operátorok nélkül, a felső szint logikai AND szűrőként lesz értelmezve:

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'}]

Ha hasonlósági keresést szeretne végrehajtani, és megkapja a megfelelő pontszámokat, futtassa a következőt:

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'}]

Ha a maximális marginális relevancia-keresést szeretné használni a vektortárolóban:

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'}]

A vektortárolóban PGVector végrehajtható keresések teljes listájáért tekintse meg az API-hivatkozást.

Átalakítás visszakeresővé

A láncok egyszerűbb használata érdekében a vektortárolót egy lekérővé is átalakíthatja:

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')]