このドキュメントでは、企業がベクトルデータを必要とせずにOpenSearch Retrieval Engine Editionを使用して画像検索サービスを迅速に確立する方法について概説します。ユーザーは画像ソースデータを直接インポートし、OpenSearch内で画像のベクトル化、ベクトル検索、その他のプロセスを簡単に完了できるため、画像による検索やテキストベースの検索など、さまざまな画像検索機能が容易になります。
ソリューションアーキテクチャ
ユーザーが画像をアップロードして画像検索エンジンを構築するには、3つの方法があります。
OSS+MaxCompute+OpenSearch Retrieval Engine Edition:ユーザーは最初に画像をOSSにアップロードし、対応する画像アドレス(OSSパス、例:/image/1.jpg)とともにビジネステーブルデータをMaxComputeに保存します。
MaxCompute+OpenSearch Retrieval Engine Edition:ユーザーはBase64エンコードされた画像とそのテーブルデータをMaxComputeに保存します。
API+OpenSearch Retrieval Engine Edition:ユーザーは、OpenSearch Retrieval Engine Editionによって提供されるデータプッシュインターフェースを介して、Base64エンコードされた画像とそのテーブルデータをOpenSearch Retrieval Engine Editionインスタンスにプッシュします。
このドキュメントでは、OSS+MaxCompute+OpenSearch Retrieval Engine Editionを使用した画像検索エンジンの構築に焦点を当てています。
前提条件
1. AKとSKを作成する
Alibaba Cloudコンソールに初めてログインすると、サービスの継続利用のためにアクセスキーを作成するように求められます。
アプリケーションの依存関係の作成と使用には、アクセスキーパラメータが必要であり、プライマリアカウントでは空にすることはできません。
プライマリアカウントのアクセスキーパラメータを作成したら、RAMユーザーが使用するためのRAMユーザーアクセスキーも生成できます。RAMユーザーには、適切なアクセス権限が割り当てられます。詳細については、RAMユーザーの作成と承認を参照してください。
2. オブジェクトストレージサービス(OSS)を作成する
このドキュメントでは、1000個の画像がOSSにアップロードされました。
画像は次の場所にあります:/test/images/
OpenSearch Retrieval Engine Editionインスタンスを購入する
OpenSearch Retrieval Engine Editionインスタンスの購入の詳細については、OpenSearch Retrieval Engine Editionインスタンスの購入を参照してください。
テーブルを構成する
新しいインスタンスの場合、製品ページのステータスは「構成保留中」であり、購入したものと同じ数と仕様のクエリノードとデータノードを持つ空のクラスターが自動的にデプロイされます。通常の検索操作を有効にするには、クラスターのテーブルの基本情報>データ同期>インデックススキーマ>インデックス再構築を構成する必要があります。
テーブルの基本情報の構成には、テーブル名のカスタマイズ、シャード数の設定、データ更新リソースの数の指定が含まれます。
無料のデータ更新リソースのデフォルト数は2です。データ量がこれを超える場合は、n-2に基づいて追加のリソースが課金されます。ここで、nは単一テーブルのデータ更新リソースの総数です。
データ同期の場合は、完全なデータソースを構成します(現在のオプションには、MaxComputeデータソース、APIプッシュデータソース、オブジェクトストレージサービス(OSS)が含まれます)。ここでは、MaxComputeデータソースを例として使用します。「データソースを追加」をクリックし、データソースタイプとして「MaxCompute」を選択し、プロジェクト、accesskeyID、accesskeySecret、テーブル、パーティションキーを入力し、オプションで「自動インデックス再構築」を有効にします。
データソースの構成が成功したら、インデックススキーマの設定に進みます。
4.1. MaxComputeデータソースが確立されると、データソースフィールドが自動的にマッピングされます。
フィールド設定:エンドツーエンドの画像検索ソリューションは、システムを介して画像をベクトルに変換し、ベクトルを介してデータを取得します。したがって、上の図に示すように、3つのフィールドをここで構成する必要があります(名前はカスタマイズできます)。
主キーフィールド:タイプはSTRINGまたは整数にすることができ、主キーを選択する必要があります。
vector_source_image:OSSの画像パスを保存します。このドキュメントでは/test/images/10031.pngで、次の詳細設定があります。Pro構成は次のとおりです。
{
"content_type": "oss",
"oss_endpoint": "oss-cn-hangzhou-internal.aliyuncs.com",
"oss_bucket": "oss bucket name, in this document test-image-vector", // OSSバケット名、このドキュメントではtest-image-vector
"crop": "true", // OSS画像をベクトルに変換する場合に値を渡します。値は"true"でなければなりません。
"oss_use_slr": "true", // サービスリンクロール(slr)を使用してOSS関連のAPIにアクセスします。文字列型"true"でなければなりません。
"uid": "" // Alibaba Cloudアカウントuid
}
vector:画像がベクトルに変換された後にベクトルを格納するフィールド。このフィールドはFLOAT型に設定し、複数値を選択する必要があります。
Pro構成は次のとおりです。
{
"vector_model": "clip",
"vector_modal": "image",
"vector_source_field": "vector_source_image"
}
vector_modelはベクトル化モデルを指します。システムは、一般的な画像ベクトル化用のclipと、Eコマース強化画像ベクトル化用のclip_ecomの2つのモデルを提供します。vector_modalはimageとして固定されています。vector_source_fieldはベクトル化する画像フィールドで、このドキュメントではvector_source_imageです。
4.2. インデックス設定:構成する必須インデックスは、主キーインデックスとベクトルインデックスです。
4.3. ベクトルインデックスフィールドの編集:
4.4. ベクトルインデックスの詳細設定の編集:ベクトルインデックスの詳細設定では、次元を512次元に設定する必要があります。これは固定されており、変更できません。他のパラメータは通常、デフォルト設定のままにしておく必要があります。
スキーマの例:
"fields": [
{
"field_name": "id",
"field_type": "INT64",
"compress_type": "equal"
},
{
"user_defined_param":
{
"oss_endpoint": "oss-cn-hangzhou-internal.aliyuncs.com",
"oss_bucket": "/opensearch",
"crop": "true",
"content_type": "oss",
"oss_use_slr": "true",
"uid": "xxx"
},
"field_name": "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
}
]
構成が完了したら、「確認」をクリックして作成します。
作成の進行状況は、機能拡張>変更履歴で監視できます。完了したら、クエリテストを実行できます。
効果テスト
構文の紹介
query=image_index:'検索するテキストコンテンツ&modal=text&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANK
modalは検索モードを指定します。テキストベースの検索の場合はmodalをtextに、画像ベースの検索の場合はimageに設定します。
nは、ベクトル検索から返される上位結果の数を定義します。
テキストで検索
クエリテストページでHAクエリを実行します。
vector:'オートバイのヘルメット&modal=text&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANK
OSSで2042.png画像を検査します。
検索テキストに特殊文字が含まれている場合は、Base64エンコードが必要です。たとえば、「motorcycle&helmet」は「5pGp5omY6L2mJuWktOeblA==」にエンコードする必要があります。
画像で検索
エンコードされた画像の長さが長いため、コンソールのクエリテストページでの直接検索は現在サポートされていません。代わりに、ユーザーはSDKを使用して検索を実行できます。
例:
vector:'Base64エンコードされた画像&modal=image&n=10&search_params={}'&&kvpairs=formula:proxima_score(vector)&&sort=+RANK
SDKでデータを取得する
次の依存関係を追加します。
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ドメイン名を参照してください",
instance_id="",
protocol="http",
access_user_name="インスタンス購入時に設定したユーザー名",
access_pass_word="インスタンス購入時に設定したパスワード"
)
# ユーザーリクエスト時間が長い場合は、この構成を使用してリクエスト待機時間を増やすことができます。単位ms
# このパラメータはsearch_with_optionsメソッドで使用できます
runtime = util_models.RuntimeOptions(
connect_timeout=5000,
read_timeout=10000,
autoretry=False,
ignore_ssl=False,
max_idle_conns=50
)
# Ha3Engineクライアントを初期化します
ha3EngineClient = client.Client(Config)
optionsHeaders = {}
try:
# 例1:haクエリ文字列を直接検索に使用します。
# =====================================================
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}")
except RetryError as e:
print(f"send request with Connection Exception : {e}")
SDKのその他の例については、開発者ガイドを参照してください。
注意事項
● ベクトル取得時間に厳しい要件がある場合は、mmap戦略の例を検討してください。
● 画像パスまたはBase64エンコードされた画像を格納するフィールドは、STRING型に設定する必要があります。 ● ベクトルインデックスは、CUSTOMIZED型として構成する必要があります。 ● このシナリオでは、HA構文とRESTFUL APIはサポートされていますが、SQLはサポートされていません。