このトピックでは、ベクトルデータがない場合に OpenSearch Vector Search Edition を使用してイメージ検索サービスを構築する方法について説明します。
指定されたイメージまたはテキストに基づくイメージ検索などのイメージ検索機能を実装するには、イメージソースデータを OpenSearch にインポートし、OpenSearch でイメージのベクトル化やベクトル検索などの操作を実行できます。
アーキテクチャ

次の 3 つのサービスポートフォリオのいずれかを使用して、イメージをアップロードし、イメージ検索エンジンを構築できます:
OSS + MaxCompute + OpenSearch Vector Search Edition: Object Storage Service (OSS) バケットにイメージをアップロードし、ビジネステーブルデータと各データ入力に対応するイメージ URL を MaxCompute に保存できます。 イメージ URL は、OSS バケット内の各イメージの URL を指します。 例: /image/1.jpg。
MaxCompute + OpenSearch Vector Search Edition: Base64 エンコードされたイメージと対応するテーブルデータを MaxCompute に保存できます。
API + OpenSearch: OpenSearch Vector Search Edition の操作を呼び出して、Base64 エンコードされたイメージと対応するテーブルデータを OpenSearch Vector Search Edition インスタンスにプッシュできます。
この例では、最初のサービスポートフォリオを使用してイメージ検索エンジンを構築します。
準備
1. AccessKey ペアを作成する
Alibaba Cloud アカウントを作成して初めてコンソールにログインすると、後続の操作を実行する前に AccessKey ペアを作成するように求められます。
OpenSearch アプリケーションを作成して使用するときに AccessKey ペアが必要になるため、Alibaba Cloud アカウントの AccessKey ペアを指定する必要があります。
Alibaba Cloud アカウントの AccessKey ペアを作成した後、Resource Access Management (RAM) ユーザーの AccessKey ペアを作成できます。 これにより、RAM ユーザーとして OpenSearch アプリケーションにアクセスできます。 RAM ユーザーに権限を付与する方法の詳細については、「RAM ユーザーの作成と承認」をご参照ください。
2. OSS バケットを作成する

この例では、1,000 個のイメージが OSS バケットにアップロードされます。

次の図は、アップロードされたイメージの一部を示しています。

OpenSearch Vector Search Edition インスタンスを購入する
OpenSearch コンソール にログインします。 左上隅で、OpenSearch Vector Search Edition に切り替えます。

左側のナビゲーションウィンドウで、[インスタンス管理] をクリックします。 [インスタンス管理] ページで、インスタンスの作成 をクリックします。

購入ページで、サービスエディションとして Vector Search Editionクエリノード数クエリノードタイプデータノード数データノードの種類単一 Searcher ワーカーの合計ストレージ容量VPCvSwitch今すぐ購入 を選択し、インスタンスの次のパラメータを構成します。 リージョンとゾーン、、、、、、、、ユーザー名、パスワード。 次に、 をクリックします。 ユーザー名とパスワードは、クエリでの権限検証に使用されます。 Alibaba Cloud アカウントとパスワードをユーザー名とパスワードとして指定しないことをお勧めします。

ビジネス要件に基づいて、購入する Query Result Searcher (QRS) ワーカーと Searcher ワーカーの数と仕様を指定します。 仕様を指定すると、実際の料金が 購入ページ に自動的に表示されます。
OpenSearch Vector Search Edition インスタンスにアクセスするために使用する Elastic Compute Service (ECS) インスタンスと同じ VPC と vSwitch を指定する必要があります。 そうしないと、OpenSearch Vector Search Edition インスタンスにアクセスすると、エラー {'errors':{'code':'403','message':'Forbidden'}} が返されます。
各 Searcher ワーカーには、無料のストレージ容量クォータが提供されます。 50 GB 単位で追加のストレージを購入できます。 合計ストレージ容量が無料クォータを超える場合、超過分のストレージ容量に対して課金されます。
注文の確認今すぐ有効にする ページで、構成を確認し、サービス契約に同意してから、 をクリックします。

