すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:Python 3

最終更新日:Sep 24, 2024

AnalyticDB for PostgreSQL APIは、AnalyticDB for PostgreSQLのベクトル関連のDDLおよびDML操作をカプセル化します。 API操作を使用して、ベクトルデータを管理できます。 このトピックでは、AnalyticDB for PostgreSQL SDK for Python 3を呼び出して、API操作を使用してベクターデータをインポートおよびクエリする方法について説明します。

前提条件

手順

  1. AnalyticDB for PostgreSQL SDK for Python 3をインストールします

  2. クライアントを初期化します。

  3. ベクトルデータベースを初期化します

  4. 名前空間を作成します。

  5. コレクションを作成します。

  6. ベクトルデータのアップロード

  7. ベクトルデータの取得

AnalyticDB for PostgreSQL SDK for Python 3のインストール

SDKバージョンを指定しない場合、最新バージョンのAnalyticDB for PostgreSQL SDK for Python 3が自動的にインストールされます。 サンプルコード:

pip install alibabacloud_gpdb20160503
pip install alibabacloud_tea_openapi

Python 3用AnalyticDB for PostgreSQL SDKの特定のバージョンをインストールできます。 この例では、alibabacloud_gpdb20160503のバージョンは3.5.0に設定され、alibabacloud_tea_openapiのバージョンは0.3.8に設定されています。 サンプルコード:

pip install alibabacloud_gpdb20160503==3.5.0
pip install alibabacloud_tea_openapi==0.3.8

クライアントの初期化

AnalyticDB for PostgreSQL APIへのアクセスに使用するクライアントを初期化します。 サンプルコード:

alibabacloud_tea_openapiからモデルをopen_api_modelsとしてインポートする

from alibabacloud_tea_openapi import models as open_api_models
from alibabacloud_gpdb20160503.client import Client
import os

ALIBABA_CLOUD_ACCESS_KEY_ID = os.environ['ALIBABA_ACCESS_KEY_ID']
ALIBABA_CLOUD_ACCESS_KEY_SECRET = os.environ['ALIBABA_ACCESS_KEY_SECRET']
ADBPG_INSTANCE_ID = os.environ['ADBPG_INSTANCE_ID']
ADBPG_INSTANCE_REGION = os.environ['ADBPG_INSTANCE_REGION']

def get_client():
    config = open_api_models.Config(
        access_key_id=ALIBABA_CLOUD_ACCESS_KEY_ID,
        access_key_secret=ALIBABA_CLOUD_ACCESS_KEY_SECRET
    )
    config.region_id = ADBPG_INSTANCE_REGION
    return Client(config)

環境変数:

  • ALIBABA_ACCESS_KEY_ID: AnalyticDB for PostgreSQL APIへのアクセスに使用されるAccessKey ID。

  • ALIBABA_ACCESS_KEY_SECRET: AnalyticDB for PostgreSQL APIへのアクセスに使用されるAccessKeyシークレット。

  • ADBPG_INSTANCE_ID: AnalyticDB for PostgreSQLインスタンスのID。

  • ADBPG_INSTANCE_REGION: AnalyticDB for PostgreSQLインスタンスのリージョンです。

ベクトルデータベースの初期化

ベクトル検索を使用する前に、ナレッジベースデータベースと全文検索機能を初期化する必要があります。 次のサンプルコードは、API操作を呼び出す方法の例を示しています。

alibabacloud_gpdb20160503から

from alibabacloud_gpdb20160503 import models as gpdb_20160503_models

def init_vector_database(account, account_password):
    request = gpdb_20160503_models.InitVectorDatabaseRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        manager_account=account,
        manager_account_password=account_password
    )
    response = get_client().init_vector_database(request)
    print(f"init_vector_database response code: {response.status_code}, body:{response.body}")

if __name__ == '__main__':
    init_vector_database("testacc", "Test1234")

# output: body:
# {
#    "Message":"success",
#    "RequestId":"FC1E0318-E785-1F21-A33C-FE4B0301B608",
#    "Status":"success"
# }

関連するパラメーターの詳細については、「InitVectorDatabase」をご参照ください。

名前空間の作成

名前空間はスキーマを分離するために使用されます。 ベクターを使用する前に、少なくとも1つの名前空間を作成するか、パブリック名前空間を使用する必要があります。 次のサンプルコードは、API操作を呼び出す方法の例を示しています。

def create_namespace(account, account_password, namespace, namespace_password):
    request = gpdb_20160503_models.CreateNamespaceRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        manager_account=account,
        manager_account_password=account_password,
        namespace=namespace,
        namespace_password=namespace_password
    )
    response = get_client().create_namespace(request)
    print(f"create_namespace response code: {response.status_code}, body:{response.body}")

if __name__ == '__main__':
    create_namespace("testacc", "Test1234", "ns1", "Ns1password")

# output: body:
# {
#    "Message":"success",
#    "RequestId":"78356FC9-1920-1E09-BB7B-CCB6BD267124",
#    "Status":"success"
# }

関連するパラメーターの詳細については、「CreateNamespace」をご参照ください。

名前空間を作成した後、インスタンスの知識ベースデータベース内の対応するスキーマを照会できます。

