مشاركة عبر


استخدام LangChain مع قاعدة بيانات Azure ل PostgreSQL

تتكامل قاعدة بيانات Azure ل PostgreSQL بسلاسة مع حزم تنسيق نموذج اللغة الكبيرة الرائدة (LLM) مثل LangChain. يمكن هذا التكامل المطورين من استخدام قدرات الذكاء الاصطناعي المتقدمة في تطبيقاتهم. يمكن لangChain تبسيط إدارة واستخدام LLMs، وتضمين النماذج، وقواعد البيانات بحيث تكون تطبيقات الذكاء الاصطناعي التوليدية أسهل في التطوير.

توضح هذه المقالة كيفية استخدام قاعدة بيانات المتجهات المتكاملة في قاعدة بيانات Azure ل PostgreSQL لتخزين المستندات وإدارتها في مجموعات باستخدام LangChain. كما يوضح لك كيفية إنشاء مؤشرات وتنفيذ استعلامات بحث المتجهات باستخدام خوارزميات أقرب جارة مثل مسافة التمام ومسافة L2 (مسافة إقليدية) والمنتج الداخلي لتحديد موقع المستندات القريبة من متجهات الاستعلام.

دعم المتجهات

يمكنك استخدام قاعدة بيانات Azure ل PostgreSQL لتخزين ملايين تضمينات المتجهات والاستعلام منها بكفاءة في PostgreSQL. يمكن أن تساعدك الخدمة على توسيع نطاق حالات استخدام الذكاء الاصطناعي من إثبات المفهوم إلى الإنتاج. وتقدم هذه المزايا:

  • يوفر واجهة SQL مألوفة للاستعلام عن تضمينات المتجهات والبيانات الارتباطية.
  • pgvector يعزز من خلال بحث أسرع وأكثر دقة عن التشابه عبر أكثر من 100 مليون متجه باستخدام خوارزمية فهرسة DiskANN.
  • يبسط العمليات من خلال دمج بيانات التعريف الارتباطية وتضمين المتجهات وبيانات السلاسل الزمنية في قاعدة بيانات واحدة.
  • يستخدم قوة النظام البيئي PostgreSQL القوي والنظام الأساسي السحابي Azure للميزات على مستوى المؤسسة، بما في ذلك النسخ المتماثل والتوافر العالي.

المصادقة

تدعم قاعدة بيانات Azure ل PostgreSQL مصادقة Microsoft Entra المستندة إلى كلمة المرور (المعروف سابقا ب Azure Active Directory).

تسمح لك مصادقة Microsoft Entra باستخدام معرف Microsoft Entra للمصادقة على خادم PostgreSQL. يلغي معرف Microsoft Entra الحاجة إلى إدارة أسماء المستخدمين وكلمات المرور المنفصلة لمستخدمي قاعدة البيانات. يسمح لك باستخدام نفس آليات الأمان التي تستخدمها لخدمات Azure الأخرى.

في هذه المقالة، يمكنك استخدام أي من أسلوبي المصادقة.

الإعداد

تستخدم قاعدة بيانات Azure ل PostgreSQL دعم LangChain Postgres مفتوح المصدر للاتصال بقاعدة بيانات Azure ل PostgreSQL. أولا، قم بتنزيل حزمة الشريك:

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

تمكين pgvector على قاعدة بيانات Azure ل PostgreSQL

راجع تمكين واستخدام pgvector في قاعدة بيانات Azure ل PostgreSQL.

إعداد بيانات الاعتماد

تحتاج إلى الحصول على تفاصيل اتصال Azure Database for PostgreSQL وإضافتها كمتغيرات بيئة.

قم بتعيين العلامة USE_ENTRA_AUTH إلى True إذا كنت تريد استخدام مصادقة Microsoft Entra. إذا كنت تستخدم مصادقة Microsoft Entra، فأنت بحاجة إلى توفير أسماء المضيف وقاعدة البيانات الوحيدة. إذا كنت تستخدم مصادقة كلمة المرور، فستحتاج أيضا إلى تعيين اسم المستخدم وكلمة المرور.

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

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

التهيئه

استخدام مصادقة Microsoft Entra

توضح الأقسام التالية كيفية إعداد LangChain لاستخدام مصادقة Microsoft Entra. تسترد الفئة AzurePGConnectionPool في حزمة LangChain Azure Postgres الرموز المميزة لقاعدة بيانات Azure لخدمة PostgreSQL باستخدام DefaultAzureCredential من azure.identity المكتبة.

يمكن تمرير الاتصال إلى connection معلمة AzurePGVectorStore مخزن متجه LangChain.

تسجيل الدخول إلى Azure

لتسجيل الدخول إلى Azure، تأكد من تثبيت Azure CLI . قم بتشغيل الأمر التالي في المحطة الطرفية الخاصة بك:

az login

بعد تسجيل الدخول، تجلب التعليمات البرمجية التالية الرمز المميز:

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

استخدام مصادقة كلمة المرور

إذا كنت لا تستخدم مصادقة Microsoft Entra، فستسمح الفئة BasicAuth باستخدام اسم المستخدم وكلمة المرور:

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

إنشاء مخزن المتجهات

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

إدارة مخزن المتجهات

إضافة عناصر إلى مخزن المتجهات

تؤدي إضافة المستندات حسب المعرف إلى الكتابة فوق أي مستندات موجودة تتطابق مع هذا المعرف.

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

تحديث العناصر في مخزن المتجهات

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)

الاطلاع على العناصر من مخزن المتجهات

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

حذف العناصر من مخزن المتجهات

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

الاستعلامات إلى مخزن المتجهات

بعد إنشاء مخزن المتجهات وإضافة المستندات ذات الصلة، يمكنك الاستعلام عن مخزن المتجهات في السلسلة أو الوكيل.

دعم التصفية

يدعم مخزن البيانات الاتجاهية مجموعة من عوامل التصفية التي يمكن تطبيقها على حقول بيانات التعريف للمستندات عبر FilterCondition، OrFilterوفي AndFilter حزمة LangChain Azure PostgreSQL :

عامل تشغيل المعنى/الفئة
= المساواة (==)
!= عدم المساواة (!=)
< أقل من (<)
<= أقل من أو يساوي (<=)
> أكبر من (>)
>= أكبر من أو يساوي (>=)
in حالة خاصة (في)
not in حالة خاصة (ليس في)
is null غلاف خاص (فارغ)
is not null غلاف خاص (ليس فارغا)
between حالة خاصة (بين)
not between غلاف خاص (ليس بين)
like نص (مثل)
ilike النص (غير حساس لحالة الأحرف مثل)
AND منطقي (و)
OR منطقي (أو)

استعلام مباشر

يمكنك إجراء بحث بسيط عن التشابه كما يلي:

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

إذا قمت بتوفير قاموس مع حقول متعددة ولكن لا توجد عوامل تشغيل، يتم تفسير المستوى الأعلى كعامل تصفية منطقي 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'}]

إذا كنت ترغب في تنفيذ بحث التشابه وتلقي الدرجات المقابلة، يمكنك تشغيل:

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

إذا كنت تريد استخدام البحث الهامشي الأقصى في متجر vectors:

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

للحصول على قائمة كاملة بعمليات البحث التي يمكنك تنفيذها PGVector على مخزن متجهات، راجع مرجع واجهة برمجة التطبيقات.

التحويل إلى مسترد

يمكنك أيضا تحويل مخزن المتجهات إلى مسترد لتسهيل الاستخدام في سلاسلك:

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