インスタンスを購入した後、コンソールインスタンス をクリックします。 ページで、購入したインスタンスを表示できます。

デフォルトでは、インスタンスの名前は自動的に設定されます。 インスタンスの名前を変更するには、[アクション] 列の 管理する をクリックして、インスタンスの詳細ページに移動します。

[インスタンスの詳細] ページの [基本情報] セクションで、インスタンス名の横にある [変更] アイコンをクリックします。 表示されるダイアログボックスで、プロンプトに従ってインスタンス名を変更し、確認 をクリックします。

クラスタを構成する
購入したインスタンスの詳細ページで、インスタンスが「構成保留中」状態であり、インスタンスに対してインスタンスを含まないクラスタが自動的にデプロイされていることを確認できます。 クラスタ内の QRS ワーカーと Searcher ワーカーの数と仕様は、インスタンスの購入時に指定したものです。 検索サービスを使用する前に、クラスタのデータソースとインデックススキーマを構成し、インデックスを再構築する必要があります。

1. データソースを構成する
データソースを追加します。 MaxCompute データソース または API データソース からのデータがサポートされています。 この例では、MaxCompute データソースを使用します。 クラスタの MaxCompute データソースを構成するには、次の操作を実行します。 [データソースの構成] ステップで、[データソースの追加] をクリックします。 [データソースの追加] パネルで、データソースタイプとして [MaxCompute] を選択します。 [プロジェクト]、[AccessKey ID]、[AccessKey シークレット]、[テーブル]、[パーティションキー] パラメータを構成します。 ビジネス要件に基づいて、自動再インデックス作成 に [はい] または [いいえ] を選択します。

検証に合格したら、[OK] をクリックしてデータソースを追加します。

2. インデックススキーマを構成する
データソースを構成した後、次へ をクリックしてインデックススキーマを構成します。

[インデックステーブルの作成] をクリックします。

インデックステーブルを構成します。 [テンプレートの選択] セクションで、[ベクトル: イメージ検索] を選択し、[データ] パラメータを [生データをベクトルデータに変換する必要がある] に設定します。

フィールドを構成します。 次のセクションでは、OSS バケットに保存されているイメージまたは Base64 エンコードされたイメージを使用する場合にフィールドを構成する方法について説明します。
OSS バケットに保存されているイメージ
[ベクトル: イメージ検索] テンプレートを選択すると、OpenSearch によって、id、cate_id、vector、vector_source_image というプリセットフィールドが自動的に生成されます。 id フィールドは主キーを指定します。 cate_id フィールドはカテゴリ ID を指定します。 vector フィールドはベクトルを指定します。 vector_source_image フィールドは、保存されているイメージのパスを指定します。 MaxCompute データソースを構成すると、データソースから同期されたフィールドがプリセットフィールドの下に表示されます。
4.1 vector_source_image フィールドを構成します。 フィールドは STRING タイプである必要があります。
対応するビジネステーブルフィールドに基づいて、プリセットフィールドの名前を変更できます。 フィールドの高度な設定が正しいことを確認してください。

次のパラメータを構成できます。

データ型: 値を image(path) に設定します。
ソースコンテンツタイプ: 値を oss に設定します。
OSS バケット: 現在のアカウントがアクセスでき、ベクトル化するイメージが保存されている OSS バケットを指定します。
たとえば、イメージの OSS パスは /Test image/image/10031.png です。 vector_source_image フィールドは /Test image/image/10031.png に設定する必要があります。
次の図は、OSS パスを示しています。

次の図は、MaxCompute のフィールド値を示しています。

4.2 vector フィールドを構成します。 フィールドは FLOAT タイプである必要があります。
vector_source_image フィールドを構成すると、エンジンは OSS の対応するイメージにアクセスできます。 生データをベクトルデータに変換する場合は、vector フィールドを構成する必要があります。 対応するビジネステーブルフィールドに基づいて、プリセットフィールドの名前を変更できます。 フィールドの高度な設定が正しいことを確認してください。

