AnalyticDB for PostgreSQL APIは、AnalyticDB for PostgreSQLのベクトル関連のDDLおよびDML操作をカプセル化します。 API操作を使用して、ベクトルデータを管理できます。 このトピックでは、AnalyticDB for PostgreSQL SDK for Python 3を呼び出して、API操作を使用してベクターデータをインポートおよびクエリする方法について説明します。
前提条件
エラスティックストレージモードのAnalyticDB for PostgreSQL V6.0インスタンスが作成されます。 詳細については、「インスタンスの作成」をご参照ください。
ベクトル検索エンジン最適化が有効になりました。 詳細については、「ベクトル検索エンジンの最適化の有効化または無効化」をご参照ください。
特権アカウントが作成されます。 詳細については、「データベースアカウントの作成」をご参照ください。
手順
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'}