Tablestore の k 近傍 (KNN) ベクトル クエリ機能を使用して、ベクトルに基づいて近似最近傍探索を実行できます。これにより、大規模なデータセット内で、クエリ対象のベクトルと最も類似性の高いデータ項目を見つけることができます。この機能は、検索拡張生成 (RAG)、レコメンデーション システム、類似性検出、自然言語処理 (NLP) やセマンティック検索など、さまざまなシナリオに適しています。
シナリオ
KNN ベクトル クエリ機能は、以下のシナリオに適しています。
RAG
RAG は、検索機能と大規模言語モデル (LLM) の機能を組み合わせた AI フレームワークであり、LLM によって生成される出力の精度を向上させることを目的としています。特にプライベート データや専門データの分野で役立ちます。RAG はナレッジベースで広く使用されています。
レコメンデーション システム
KNN ベクトル クエリは、e コマース、ソーシャル メディア、動画ストリーミング プラットフォームなどのプラットフォームで使用できます。たとえば、プラットフォームは、ユーザーの行動、好み、コンテンツの特徴などのコンテンツをベクトルとしてエンコードし、そのベクトルを保存できます。次に、KNN ベクトル クエリを使用して、ユーザーの興味に一致する製品、記事、または動画をすばやく見つけることができます。これにより、プラットフォームはカスタム レコメンデーションを提供して、ユーザー エクスペリエンスとロイヤルティを向上させることができます。
類似性検出
画像認識、動画認識、音声認識、声紋認識、顔認識などのコンテンツ認識シナリオでは、非構造化データがベクトルに変換されて保存されます。次に、システムは KNN ベクトル クエリを使用して、最も類似したコンテンツをすばやく見つけます。たとえば、ユーザーが商品の画像を e コマース プラットフォームにアップロードした後、システムはスタイル、色、またはパターンがアップロードされた画像に類似した商品の画像をすばやく見つけることができます。
NLP とセマンティック検索
NLP 分野では、Word2Vec や Transformers からの双方向エンコーダ表現 (BERT) などの手法を使用して、テキストがベクトルに変換されます。次に、KNN ベクトル クエリを使用して、クエリ ステートメントのセマンティクスを理解し、ドキュメント、ニュース、Q&A ペアなど、セマンティック的に最も関連性の高いコンテンツを見つけます。これは、クエリ結果の関連性とユーザー エクスペリエンスの向上に役立ちます。
ナレッジグラフとインテリジェントな会話型検索
ナレッジグラフ内のノードとノードの関係は、ベクトルで表すことができます。次に、KNN ベクトル クエリを使用して、エンティティのリンク、関係の推論、およびインテリジェントな会話型検索システムの応答を高速化できます。これは、システムが質問を正確に理解し、複雑な質問への回答を提供するのに役立ちます。
機能
KNN ベクトル クエリ機能を使用して、ベクトルに基づいて近似最近傍探索を実行できます。これにより、大規模なデータセット内で、クエリ対象のベクトルと最も類似性の高いデータ項目を見つけることができます。
KNN ベクトル クエリは、検索インデックスのすべての機能を継承するすぐに使える機能です。システムを構築またはデプロイすることなく、従量課金制で KNN ベクトル クエリ機能を使用できます。KNN ベクトル クエリは、検索インデックスのストリーミング モードをサポートしています。データは、テーブルに書き込まれた後、ほぼリアルタイムでクエリできます。KNN ベクトル クエリは、高スループットの挿入、更新、および削除操作もサポートしています。クエリのパフォーマンスは、階層型ナビゲーション可能なスモール ワールド (HNSW) アルゴリズムを使用するシステムのパフォーマンスに匹敵します。
KNN ベクトル クエリ機能を使用する場合、類似性をクエリするベクトル、クエリするベクトル フィールド、およびクエリするベクトルと最も類似性の高い上位 K 個のクエリ結果を指定する必要があります。KNN ベクトル クエリと組み合わせて他のクエリ方法の機能を使用して、クエリ結果をフィルタリングすることもできます。
ベクトル フィールド
KNN ベクトル クエリ機能を使用する前に、データ テーブルの検索インデックスを作成するときに、次の情報を指定する必要があります。ベクトル フィールド、ベクトル フィールドの次元数、ベクトル フィールドのデータ型、およびベクトル間の距離を測定するために使用するアルゴリズム。
ベクトル フィールドにマッピングされるデータ テーブル内のフィールドのデータ型は STRING である必要があります。検索インデックスのベクトル フィールドの値は、FLOAT32 文字列で構成される配列である必要があります。次の表に、ベクトル フィールドのパラメータを示します。
パラメータ | 説明 |
dimension | ベクトル フィールドの次元数。最大値は 2048 です。ベクトル フィールドの次元数は、ベクトル生成システムによって生成されるベクトルの次元数と同じである必要があります。 ベクトル フィールドの配列の長さは、dimension パラメータの値と同じです。たとえば、ベクトル フィールドの値が 説明 密ベクトルのみがサポートされています。検索インデックスのベクトル フィールドの次元数は、検索インデックスの作成時に検索インデックスのスキーマで指定された次元数と同じである必要があります。次元数が多すぎたり少なすぎたりすると、インデックスの構築に失敗します。 |
dataType | ベクトル フィールドのデータ型。FLOAT32 のみサポートされています。FLOAT32 は、NaN や Infinite などの極値をサポートしていません。 ベクトル フィールドのデータ型は、ベクトル生成システムによって生成されるベクトルのデータ型と同じである必要があります。 説明 他のデータ型のベクトルを使用する場合は、チケットを提出してください。 |
metricType | ベクトル間の距離を測定するために使用するアルゴリズム。有効な値は、euclidean、cosine、および dot_product です。 ベクトル フィールドの距離測定アルゴリズムは、ベクトル生成システムによって生成されるベクトルの距離測定アルゴリズムと同じである必要があります。 詳細については、このトピックのベクトルの距離測定アルゴリズムセクションを参照してください。 |
ベクトルの属性は、ベクトル生成システムで使用されるモデルまたはバージョンによって異なります。属性には、次元数、データ型、およびベクトル間の距離を測定するために使用されるアルゴリズムが含まれます。ベクトル検索システムのベクトル フィールドの属性は、ベクトル生成システムによって生成されるベクトルの属性と同じである必要があります。ベクトルを生成するために使用できる方法の詳細については、ベクトルの生成を参照してください。
ベクトルの距離測定アルゴリズム
KNN ベクトル クエリ機能は、ベクトルの次の距離測定アルゴリズムをサポートしています。ユークリッド距離、ドット積、およびコサイン類似度。次の表に、アルゴリズムを示します。アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。
メトリック タイプ | 式 | パフォーマンス | 説明 |
ユークリッド距離 (euclidean) | 比較的高 | 多次元空間における 2 つのベクトル間の最短パスを測定します。Tablestore のユークリッド距離アルゴリズムは、最終的な平方根計算を実行しません。これは、パフォーマンスを向上させるために行われます。ユークリッド距離アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。 | |
ドット積 (dot_product) | 最高 | 同じ次元の 2 つのベクトルの対応する座標を乗算し、積を加算します。ドット積アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。 Float32 ベクトルは、テーブルに書き込む前に正規化する必要があります。たとえば、L2 ノルムを使用して Float32 ベクトルを正規化できます。Float32 ベクトルをテーブルに書き込む前に正規化しないと、クエリ結果の不正確さ、ベクトル インデックスの構築の遅延、クエリ パフォーマンスの低下などの問題が発生する可能性があります。 | |
コサイン類似度 (cosine) | 比較的低 | ベクトル空間における 2 つのベクトル間の角度のコサインを計算します。コサイン類似度アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。ほとんどの場合、このアルゴリズムはテキスト データ間の類似度を計算するために使用されます。 0 が除数として使用されている場合、コサイン類似度は計算できません。これは、0 を除数として使用できないためです。したがって、Float32 ベクトルの2乗和は 0 にすることはできません。 コサイン類似度の計算プロセスは複雑です。データをテーブルに書き込む前にベクトルを正規化し、ドット積アルゴリズムを使用してベクトル間の距離を測定することをお勧めします。 |
メリット
費用対効果
KNN ベクトル クエリ機能のコア エンジンは最適化された DiskANN テクノロジーを使用しており、すべてのインデックス データをメモリにロードする必要はありません。HNSW アルゴリズムを使用するシステムと比較して、KNN ベクトル クエリ機能は HNSW アルゴリズムの高いリコール率と高パフォーマンスを実現するために必要なメモリの 10% 未満しか消費せず、全体的なコストを大幅に削減します。
使いやすさ
検索インデックスの機能として、KNN ベクトル クエリもサーバーレスです。システムを構築またはデプロイすることなく、Tablestore コンソールでインスタンスを作成した後に KNN ベクトル クエリ機能を使用できます。
この機能は、従量課金制の請求方法をサポートしています。使用量やスケーリングについて心配する必要はありません。システムは、ストレージ リソースとコンピューティング リソースの水平方向のスケーリングをサポートしています。KNN ベクトル クエリは最大数百億件のデータ エントリをサポートし、他のクエリ機能は最大 10 兆件のデータ エントリをサポートしています。
KNN ベクトル クエリ機能の内部エンジンは、クエリ オプティマイザを使用して最適なアルゴリズムと実行パスを自動的に選択します。多数のパラメータを調整することなく、高いリコール率と高パフォーマンスを実現できます。これは、KNN ベクトル クエリの使用を大幅に簡素化し、ビジネス開発サイクルを効果的に短縮します。
SQL ステートメント、Java、Go、Python、Node.js 用の SDK、および Langchain、LangChain4J、LlamaIndex などのオープンソース フレームワークを使用して、KNN ベクトル クエリ機能を使用できます。
請求ルール
パブリック プレビュー中は、この機能を使用する場合、KNN ベクトル クエリ機能に固有の請求対象項目に対して課金されません。既存の請求ルールに基づいて、他の請求対象項目に対して課金されます。
検索インデックスを使用してデータをクエリする場合、消費される読み取りスループットに対して課金されます。詳細については、検索インデックスの請求対象項目を参照してください。
前提条件
検索インデックスを作成するときに、ベクトル フィールドが指定されます。詳細については、検索インデックスの作成を参照してください。
検索インデックスが作成されている場合、検索インデックスのスキーマを動的に変更できます。詳細については、検索インデックスのスキーマの動的変更を参照してください。
使用上の注意
KNN ベクトル クエリ機能を使用する場合は、次の点に注意してください。
ベクトル フィールドの数とベクトル フィールドの次元数には制限があります。詳細については、検索インデックスの制限を参照してください。
検索インデックス サーバーには複数のパ artition があります。検索インデックス サーバーの各パーティションは、クエリ対象のベクトルに最も近い上位 K 個の近傍を返します。パーティションによって返される上位 K 個の近傍は、クライアント ノードで集計されます。トークンを使用してすべてのデータをページごとにクエリする場合、レスポンスの合計行数は検索インデックス サーバーのパーティション数に関連しています。
KNN ベクトル クエリ機能は、次のリージョンでサポートされています。中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深圳)、中国 (広州)、中国 (成都)、中国 (香港)、シンガポール、マレーシア (クアラルンプール)、タイ (バンコク)、米国 (バージニア)、インドネシア (ジャカルタ)、日本 (東京)、ドイツ (フランクフルト)、英国 (ロンドン)、SAU (リヤド - パートナー リージョン)、フィリピン (マニラ)。
API 操作
Search オペレーションを呼び出し、クエリ タイプを KnnVectorQuery に設定して、KNN ベクトル クエリ機能を使用できます。
パラメータ
パラメータ | 必須 | 説明 |
fieldName | はい | ベクトル フィールドの名前。 |
topK | はい | クエリ対象のベクトルと最も類似性の高い上位 K 個のクエリ結果。topK パラメータの最大値については、検索インデックスの制限を参照してください。 重要
|
float32QueryVector | はい | 類似性をクエリするベクトル。 |
filter | いいえ | フィルタ。KNN ベクトル クエリ条件ではないクエリ条件の組み合わせを使用できます。 |
メソッド
KNN ベクトル クエリ機能の使用中に例外が発生した場合は、チケットを提出してください。
Tablestore コンソールまたは Tablestore SDK を使用して、KNN ベクトル クエリ機能を使用できます。KNN ベクトル クエリ機能を使用してデータをクエリする前に、次の要件が満たされていることを確認してください。
Alibaba Cloud アカウントまたは Tablestore で操作を実行するためのアクセス許可を持つ Resource Access Management (RAM) ユーザーを持っている。RAM ユーザーに Tablestore での操作アクセス許可を付与する方法の詳細については、RAM ポリシーを使用して RAM ユーザーにアクセス許可を付与するを参照してください。
Tablestore SDK または Tablestore CLI を使用して Tablestore で操作を実行する場合、Alibaba Cloud アカウントまたは RAM ユーザーの AccessKey ペアが作成されます。詳細については、AccessKey ペアの作成を参照してください。
データ テーブルが作成されている。詳細については、データ テーブルの操作を参照してください。
データ テーブルの検索インデックスが作成されている。詳細については、検索インデックスの作成を参照してください。
検索インデックスを作成するときに、ベクトル フィールドが指定されます。
Tablestore SDK を使用して Tablestore で操作を実行する場合、OTSClient インスタンスが初期化されている。詳細については、OTSClient インスタンスの初期化を参照してください。
関連情報
検索インデックスを使用してデータをクエリする場合、次のクエリ方法を使用できます。ターム クエリ、タームズ クエリ、すべて一致クエリ、一致クエリ、一致フレーズ クエリ、プレフィックス クエリ、範囲クエリ、ワイルドカード クエリ、あいまいクエリ、ブール クエリ、地理クエリ、ネスト クエリ、KNN ベクトル クエリ、存在クエリ。ビジネス要件に基づいてクエリ方法を選択して、複数の次元からデータをクエリできます。
並べ替え機能とページング機能を使用して、クエリ条件を満たす行を並べ替えたりページ分割したりできます。詳細については、並べ替えとページングの実行を参照してください。
折りたたみ (個別) 機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。これにより、指定されたタイプのデータがクエリ結果に 1 回だけ表示されます。詳細については、折りたたみ (個別)を参照してください。
データ テーブルのデータを分析する場合は、Search オペレーションの集計機能を使用するか、SQL ステートメントを実行できます。たとえば、最小値、最大値、合計、および合計行数を取得できます。詳細については、集計とSQL クエリを参照してください。
行を並べ替えることなく、クエリ条件を満たすすべての行を取得する場合は、ParallelScan および ComputeSplits オペレーションを呼び出して、並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。
付録 1: KNN ベクトル クエリとブール クエリの組み合わせ
KNN ベクトル クエリとブール クエリをさまざまな組み合わせで使用できます。クエリのパフォーマンスは、使用する組み合わせによって異なります。このセクションの例では、少量のデータがフィルタ条件を満たしています。
この例では、100 億枚の画像がテーブルに保存されており、50,000 枚の画像がユーザー A に属しています。50,000 枚の画像のうち、50 枚の画像が過去 7 日間に保存されています。ユーザー A は、50 枚の画像の中で指定された画像と最も類似性の高い 10 枚の画像を検索したいと考えています。次の表に、ユーザー A がクエリ要件を満たすために使用できる KNN ベクトル クエリとブール クエリの 2 つの一般的な組み合わせを示します。
組み合わせ | クエリ条件 | 説明 |
KNN ベクトル クエリのフィルタでのブール クエリ | KNN ベクトル クエリのクエリ条件を満たす行は、ブール クエリのクエリ条件を満たす上位 K 行です。上位 K 行は、ユーザー A がクエリするベクトルと最も類似性が高くなっています。SearchRequest へのレスポンスの行数は、Size パラメータの値に基づいて決定されます。Size パラメータは、ユーザー A が上位 K 行の中で類似度の高い順に返す行数を指定します。 この組み合わせを使用すると、KNN ベクトル クエリのフィルタを使用して、過去 7 日間に保存されたユーザー A のすべての画像 (50 枚) が取得されます。次に、50 枚の画像の中でユーザー A がクエリする画像と最も類似性の高い上位 10 枚の画像が検出され、ユーザー Aに返されます。 | |
ブール クエリでの KNN ベクトル クエリ | ブール クエリの各サブクエリ条件が最初に照合され、次にすべてのサブクエリの結果の積集合が計算されます。 この組み合わせを使用すると、KNN ベクトル クエリは、100 億枚の画像の中でユーザー A がクエリする画像と最も類似性の高い上位 500 枚の画像を返します。次に、ターム クエリと範囲クエリを実行して、500 枚の画像の中から過去 7 日間に保存されたユーザー A の 10 枚の画像をクエリします。上位 500 枚の画像には、過去 7 日間に保存されたユーザー A の 50 枚の画像すべてが含まれていない場合があります。ユーザー A がこの組み合わせを使用すると、ユーザー A は 50 枚の画像の中で指定された画像と最も類似性の高い 10 枚の画像を取得できない場合があります。極端な場合、ユーザー A は画像を取得できない場合があります。 |
付録 2: ベクトルの正規化のサンプル
次のサンプル コードは、ベクトルを正規化する方法の例を示しています。
public static float[] l2normalize(float[] v, boolean throwOnZero) {
double squareSum = 0.0f;
int dim = v.length;
for (float x : v) {
squareSum += x * x;
}
if (squareSum == 0) {
if (throwOnZero) {
throw new IllegalArgumentException("ゼロ長のベクトルを正規化できません");
} else {
return v;
}
}
double length = Math.sqrt(squareSum);
for (int i = 0; i < dim; i++) {
v[i] /= length;
}
return v;
}