次のパラメータを構成できます。
{
// ベクトルモデル
"vector_model": "clip",
// ベクトルモーダル
"vector_modal": "image",
// イメージの OSS パス。 このパラメータのデフォルト値は、vector_source_image フィールドの値です。
"vector_source_field": "vector_source_image"
}vector_model: ベクトルモデル。 有効な値:
clip: 一般的なイメージをベクトルに変換するモデル。
clip_ecom: E コマースイメージをベクトルに変換するモデル。
vector_modal: 値を
imageに設定します。vector_source_field: イメージの OSS パス。 このパラメータのデフォルト値は、vector_source_image フィールドの値です。
4.3 スキーマの例:
"fields": [
{
"field_name": "id",
"field_type": "INT64",
"compress_type": "equal" // 圧縮タイプ
},
{
"user_defined_param": { // ユーザー定義パラメータ
"content_type": "oss", // コンテンツタイプ
"oss_endpoint": "", // OSS エンドポイント
"oss_bucket": "OSS バケットの名前", // OSS バケット
"oss_secret": "OSS にアクセスするために使用するアカウントの AccessKey ID", // OSS シークレット
"oss_access_key": "OSS にアクセスするために使用するアカウントの AccessKey シークレット" // OSS アクセスキー
},
"field_name": "vector_source_image",
"field_type": "STRING",
"compress_type": "uniq" // 圧縮タイプ
},
{
"field_name": "cate_id",
"field_type": "INT64",
"compress_type": "equal" // 圧縮タイプ
},
{
"user_defined_param": { // ユーザー定義パラメータ
"vector_model": "clip", // ベクトルモデル
"vector_modal": "image", // ベクトルモーダル
"vector_source_field": "vector_source_image" // ベクトルソースフィールド
},
"field_name": "vector",
"field_type": "FLOAT",
"multi_value": true // 複数値
}
]Base64 エンコードされたイメージ
[ベクトル: イメージ検索] テンプレートを選択すると、OpenSearch によって、id、cate_id、vector、vector_source_image というプリセットフィールドが自動的に生成されます。 id フィールドは主キーを指定します。 cate_id フィールドはカテゴリ ID を指定します。 vector フィールドはベクトルを指定します。 vector_source_image フィールドは、Base64 エンコードされたイメージのパスを指定します。 MaxCompute データソースを構成すると、データソースから同期されたフィールドがプリセットフィールドの下に表示されます。
4.1 vector_source_image フィールドを構成します。 フィールドは STRING タイプである必要があります。
対応するビジネステーブルフィールドに基づいて、プリセットフィールドの名前を変更できます。

注: vector_source_image フィールドの高度な設定を手動で削除し、中括弧 ({}) のみを残す必要があります。
4.2 vector フィールドを構成します。
vector_source_image フィールドを構成すると、エンジンは OSS の対応するイメージにアクセスできます。 生データをベクトルデータに変換する場合は、vector フィールドを構成する必要があります。 対応するビジネステーブルフィールドに基づいて、プリセットフィールドの名前を変更できます。 フィールドの高度な設定が正しいことを確認してください。

次のパラメータを構成できます。
{
// ベクトルモデル
"vector_model": "clip",
// ベクトルモーダル
"vector_modal": "image",
// イメージの OSS パス。 このパラメータのデフォルト値は、vector_source_image フィールドの値です。
"vector_source_field": "vector_source_image"
}vector_model: 値を
clipに設定します。vector_modal: 値を
imageに設定します。vector_source_field: イメージの OSS パス。 このパラメータのデフォルト値は、vector_source_image フィールドの値です。
4.3 スキーマの例:
"fields": [
{
"field_name": "id",
"field_type": "INT64",
"compress_type": "equal" // 圧縮タイプ
},
{
"field_name": "vector_source_image",
"field_type": "STRING",
"compress_type": "uniq" // 圧縮タイプ
},
{
"field_name": "cate_id",
"field_type": "INT64",
"compress_type": "equal" // 圧縮タイプ
},
{
"user_defined_param": { // ユーザー定義パラメータ
"vector_model": "clip", // ベクトルモデル
"vector_modal": "image", // ベクトルモーダル
"vector_source_field": "vector_source_image" // ベクトルソースフィールド
},
"field_name": "vector",
"field_type": "FLOAT",
"multi_value": true // 複数値
}
][ベクトル: イメージ検索] テンプレートを選択すると、OpenSearch によって、id という名前の主キーインデックスと vector という名前のベクトルインデックスが自動的に生成されます。 vector_source_image フィールドと vector フィールドの高度な設定が構成されると、ベクトルインデックスの高度な設定が自動的に生成されます。 ベクトルインデックスは CUSTOMIZED タイプである必要があります。

