Aracılığıyla paylaş


PostgreSQL için Azure Veritabanı ile LangChain kullanma

PostgreSQL için Azure Veritabanı , LangChain gibi önde gelen büyük dil modeli (LLM) düzenleme paketleriyle sorunsuz bir şekilde tümleştirilir. Bu tümleştirme, geliştiricilerin uygulamalarında gelişmiş yapay zeka özelliklerini kullanmasına olanak tanır. LangChain, LLM'lerin, ekleme modellerinin ve veritabanlarının yönetimini ve kullanımını kolaylaştırarak üretken yapay zeka uygulamalarının geliştirilmesini kolaylaştırabilir.

Bu makalede, Belgeleri LangChain ile koleksiyonlarda depolamak ve yönetmek için PostgreSQL için Azure Veritabanı'ndaki tümleşik vektör veritabanının nasıl kullanılacağı gösterilmektedir. Ayrıca, sorgu vektörlerine yakın belgeleri bulmak için kosinüs uzaklığı, L2 uzaklığı (Öklid uzaklığı) ve iç ürün gibi en yakın komşu algoritmaları kullanarak dizin oluşturmayı ve vektör arama sorguları gerçekleştirmeyi de gösterir.

Vektör desteği

PostgreSQL için Azure Veritabanı'nı kullanarak PostgreSQL'de milyonlarca vektör eklemesini verimli bir şekilde depolayabilir ve sorgulayabilirsiniz. Hizmet, yapay zeka kullanım örneklerinizi kavram kanıtından üretime ölçeklendirmenize yardımcı olabilir. Şu avantajları sunar:

  • Vektör eklemeleri ve ilişkisel verileri sorgulamak için tanıdık bir SQL arabirimi sağlar.
  • pgvector DiskANN dizinleme algoritmasını kullanarak 100 milyondan fazla vektörde daha hızlı ve daha hassas bir benzerlik araması ile artar.
  • İlişkisel meta verileri, vektör eklemeleri ve zaman serisi verilerini tek bir veritabanına tümleştirerek işlemleri basitleştirir.
  • Çoğaltma ve yüksek kullanılabilirlik gibi kurumsal sınıf özellikler için güçlü PostgreSQL ekosisteminin ve Azure bulut platformunun gücünü kullanır.

Kimlik doğrulama

PostgreSQL için Azure Veritabanı, parola tabanlı ve Microsoft Entra (eski adıyla Azure Active Directory) kimlik doğrulamasını destekler.

Microsoft Entra kimlik doğrulaması, PostgreSQL sunucunuzda kimlik doğrulaması yapmak için Microsoft Entra Id kullanmanıza olanak tanır. Microsoft Entra Id, veritabanı kullanıcılarınız için ayrı kullanıcı adlarını ve parolaları yönetme gereksinimini ortadan kaldırır. Diğer Azure hizmetleri için kullandığınız güvenlik mekanizmalarının aynısını kullanmanıza olanak tanır.

Bu makalede, herhangi bir kimlik doğrulama yöntemini kullanabilirsiniz.

Kurulum

PostgreSQL için Azure Veritabanı, PostgreSQL için Azure Veritabanı'na bağlanmak için açık kaynak LangChain Postgres desteğini kullanır. İlk olarak iş ortağı paketini indirin:

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

PostgreSQL için Azure Veritabanı'nda pgvector'ı etkinleştirme

Bkz . PostgreSQL için Azure Veritabanı'nda pgvector'ı etkinleştirme ve kullanma.

Kimlik bilgilerini ayarlama

PostgreSQL için Azure Veritabanı bağlantı ayrıntılarınızı almanız ve bunları ortam değişkenleri olarak eklemeniz gerekir.

USE_ENTRA_AUTH bayrağını True olarak ayarlayın eğer Microsoft Entra kimlik doğrulamasını kullanmak istiyorsanız. Microsoft Entra kimlik doğrulamasını kullanıyorsanız, tek konak ve veritabanı adlarını sağlamanız gerekir. Parola kimlik doğrulaması kullanıyorsanız kullanıcı adı ve parolayı da ayarlamanız gerekir.

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 eklemelerini ayarlama

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

Başlatma İşlemi

Microsoft Entra doğrulamasını kullanın

Aşağıdaki bölümlerde LangChain'in Microsoft Entra kimlik doğrulamasını kullanacak şekilde nasıl ayarlanacağı gösterilmektedir. LangChain Azure Postgres paketindeki sınıfAzurePGConnectionPool, kitaplıktan DefaultAzureCredential kullanarak azure.identity PostgreSQL için Azure Veritabanı hizmeti için belirteçleri alır.

Bağlantı, LangChain vektör deposunun parametresine connection geçirilebilirAzurePGVectorStore.

Azure'a Giriş Yap

Azure'da oturum açmak için Azure CLI'nın yüklü olduğundan emin olun. Terminalinizde aşağıdaki komutu çalıştırın:

az login

Oturum açtığınızda aşağıdaki kod belirteci getirir:

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

Parola kimlik doğrulamasını kullanma

Microsoft Entra kimlik doğrulamasını BasicAuth kullanmıyorsanız, sınıfı kullanıcı adı ve parola kullanımına izin verir:

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

Vektör deposu oluşturma

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

Vektör deposunun yönetimi

Vektör deposuna öğe ekleme

Kimlik ile belge eklemek, o kimlikle eşleşen mevcut belgelerin üzerine yazar.

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

Vektör deposundaki öğeleri güncelleştirme

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)

Vektör deposundaki öğeleri görme

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

Öğeleri vektör deposundan silme

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

Vektör deposuna sorgulamalar

Vektör deponuzu oluşturduktan ve ilgili belgeleri ekledikten sonra, zincirinizdeki veya aracınızdaki vektör deposunu sorgulayabilirsiniz.

Filtreleme desteği

Vektör deposu, , FilterConditionve OrFilterAndFilter paketindeki belgelerin meta veri alanlarına uygulanabilecek bir dizi filtreyi destekler:

Operatör Anlam/Kategori
= Eşitlik (==)
!= Eşitsizlik (!=)
< (<)'dan az
<= Küçük veya eşit (<=)
> Büyüktür (>)
>= Büyüktür veya eşittir (>=)
in Özel durumlu (içinde)
not in Özel durumlu (içinde değil)
is null Özel durumlu (null)
is not null Özel durumlu (null değil)
between Özel işleme tabi (arasında)
not between Özel durumlu (arasında değil)
like Metin (örneğin)
ilike Metin (büyük/küçük harfe duyarsız gibi)
AND Mantıksal (ve)
OR Mantıksal (veya)

Doğrudan sorgu

Aşağıdaki gibi basit bir benzerlik araması yapabilirsiniz:

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

Birden çok alan içeren ancak işleç içermeyen bir sözlük sağlarsanız, en üst düzey mantıksal AND filtre olarak yorumlanır:

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

Benzerlik araması yapmak ve ilgili puanları almak istiyorsanız şunları çalıştırabilirsiniz:

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

Vektör deponuzda en fazla marjinal ilgi aramasını kullanmak istiyorsanız:

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

Vektör deposunda yürütebileceğiniz PGVector aramaların tam listesi için API başvurusuna bakın.

Bir retriever'a dönüştürme

Zincirlerinizde daha kolay kullanım için vektör deponuzu bir retriever'a da dönüştürebilirsiniz:

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