SELECT schema_name FROM information_schema.schemata;

コレクションを作成するCreate a collection

コレクションはベクトルデータを格納するために使用され、名前空間で区切られます。 次のサンプルコードは、API操作を呼び出す方法の例を示しています。

def create_collection(account,
                      account_password,
                      namespace,
                      collection,
                      metadata: str = None,
                      full_text_retrieval_fields: str = None,
                      parser: str = None,
                      embedding_model: str = None,
                      dimension: int = None,
                      metrics: str = None,
                      hnsw_m: int = None,
                      pq_enable: int = None,
                      external_storage: int = None,):
    request = gpdb_20160503_models.CreateCollectionRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        manager_account=account,
        manager_account_password=account_password,
        namespace=namespace,
        collection=collection,
        metadata=metadata,
        full_text_retrieval_fields=full_text_retrieval_fields,
        parser=parser,
        dimension=dimension,
        metrics=metrics,
        hnsw_m=hnsw_m,
        pq_enable=pq_enable,
        external_storage=external_storage
    )
    response = get_client().create_collection(request)
    print(f"create_collection response code: {response.status_code}, body:{response.body}")

if __name__ == '__main__':
    metadata = '{"title":"text", "content": "text", "page":"int"}'
    full_text_retrieval_fields = "title,content"
    dimension = 8
    create_collection("testacc", "Test1234", "ns1", "dc1", 
                               metadata=metadata, full_text_retrieval_fields=full_text_retrieval_fields, 
                               dimension=dimension)

# output: body:
# {
#    "Message":"success",
#    "RequestId":"7BC35B66-5F49-1E79-A153-8D26576C4A3E",
#    "Status":"success"
# }

コレクションを作成した後、インスタンスのナレッジベースデータベース内の対応するテーブルを照会できます。

SELECT tablename FROM pg_tables WHERE schemaname='vector_test';

ベクトルデータのアップロード

準備した埋め込みベクトルデータを対応するコレクションにアップロードします。 次のサンプルコードは、API操作を呼び出す方法の例を示しています。

def upsert_collection_data(namespace, 
                           namespace_password, 
                           collection,
                           rows):
    request = gpdb_20160503_models.UpsertCollectionDataRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        namespace=namespace,
        namespace_password=namespace_password,
        collection=collection,
        rows=rows,
    )
    response = get_client().upsert_collection_data(request)
    print(f"upsert_collection_data response code: {response.status_code}, body:{response.body}")

if __name__ == '__main__':
    rows = []
    rows.append(gpdb_20160503_models.UpsertCollectionDataRequestRows(
        id="0CB55798-ECF5-4064-B81E-FE35B19E01A6",
        metadata={
            "page": 1,
            "content": "Test content",
            "title": "Test document"
        },
        vector=[0.2894745251078251, 0.5364747050266715, 0.14858841010401188, 0.42140750105351877,
                0.5780346820809248, 0.1145475372279496, 0.04329004329004329, 0.43246796493549741]
    ))
    upsert_collection_data("ns1", "Ns1password", "dc1", rows)

# output: body:
# {
#    "Message":"success",
#    "RequestId":"8FEE5D1E-ECE8-1F2F-A17F-48039125CDC3",
#    "Status":"success"
# }

関連するパラメーターの詳細については、「UpsertCollectionData」をご参照ください。

ベクターデータをアップロードした後、インスタンスのナレッジベースデータベース内のデータを照会できます。

SELECT * FROM vector_test.document;

ベクトルデータの取得

準備したベクトルまたはフルテキスト検索フィールドを使用して、ベクトルデータを取得します。 次のサンプルコードは、API操作を呼び出す方法の例を示しています。

インポートリストの入力から

from typing import List

def query_collection_data(namespace, 
                          namespace_password, 
                          collection, 
                          top_k,
                          content: str = None,
                          filter_str: str = None,
                          include_values: bool = None,
                          metrics: str = None,
                          vector: List[float] = None):
    request = gpdb_20160503_models.QueryCollectionDataRequest(
        region_id=ADBPG_INSTANCE_REGION,
        dbinstance_id=ADBPG_INSTANCE_ID,
        namespace=namespace,
        namespace_password=namespace_password,
        collection=collection,
        top_k=top_k,
        content=content,
        filter=filter_str,
        include_values=include_values,
        metrics=metrics,
        vector=vector,
    )
    response = get_client().query_collection_data(request)
    print(f"query_collection_data response code: {response.status_code}, body:{response.body}")

if __name__ == '__main__':
    content = "test query"
    vector = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
    query_collection_data("ns1", "Ns1password", "dc1", 5, content=content, vector=vector)

# output:
# query_collection_data response code: 200, body:{'Matches': {'match': [{'Id': '0CB55798-ECF5-4064-B81E-FE35B19E01A6', 'Metadata': {'source': 1, 'page': '1', 'title': 'Test document', 'content': 'Test content'}, 'Score': 0.7208109110736349, 'Values': {'value': [0.28947452, 0.5364747, 0.1485884, 0.4214075, 0.5780347, 0.114547536, 0.043290045, 0.7]}}]}, 'RequestId': '709E2C82-FE25-1722-9DBB-00AD0F85ABBB', 'Status': 'success'}