フィールドの構成に基づいて、ベクトルインデックスのフィールドを変更する必要があります。

イメージから生成されるベクトルのデフォルトディメンションは 512 で、変更できません。
スキーマの例:
"indexs": [ // インデックス
{
"index_name": "id", // インデックス名
"index_type": "PRIMARYKEY64", // インデックスタイプ
"index_fields": "id", // インデックスフィールド
"has_primary_key_attribute": true, // 主キー属性を持つ
"is_primary_key_sorted": false // 主キーでソートされている
},
{
"index_name": "vector", // インデックス名
"index_type": "CUSTOMIZED", // インデックスタイプ
"index_fields": [ // インデックスフィールド
{
"field_name": "id", // フィールド名
"boost": 1 // ブースト
},
{
"field_name": "vector", // フィールド名
"boost": 1 // ブースト
}
],
"parameters": { // パラメータ
"dimension": "512", // ディメンション
"distance_type": "SquaredEuclidean", // 距離タイプ
"vector_index_type": "Qc", // ベクトルインデックスタイプ
"build_index_params": "{\"proxima.qc.builder.quantizer_class\":\"Int8QuantizerConverter\",\"proxima.qc.builder.quantize_by_centroid\":true,\"proxima.qc.builder.optimizer_class\":\"BruteForceBuilder\",\"proxima.qc.builder.thread_count\":10,\"proxima.qc.builder.optimizer_params\":{\"proxima.linear.builder.column_major_order\":true},\"proxima.qc.builder.store_original_features\":false,\"proxima.qc.builder.train_sample_count\":3000000,\"proxima.qc.builder.train_sample_ratio\":0.5}", // インデックス構築パラメータ
"search_index_params": "{\"proxima.qc.searcher.scan_ratio\":0.01}", // インデックス検索パラメータ
"embedding_delimiter": ",", // 埋め込みデリミタ
"major_order": "col", // メジャーオーダー
"linear_build_threshold": "5000", // 線形構築しきい値
"min_scan_doc_cnt": "20000", // 最小スキャンドキュメント数
"enable_recall_report": "false", // リコールレポートを有効にする
"is_embedding_saved": "false", // 埋め込みを保存する
"enable_rt_build": "false", // RT 構築を有効にする
"builder_name": "QcBuilder", // ビルダー名
"searcher_name": "QcSearcher" // サーチャー名
},
"indexer": "aitheta2_indexer" // インデクサー
}
]3. インデックスを再構築する
構成が完了したら、[保存バージョン] をクリックします。表示されるダイアログボックスで、説明を入力し、[公開] をクリックします。説明は任意です。

インデックスが公開されたら、[次へ] をクリックしてインデックスを再構築します。

インデックスを再構築します。 インデックスの再構築要件に基づいてパラメータを構成し、[次へ] をクリックします。
API データソース

MaxCompute データソース

左側のウィンドウで、[O&M センター] > [変更履歴] を選択します。 表示されるページで、[データソースの変更] タブをクリックします。 [データソースの変更] タブで、再インデックス作成の進捗状況を表示できます。 再インデックス作成が完了したら、クエリテストを実行できます。

テストを実行する
構文
query=image_index: 'イメージ検索に使用される Base64 エンコードされたテキスト&modal=text&n=10&search_params={}'modal: モーダルタイプを指定します。 指定されたテキストに基づいてイメージを検索するには、値を
textに設定します。 特定のイメージに類似したイメージを検索するには、値をimageに設定します。n: 返される上位 n 個のベクトルを指定します。
テキストは Base64 形式でエンコードする必要があります。
指定されたテキストに基づいてイメージを検索する
コンソールの [クエリテスト] ページでクエリテストを実行します。

