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 ペアなど、セマンティック的に最も関連性の高いコンテンツを見つけます。 これにより、クエリ結果の関連性とユーザーエクスペリエンスが向上します。
ナレッジグラフとインテリジェント Q&A
ナレッジグラフ内のノードとノードの関係は、ベクトルで表すことができます。 その後、KNN ベクトル検索を使用して、エンティティリンキング、関係推論、およびインテリジェント Q&A システムの応答を高速化できます。 これにより、システムは質問を正確に理解し、複雑な質問への回答を提供できます。
メリット
費用対効果
KNN ベクトル検索機能のコアエンジンは、最適化された DiskANN テクノロジーを使用しており、すべてのインデックスデータをメモリにロードする必要はありません。 階層型ナビゲーション可能なスモールワールド(HNSW)アルゴリズムを使用するシステムと比較して、KNN ベクトル検索機能は HNSW アルゴリズムの高い再現率と高性能を実現するために 10% 未満のメモリを消費し、全体的なコストを大幅に削減します。
使いやすさ
検索インデックスの機能として、KNN ベクトル検索もサーバーレスです。 システムを構築またはデプロイすることなく、Tablestore コンソールでインスタンスを作成した後に、KNN ベクトル検索機能を使用できます。
この機能は、従量課金制の請求方法をサポートしています。 使用量やスケーリングについて心配する必要はありません。 システムは、ストレージと計算リソースのスケールアウトをサポートしています。 KNN ベクトル検索は最大数百億行をサポートしますが、他のクエリ機能は最大 10 兆行をサポートしています。
KNN ベクトル検索機能の内部エンジンは、クエリオプティマイザを使用して、最適なアルゴリズムと実行パスを自動的に選択します。 多数のパラメータを調整することなく、高い再現率と高性能を実現できます。 これにより、KNN ベクトル検索の使用が大幅に簡素化され、ビジネス開発サイクルが効果的に短縮されます。
SQL 文、Java、Go、Python、Node.js などのさまざまなプログラミング言語用の Tablestore SDK、および LangChain、LangChain4J、LlamaIndex などのオープンソースフレームワークを使用して、KNN ベクトル検索機能を使用できます。
機能
KNN ベクトル検索機能を使用して、ベクトルに基づいて近似近傍検索を実行できます。 この方法では、大規模なデータセット内で、検索するベクトルと最も類似性の高いデータ項目を見つけることができます。
KNN ベクトル検索は、検索インデックスのすべての機能を継承するすぐに使える機能です。 システムを構築またはデプロイすることなく、従量課金モードで KNN ベクトル検索機能を使用できます。 KNN ベクトル検索は、検索インデックスのストリーミングモードをサポートしています。 データは、テーブルに書き込まれた後、ほぼリアルタイムでクエリできます。 KNN ベクトル検索は、高スループットの挿入、更新、および削除操作もサポートしています。 クエリのパフォーマンスは、HNSW アルゴリズムを使用するシステムのパフォーマンスに匹敵します。
KNN ベクトル検索機能を使用する場合は、類似性をクエリするベクトル、クエリするベクトルフィールド、およびクエリするベクトルと最も類似性の高い上位 K 個のクエリ結果を指定する必要があります。 KNN ベクトル検索と組み合わせて他のクエリメソッドの機能を使用して、クエリ結果をフィルタリングすることもできます。
ベクトルフィールド
KNN ベクトル検索機能を使用する前に、検索インデックスを作成するときに、次の情報を指定する必要があります。ベクトルフィールド、ベクトルフィールドの次元数、ベクトルフィールドのデータ型、およびベクトル間の距離を測定するために使用するアルゴリズム。
ベクトルフィールドにマッピングされるデータテーブル内のフィールドのデータ型は、String である必要があります。 検索インデックスのベクトルフィールドの値は、FLOAT32 文字列で構成される配列である必要があります。 次の表に、ベクトルフィールドのパラメータを示します。
パラメータ | 説明 |
dimension | ベクトルフィールドの次元数。 最大値は 4096 です。 ベクトルフィールドの次元数は、ベクトル生成システムによって生成されるベクトルの次元数と同じである必要があります。 ベクトルフィールドの配列の長さは、dimension パラメータの値と同じです。 たとえば、ベクトルフィールドの値が 説明 密ベクトルのみがサポートされています。 検索インデックスのベクトルフィールドの次元数は、検索インデックスの作成時に検索インデックスのスキーマで指定された次元数と同じである必要があります。 次元数が大きすぎるか小さすぎると、インデックスの構築に失敗します。 |
dataType | ベクトルフィールドのデータ型。 FLOAT32 のみサポートされています。 FLOAT32 は、NaN や Infinite などの極値をサポートしていません。 ベクトルフィールドのデータ型は、ベクトル生成システムによって生成されるベクトルのデータ型と同じである必要があります。 説明 他のデータ型のベクトルを使用する場合は、チケットを送信してください。 |
metricType | ベクトル間の距離を測定するために使用するアルゴリズム。 有効値:euclidean、cosine、および dot_product。 ベクトルフィールドの距離測定アルゴリズムは、ベクトル生成システムによって生成されるベクトルの距離測定アルゴリズムと同じである必要があります。 詳細については、「ベクトルの距離測定アルゴリズム」をご参照ください。 |
ベクトルの属性は、ベクトル生成システムで使用されるモデルまたはバージョンによって異なります。 属性には、次元数、データ型、およびベクトル間の距離を測定するために使用されるアルゴリズムが含まれます。 ベクトル検索システムのベクトルフィールドの属性は、ベクトル生成システムによって生成されるベクトルの属性と同じである必要があります。 ベクトルの生成に使用できるメソッドについては、「ベクトルの生成」をご参照ください。
ベクトルの距離測定アルゴリズム
KNN ベクトル検索機能は、ベクトルの次の距離測定アルゴリズムをサポートしています。euclidean、dot_product、および cosine。 次の表に、アルゴリズムを示します。 アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。
メトリックタイプ | 式 | パフォーマンス | 説明 |
euclidean |
| 比較的高 | 多次元空間における 2 つのベクトル間の最短パスを測定します。 Tablestore のユークリッド距離アルゴリズムは、パフォーマンスを向上させるために最終的な平方根計算を実行しません。 ユークリッド距離アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。 |
dot_product |
| 最高 | 同じ次元の 2 つのベクトルの対応する座標を乗算し、積を加算します。 ドット積アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。 重要 Float32 ベクトルは、テーブルに書き込む前に正規化する必要があります。 たとえば、L2 ノルムを使用して Float32 ベクトルを正規化できます。 テーブルに書き込む前に Float32 ベクトルを正規化しないと、クエリ結果の不正確さ、ベクトルインデックスの構築の遅延、クエリパフォーマンスの低下などの問題が発生する可能性があります。 詳細については、「付録 2:ベクトル正規化のサンプル」をご参照ください。 |
cosine |
| 比較的小さい | ベクトル空間における 2 つのベクトル間の角度の余弦を計算します。コサイン類似度アルゴリズムを使用して得られる値が大きいほど、 2 つのベクトルの類似度が高いことを示します。ほとんどの場合、このアルゴリズムはテキストデータ間の類似度を計算するために使用されます。 0 を除数として使用すると、0 を除数として使用できないため、コサイン類似度を計算できません。そのため、Float32 ベクトルの2乗和は 0 になることはできません。 重要 コサイン類似度の計算プロセスは複雑です。テーブルにデータを書き込む前にベクトルを正規化し、ドット積アルゴリズムを使用してベクトル間の距離を測定することをお勧めします。詳細については、「付録 2:ベクトル正規化のサンプル」をご参照ください。 |
使用上の注意
KNN ベクタークエリ機能を使用する場合は、次の点に注意してください。
ベクターフィールドの数と、ベクターフィールドの次元数には制限があります。詳細については、「検索インデックスの制限」をご参照ください。
検索インデックスサーバーには複数のパーティションがあります。検索インデックスサーバーの各パーティションは、クエリ対象のベクターに最も近い上位 K 個の近傍点を返します。パーティションによって返された上位 K 個の近傍点は、クライアントノードで集計されます。トークンを使用してすべてのデータをページごとにクエリする場合、レスポンスの合計行数は、検索インデックスサーバーのパーティション数に関連しています。
KNN ベクタークエリ機能は、中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (広州)、中国 (成都)、中国 (香港)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、タイ (バンコク)、ドイツ (フランクフルト)、英国 (ロンドン)、米国 (バージニア)、米国 (シリコンバレー)、サウジアラビア (リヤド - パートナー地域) の各リージョンでサポートされています。
手順
ベクターを生成し、データを Tablestore に書き込みます。詳細については、「ベクターを生成する」をご参照ください。
オープンソースモデル を使用して、Tablestore データをベクターに変換して保存します。
検索インデックスを作成し、Vectorフィールドを指定します。詳細については、「検索インデックスを作成する」をご参照ください。
検索インデックスを作成する際には、ベクトルフィールドのデータ型、ベクトルフィールドの次元数、およびベクトル間の距離を測定するために使用するアルゴリズムを指定します。
KNN ベクター検索機能を使用してデータをクエリします。詳細については、「KNN ベクター検索を使用する」をご参照ください。
請求ルール
パブリックプレビュー期間中は、KNN ベクタークエリ機能を使用する場合、この機能に固有の課金対象項目については課金されません。その他の課金対象項目については、既存の請求ルールに基づいて課金されます。
検索インデックスを使用してデータをクエリする場合、消費された読み取りスループットに対して課金されます。詳細については、「検索インデックスの課金対象項目」をご参照ください。
付録 1:KNN ベクター検索とブール検索の組み合わせ
KNN ベクター検索とブール検索は、さまざまな組み合わせで使用できます。クエリのパフォーマンスは、使用する組み合わせによって異なります。このセクションの例では、少量のデータがフィルター条件を満たしています。
この例では、1 億枚の画像がテーブルに保存されており、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 ベクター検索は、1 億枚の画像の中で、ユーザー A がクエリしたい画像と最も類似度の高い上位 500 枚の画像を返します。次に、タームクエリと範囲クエリを実行して、500 枚の画像の中から過去 7 日間に保存されたユーザー A の 10 枚の画像をクエリします。上位 500 枚の画像には、過去 7 日間に保存されたユーザー A の 50 枚の画像がすべて含まれているとは限りません。ユーザー A がこの組み合わせを使用すると、ユーザー A は 50 枚の画像の中で指定された画像と最も類似度の高い 10 枚の画像を取得できない場合があります。極端な場合、ユーザー A は画像を 1 枚も取得できない可能性があります。 |
付録 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("can't normalize a zero-length vector");
} else {
return v;
}
}
double length = Math.sqrt(squareSum);
for (int i = 0; i < dim; i++) {
v[i] /= length;
}
return v;
}



