Tablestore のベクトル検索 (KnnVectorQuery) は、数値ベクターを使用して近似最近傍クエリを実行します。大規模なデータセット内で最も類似したデータ項目を検出し、検索拡張生成 (RAG)、レコメンデーションシステム、類似性検出、自然言語処理 (NLP)、セマンティック検索などのシナリオに適しています。
シナリオ
ベクトル検索は、レコメンデーションシステム、画像・動画検索、自然言語処理、セマンティック検索などのシナリオに適しています。
検索拡張生成 (RAG)
RAG は、検索機能と大規模言語モデル (LLM) の機能を組み合わせた AI フレームワークです。検索を利用して LLM の出力精度を向上させ、特に非公開データや専門的なデータに対して有効です。RAG はナレッジベースのシナリオで広く使用されています。
レコメンデーションシステム
E コマース、ソーシャルメディア、ストリーミングメディアなどのプラットフォームでは、ユーザーの行動、プリファレンス、コンテンツの特徴をベクターにエンコードできます。ベクトル検索により、ユーザーの興味に合致するプロダクト、記事、動画を迅速に見つけることができます。このプロセスにより、パーソナライズされたレコメンデーションが可能になり、ユーザー満足度と保持率が向上します。
類似性検出 (画像、動画、音声)
画像、動画、音声、ボイスプリント、顔認識などの分野では、非構造化データをベクター表現に変換できます。その後、ベクトル検索を使用して、最も類似したターゲットを迅速に見つけることができます。たとえば、E コマースプラットフォームでユーザーが画像をアップロードすると、システムは類似したスタイル、色、またはパターンのプロダクト画像を迅速に見つけることができます。
自然言語処理とセマンティック検索
自然言語処理 (NLP) の分野では、テキストを Word2Vec や Bidirectional Encoder Representations from Transformers (BERT) の埋め込みなどのベクター表現に変換できます。その後、ベクトル検索を使用してクエリのセマンティクスを理解し、意味的に最も関連性の高いドキュメント、ニュース、または Q&A ペアを見つけることができます。これにより、検索結果の関連性が向上し、ユーザーエクスペリエンスが改善されます。
ナレッジグラフと AI チャット
ナレッジグラフのノードとリレーションシップはベクターとして表現できます。ベクトル検索は、エンティティリンキング、リレーションシップの推論、および AI チャットシステムの応答速度を向上させることができます。これにより、システムは複雑な質問をより正確に理解し、回答できるようになります。
中核的な利点
低コスト
コアエンジンには、最適化された DiskAnn テクノロジーが使用されています。Hierarchical Navigable Small World (HNSW) アルゴリズムと比較して、すべてのインデックスデータをメモリにロードする必要はありません。10% 未満のメモリ使用量で、HNSW グラフアルゴリズムに匹敵する取得率とパフォーマンスを実現します。これにより、類似のシステムと比較して全体的なコストが大幅に削減されます。
使いやすさ
ベクトル検索は、多次元インデックスのサーバーレスなサブ機能です。システムを構築またはデプロイする必要はありません。開始するには、Tablestore コンソールでインスタンスを作成するだけです。
この機能は、従量課金の課金方法をサポートしています。使用量レベルやスケールアウトを管理する必要はありません。システムは、ストレージと計算リソースの両方で水平スケーリングをサポートしています。ベクトル検索は最大で数千億件のデータエントリをサポートし、非ベクトル検索は最大で数十兆件のデータエントリをサポートします。
ベクトル検索を実行すると、内部エンジンはクエリ オプテマイザーを使用して最適なアルゴリズムと実行パスを自動的に選択します。多くのパラメーターを調整することなく、高い取得率と高いパフォーマンスを実現できます。これにより、導入のハードルが大幅に下がり、ビジネス開発サイクルが短縮されます。
ベクトル検索は、SQL、Java、Go、Python、Node.js などの多言語 SDK、および LangChain、LangChain4J、LlamaIndex などのオープンソースフレームワークを通じて使用できます。
機能概要
KnnVectorQuery は、数値ベクターに対して近似最近傍クエリを実行することで、大規模なデータセット内で最も類似したデータ項目を見つけます。
ベクトル検索は、多次元インデックスのすべての機能を継承しています。これは、すぐに使用でき、従量課金制で、システムのデプロイメントが不要なサービスです。ストリームベースのインデックス構築をサポートしており、データがテーブルに書き込まれた後、ほぼリアルタイムでクエリを実行できます。また、高スループットの追加、更新、削除もサポートしています。クエリパフォーマンスは、HNSW アルゴリズムを使用するシステムに匹敵します。
KnnVectorQuery 機能を使用してデータをクエリする場合、クエリベクター、検索対象のベクターフィールド、および取得する最近傍の数 (TopK) を指定する必要があります。このプロセスにより、指定したベクターフィールドからクエリベクターに最も類似した TopK 個のベクターが取得されます。このクエリを他の非ベクトル検索機能と組み合わせて、結果をフィルタリングすることもできます。
ベクターフィールドの説明
KnnVectorQuery 機能を使用する前に、多次元インデックスを作成する際にベクターフィールドを構成する必要があります。ベクターのディメンション、ベクターのデータ型、および距離測定アルゴリズムを指定する必要があります。
データテーブル内の対応するフィールドのデータ型は、文字列である必要があります。多次元インデックス内のデータ型は、Float32 配列文字列である必要があります。ベクターフィールドの構成の詳細については、次の表をご参照ください。
構成項目 | 説明 |
dimension | ベクターのディメンション。サポートされる最大ディメンションは 4096 です。ディメンションの値は、上流の埋め込みシステムによって生成されたベクターのディメンションと一致する必要があります。 ベクターフィールドの配列の長さは、構成された dimension パラメーターと等しくなければなりません。たとえば、ベクターフィールドの値が文字列 説明 密ベクトルのみがサポートされています。多次元インデックス内のベクターフィールドのデータディメンションは、インデックス作成時にスキーマで設定されたディメンションと一致している必要があります。ディメンションが大きいか小さい場合、その行のインデックス構築は失敗します。 |
dataType | ベクターのデータ型。Float32 のみがサポートされています。Float32 は、NaN や Infinite などの極端な値をサポートしていません。 データ型は、上流の埋め込みシステムによって生成されたベクターのデータ型と一致している必要があります。 説明 他のデータ型のベクターを使用するには、チケットを送信してお問い合わせください。 |
metricType | ベクター間の距離を測定するアルゴリズム。有効な値には、euclidean、cosine、dot_product があります。 距離測定アルゴリズムは、上流の埋め込みシステムの推奨アルゴリズムと一致している必要があります。詳細については、「距離測定アルゴリズム」をご参照ください。 |
埋め込みシステムのモデルやバージョンが異なると、ディメンション、データ型、距離測定アルゴリズムなど、異なるプロパティを持つベクターが生成されます。ベクトル検索システム内のベクターフィールドのプロパティ (ディメンション、データ型、距離測定アルゴリズム) は、埋め込みシステムによって生成されたベクターのプロパティと一致している必要があります。ベクターの生成方法の詳細については、「ベクターを生成する 2 つの方法」をご参照ください。
距離測定アルゴリズム
ベクトル検索は、euclidean、cosine、dot_product の距離測定アルゴリズムをサポートしています。詳細については、次の表をご参照ください。スコアが高いほど、2 つのベクター間の類似性が高いことを示します。
MetricType | スコアリング数式 | パフォーマンス | 説明 |
ユークリッド距離 (euclidean) |
| 高 | ユークリッド距離は、多次元空間における 2 つのベクター間の直線距離です。パフォーマンス上の理由から、Tablestore のユークリッド距離アルゴリズムでは、最終的な平方根の計算が省略されます。スコアが高いほど、2 つのベクター間の類似性が高いことを示します。 |
ドット積 (dot_product) |
| 最高 | 同じディメンションの 2 つのベクターの対応する座標を乗算し、その結果を合計します。ドット積のスコアが高いほど、2 つのベクター間の類似性が高いことを示します。 重要 Float32 ベクターは、テーブルに書き込む前に正規化する必要があります (例:L2 ノルムを使用)。そうしないと、クエリ結果の質の低下、ベクターインデックス構築の遅延、クエリパフォーマンスの低下などの問題が発生する可能性があります。ベクター正規化の例については、「付録 2:ベクター正規化の例」をご参照ください。 |
コサイン類似度 (cosine) |
| 低 | ベクター空間における 2 つのベクター間の角度のコサイン。コサイン類似度のスコアが高いほど、2 つのベクター間の類似性が高いことを示します。テキストデータの類似度計算によく使用されます。 0 は除数にできないため、Float32 ベクターの二乗和が 0 の場合、コサイン類似度の計算は完了できません。 重要 コサイン類似度の計算は複雑です。データをテーブルに書き込む前にベクターを正規化し、距離測定アルゴリズムとして dot_product を使用することを推奨します。ベクター正規化の例については、「付録 2:ベクター正規化の例」をご参照ください。 |
注意事項
ベクトル検索を使用する際は、次の点にご注意ください:
ベクターフィールドの型、ディメンション、その他のプロパティの数には制限が適用されます。詳細については、「多次元インデックスの制限事項」をご参照ください。
多次元インデックスはサーバー側でパーティション分割されます。各パーティションは独自の TopK 最近傍を返し、その結果はクライアントノードで集約されます。したがって、トークンを使用してすべてのデータをページ分割する場合、返される行の総数はサーバー側のパーティション数に依存します。
現在、ベクトル検索機能は、中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深セン)、中国 (広州)、中国 (成都)、中国 (香港)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、タイ (バンコク)、ドイツ (フランクフルト)、イギリス (ロンドン)、米国 (バージニア)、米国 (シリコンバレー)、サウジアラビア (リヤド - パートナー運営) の各リージョンで利用可能です。
手順
オープンソースモデルを使用して、Tablestore 内のデータをベクターに変換し、保存します。
検索インデックスを作成する際に、ベクターフィールドを設定します。
ベクターフィールドの型、ディメンション、および距離測定アルゴリズムを構成します。
ベクトル検索を使用してデータをクエリします。
課金
パブリックプレビュー期間中は、KNN ベクタークエリ機能に固有の課金項目に対しては課金されません。その他の課金項目については、既存の課金ルールに基づいて課金されます。
検索インデックスを使用してデータをクエリすると、消費された読み取りスループットに対して課金されます。詳細については、「検索インデックスの課金項目」をご参照ください。
付録 1:BoolQuery との併用
KnnVectorQuery と BoolQuery をさまざまな方法で組み合わせることで、異なる結果を得ることができます。このセクションでは、2 つの一般的なユースケースについて説明します。この例では、フィルターが少量のデータに一致するシナリオを想定しています。
あるテーブルに 1 億枚の画像が含まれているとします。あるユーザーは合計 50,000 枚の画像を所有していますが、そのうち過去 7 日間に追加されたのは 50 枚のみです。ユーザーは、画像による検索を使用して、過去 7 日間に追加された画像の中から最も類似した 10 枚の画像を見つけたいと考えています。次の表は、KnnVectorQuery フィルター内で BoolQuery を使用してこの要件を満たす方法を示しています。
組み合わせた使用法 | クエリ条件図 | 説明 |
KnnVectorQuery のフィルター内で BoolQuery を使用する |
| KnnVectorQuery は BoolQuery 条件を満たす行にヒットし、TopK の最も類似した行を返します。SearchRequest の応答は、TopK の結果から最初の `Size` 行を返します。 この例では、KnnVectorQuery はまずフィルターを使用して、過去 7 日間のユーザー "a" に属する 50 枚の画像をすべて選択します。次に、これらの 50 枚の中から最も類似した 10 枚の画像を見つけて返します。 |
BoolQuery 内で KnnVectorQuery を使用する |
| BoolQuery 内の各サブクエリが最初に実行され、次にすべてのサブクエリ結果の共通部分が計算されます。 この例では、KnnVectorQuery はテーブル内の 1 億枚の画像から上位 500 枚の最も類似した画像を返します。次に、過去 7 日間のユーザー "a" の 10 枚の画像を順次見つけます。しかし、上位 500 枚の画像には、過去 7 日間のユーザー "a" の 50 枚の画像がすべて含まれているとは限りません。したがって、このクエリ方法では、過去 7 日間から最も類似した 10 枚の画像を見つけられない可能性があり、データが全く見つからないことさえあります。 |
付録 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;
}