vector:'5pGp5omY6L2mJuWktOeblA==&modal=text&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANKOSS 内の 2042.png イメージをクエリします。
検索テキストに特殊文字が含まれている場合、テキストは Base64 形式でエンコードする必要があります。 たとえば、検索コンテンツが motorcycle&helmet の場合、Base64 エンコード後、次の結果が返されます: 5pGp5omY6L2mJuWktOeblA==。
特定のイメージに類似したイメージを検索する
Base64 エンコード後のイメージサイズは大きくなります。 したがって、OpenSearch コンソールの [クエリテスト] ページで特定のイメージに類似したイメージを検索することはできません。 SDK を使用して、特定のイメージに類似したイメージを検索できます。
次のサンプルコードは、特定のイメージに類似したイメージを検索する方法の例を示しています。
vector: 'Base64 エンコードされたイメージ&modal=image&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANKSDK を使用してイメージを検索する
次のコマンドを実行して、依存関係を追加します。
pip install alibabacloud-ha3engine次のサンプルコードを実行して、イメージを検索します。
# -*- coding: utf-8 -*-
from alibabacloud_ha3engine import models, client
from alibabacloud_tea_util import models as util_models
from Tea.exceptions import TeaException, RetryError
def search():
Config = models.Config(
endpoint="API エンドポイント。 API エンドポイントは、インスタンスの詳細ページの API エンドポイントセクションで確認できます。", // エンドポイント
instance_id="", // インスタンス ID
protocol="http", // プロトコル
access_user_name="インスタンスの購入時に指定したユーザー名。", // アクセスユーザー名
access_pass_word="インスタンスの購入時に指定したパスワード。" // アクセスパスワード
)
# リクエストの完了に長時間かかる場合は、このパラメータを構成して、リクエストの待機時間を増やすことができます。 単位: ミリ秒。
# このパラメータは、search_with_options メソッドで使用できます。
runtime = util_models.RuntimeOptions(
connect_timeout=5000, // 接続タイムアウト
read_timeout=10000, // 読み取りタイムアウト
autoretry=False, // 自動リトライ
ignore_ssl=False, // SSL を無視する
max_idle_conns=50 // 最大アイドル接続数
)
# OpenSearch Vector Search Edition クライアントを初期化します。
ha3EngineClient = client.Client(Config)
optionsHeaders = {}
try:
# 例 1: OpenSearch Vector Search Edition でクエリ文字列を使用してデータをクエリします。
# =====================================================
query_str = "config=hit:4,format:json,fetch_summary_type:pk,qrs_chain:search&&query=image_index: 'イメージ検索に使用されるテキスト&modal=text&n=10&search_params={}'&&cluster=general" // クエリ文字列
haSearchQuery = models.SearchQuery(query=query_str)
haSearchRequestModel = models.SearchRequestModel(optionsHeaders, haSearchQuery)
hastrSearchResponseModel = ha3EngineClient.search(haSearchRequestModel)
print(hastrSearchResponseModel)
except TeaException as e:
print(f"send request with TeaException : {e}") // TeaException でリクエストを送信する
except RetryError as e:
print(f"send request with Connection Exception : {e}") // 接続例外でリクエストを送信する
他の SDK を使用してイメージを検索する方法の例の詳細は、「開発者ガイド」をご参照ください。
使用上の注意
ベクトル検索で消費される時間を最小限に抑えるには、ベクトルインデックスをメモリにロックすることをお勧めします。 詳細については、「ベクトルインデックスのロックポリシー」をご参照ください。
イメージの OSS パスまたは Base64 エンコードされたイメージのパスを指定するフィールドは、STRING タイプである必要があります。
ベクトルインデックスは、CUSTOMIZED タイプである必要があります。
HA 構文と RESTful API がサポートされています。 SQL はサポートされていません。