本ガイドでは、データ準備からベクトル取得までを含む、一連のワークフローを素早く構築する方法について説明します。このプロセスには、以下の4つのコアステップがあります:ベクターバケットの作成、ベクターインデックスの作成、ベクトルデータのアップロード、およびベクトル取得の実行。
開始する前に、以下の前提条件を完了してください。
OSS の有効化: Object Storage Service (OSS) を有効化します。
本機能は、以下のリージョンでご利用いただけます:中国 (深セン)、中国 (北京)、中国 (杭州)、中国 (上海)、中国 (ウランチャブ)、シンガポール、中国 (香港)、インドネシア (ジャカルタ)、ドイツ (フランクフルト)、米国 (シリコンバレー)、米国 (バージニア)。
ステップ 1:ベクターバケットの作成
ベクターバケットを作成して、すべてのベクトルデータおよびインデックスを格納するコンテナとして使用します。
ベクターバケット ページで、[ベクターバケットの作成] をクリックします。
バケット情報を設定します。
ベクターバケット名: 同一アカウントおよび同一リージョン内でグローバルに一意となる名前を指定します。名前の長さは 3~32 文字で、小文字の英字、数字、およびハイフン (-) のみを使用でき、先頭および末尾にハイフンを含めることはできません。
リージョン: バケットを作成するリージョンを選択します(例:中国 (深セン))。
[OK] をクリックします。
ステップ 2:ベクターインデックスの作成
バケットを作成した後、その中にベクターインデックスを作成します。インデックスは、ベクトルのディメンションや検索方式など、ベクトルの構造を定義し、ベクトルデータの保存およびクエリ実行の基盤を提供します。
ベクターバケット ページで、作成済みのベクターバケット名をクリックします。
[ベクターインデックス] ページで、[インデックステーブルの作成] をクリックします。
インデックスのパラメーターを設定します。
インデックステーブル名: バケット内で一意となる名前を指定します。名前の長さは 1~63 文字で、英字および数字のみを使用でき、先頭は英字である必要があります。
ベクトルデータ型: デフォルト値は
float32(32 ビット浮動小数点)です。ベクトルディメンション: ベクトルのディメンション数(例:
128)を設定します。値は 1~4,096 の整数である必要があります。このインデックスにアップロードするすべてのベクトルは、同じディメンション数である必要があります。距離メトリック関数: ご使用のユースケースに応じて、適切な距離メトリックを選択します。
ユークリッド距離: 空間内の 2 点間の直線距離です。数値的な差異を測定する場合に適しています。
コサイン距離: 2 つのベクトルの方向の違いを測定します。テキストおよび画像の高次元意味的類似度計算に適しています。
[OK] をクリックします。
ステップ 3:ベクトルデータのアップロード
インデックスの準備が完了したら、指定されたベクターインデックスにベクトルデータをアップロードして、取得可能な状態にします。
インデックス一覧から、先ほど作成したインデックスを見つけ、右側の [データの表示] をクリックします。
インデックスページで、[ベクトルデータの挿入] をクリックします。
ベクトルデータを設定します。一度に複数のベクトルを追加できます。
プライマリキー値: ベクトルを一意に識別する ID を設定します。
ベクトルデータ: コンマ区切りの数値配列としてベクトルを入力します。ベクトルのディメンション数(値の個数)は、ステップ 2 で設定した ベクトルディメンション と一致している必要があります。
メタデータ: カテゴリ、タイトル、タイムスタンプなどのメタデータを追加できます。これらの情報は、クエリのフィルタリングに使用可能です。
[OK] をクリックします。
ステップ 4:ベクトル取得の実行
データの準備が完了したら、ベクトル取得を実行します。これは、本ワークフローのコアステップです。通常、アプリケーション内で SDK を使用してベクトル取得を実行し、対象データを迅速に特定します。
以下の Python SDK のサンプルコードでは、クエリベクトルと最も類似した上位 10 件のデータを取得する方法を示しています。ただし、type フィールドが「comedy」または「documentary」でないデータのみを対象とします。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.vectors as oss_vectors
parser = argparse.ArgumentParser(description="vector query vectors sample")
parser.add_argument('--region', help='The region in which the bucket is located.', required=True)
parser.add_argument('--bucket', help='The name of the bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS')
parser.add_argument('--index_name', help='The name of the vector index.', required=True)
parser.add_argument('--account_id', help='The account id.', required=True)
def main():
args = parser.parse_args()
# Load credentials from environment variables
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
# Use the SDK's default configuration
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
cfg.account_id = args.account_id
if args.endpoint is not None:
cfg.endpoint = args.endpoint
vector_client = oss_vectors.Client(cfg)
# Filter: exclude comedy and documentary vectors
query_filter = {
"$and": [{
"type": {
"$nin": ["comedy", "documentary"]
}
}]
}
# Query vector: 128-dimensional float32 vector
query_vector = {"float32": [0.1] * 128}
result = vector_client.query_vectors(oss_vectors.models.QueryVectorsRequest(
bucket=args.bucket,
index_name=args.index_name,
filter=query_filter,
query_vector=query_vector,
return_distance=True,
return_metadata=True,
top_k=10,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
)
if result.vectors:
for vector in result.vectors:
print(f'vector: {vector}')
if __name__ == "__main__":
main()次のステップ
ベクターバケットの全ワークフローは、コンソール、OSS SDK、ossutil、または直接の API 呼び出しを用いて管理できます。本ガイドでは基本的なワークフローを紹介しました。完全な構成および高度な利用方法については、以下のトピックをご参照ください。