すべてのプロダクト
Search
ドキュメントセンター

Tablestore:概要

最終更新日:Dec 28, 2024

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 パラメータの値と同じです。たとえば、ベクトル フィールドの値が [1, 5.1, 4.7, 0.08] の場合、フィールドの dimension パラメータの値は 4 です。

説明

密ベクトルのみがサポートされています。検索インデックスのベクトル フィールドの次元数は、検索インデックスの作成時に検索インデックスのスキーマで指定された次元数と同じである必要があります。次元数が多すぎたり少なすぎたりすると、インデックスの構築に失敗します。

dataType

ベクトル フィールドのデータ型。FLOAT32 のみサポートされています。FLOAT32 は、NaN や Infinite などの極値をサポートしていません。

ベクトル フィールドのデータ型は、ベクトル生成システムによって生成されるベクトルのデータ型と同じである必要があります。

説明

他のデータ型のベクトルを使用する場合は、チケットを提出してください。

metricType

ベクトル間の距離を測定するために使用するアルゴリズム。有効な値は、euclidean、cosine、および dot_product です。

ベクトル フィールドの距離測定アルゴリズムは、ベクトル生成システムによって生成されるベクトルの距離測定アルゴリズムと同じである必要があります。

詳細については、このトピックのベクトルの距離測定アルゴリズムセクションを参照してください。

説明

ベクトルの属性は、ベクトル生成システムで使用されるモデルまたはバージョンによって異なります。属性には、次元数、データ型、およびベクトル間の距離を測定するために使用されるアルゴリズムが含まれます。ベクトル検索システムのベクトル フィールドの属性は、ベクトル生成システムによって生成されるベクトルの属性と同じである必要があります。ベクトルを生成するために使用できる方法の詳細については、ベクトルの生成を参照してください。

ベクトルの距離測定アルゴリズム

KNN ベクトル クエリ機能は、ベクトルの次の距離測定アルゴリズムをサポートしています。ユークリッド距離、ドット積、およびコサイン類似度。次の表に、アルゴリズムを示します。アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。

メトリック タイプ

パフォーマンス

説明

ユークリッド距離

(euclidean)

image

比較的高

多次元空間における 2 つのベクトル間の最短パスを測定します。Tablestore のユークリッド距離アルゴリズムは、最終的な平方根計算を実行しません。これは、パフォーマンスを向上させるために行われます。ユークリッド距離アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。

ドット積

(dot_product)

image

最高

同じ次元の 2 つのベクトルの対応する座標を乗算し、積を加算します。ドット積アルゴリズムを使用して得られる値が大きいほど、2 つのベクトル間の類似性が高いことを示します。

Float32 ベクトルは、テーブルに書き込む前に正規化する必要があります。たとえば、L2 ノルムを使用して Float32 ベクトルを正規化できます。Float32 ベクトルをテーブルに書き込む前に正規化しないと、クエリ結果の不正確さ、ベクトル インデックスの構築の遅延、クエリ パフォーマンスの低下などの問題が発生する可能性があります。

コサイン類似度

(cosine)

image

比較的低

ベクトル空間における 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、および LangchainLangChain4JLlamaIndex などのオープンソース フレームワークを使用して、KNN ベクトル クエリ機能を使用できます。

請求ルール

パブリック プレビュー中は、この機能を使用する場合、KNN ベクトル クエリ機能に固有の請求対象項目に対して課金されません。既存の請求ルールに基づいて、他の請求対象項目に対して課金されます。

検索インデックスを使用してデータをクエリする場合、消費される読み取りスループットに対して課金されます。詳細については、検索インデックスの請求対象項目を参照してください。

前提条件

検索インデックスを作成するときに、ベクトル フィールドが指定されます。詳細については、検索インデックスの作成を参照してください。

説明

検索インデックスが作成されている場合、検索インデックスのスキーマを動的に変更できます。詳細については、検索インデックスのスキーマの動的変更を参照してください。

使用上の注意

KNN ベクトル クエリ機能を使用する場合は、次の点に注意してください。

  • ベクトル フィールドの数とベクトル フィールドの次元数には制限があります。詳細については、検索インデックスの制限を参照してください。

  • 検索インデックス サーバーには複数のパ artition があります。検索インデックス サーバーの各パーティションは、クエリ対象のベクトルに最も近い上位 K 個の近傍を返します。パーティションによって返される上位 K 個の近傍は、クライアント ノードで集計されます。トークンを使用してすべてのデータをページごとにクエリする場合、レスポンスの合計行数は検索インデックス サーバーのパーティション数に関連しています。

  • KNN ベクトル クエリ機能は、次のリージョンでサポートされています。中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (ウランチャブ)、中国 (深圳)、中国 (広州)、中国 (成都)、中国 (香港)、シンガポール、マレーシア (クアラルンプール)、タイ (バンコク)、米国 (バージニア)、インドネシア (ジャカルタ)、日本 (東京)、ドイツ (フランクフルト)、英国 (ロンドン)、SAU (リヤド - パートナー リージョン)、フィリピン (マニラ)。

API 操作

Search オペレーションを呼び出し、クエリ タイプを KnnVectorQuery に設定して、KNN ベクトル クエリ機能を使用できます。

パラメータ

パラメータ

必須

説明

fieldName

はい

ベクトル フィールドの名前。

topK

はい

クエリ対象のベクトルと最も類似性の高い上位 K 個のクエリ結果。topK パラメータの最大値については、検索インデックスの制限を参照してください。

重要
  • K の値が大きいほど、リコール率、クエリ レイテンシ、およびコストが高くなります。

  • topK パラメータの値が SearchQuery の limit パラメータの値より小さい場合、サーバーは limit パラメータの値を 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 インスタンスの初期化を参照してください。

Tablestore コンソールの使用

  1. インデックスタブに移動します。

    1. Tablestore コンソールにログインします。

    2. 上部のナビゲーション バーで、リソース グループとリージョンを選択します。

    3. 概要ページで、管理するインスタンスの名前をクリックするか、インスタンスのアクション列のインスタンスの管理をクリックします。

    4. インスタンスの詳細タブのテーブルタブで、データ テーブルの名前をクリックするか、データ テーブルのアクション列のインデックスをクリックします。

  2. インデックスタブで、データのクエリに使用する検索インデックスを見つけ、アクション列のデータの管理をクリックします。

  3. 検索ダイアログ ボックスで、クエリ条件を指定します。

    1. デフォルトでは、システムはすべての属性列を返します。特定の属性列を返すには、すべての列をオフにして、返す属性列を指定します。複数の属性列はコンマ (,) で区切ります。

      説明

      デフォルトでは、システムはデータ テーブルのすべてのプライマリ キー列を返します。

    2. ビジネス要件に基づいて、AndOr、またはNot論理演算子を選択します。

      And論理演算子を選択すると、クエリ条件を満たすデータが返されます。Or演算子を選択して単一のクエリ条件を指定すると、クエリ条件を満たすデータが返されます。Or 論理演算子を選択して複数のクエリ条件を指定すると、いずれかのクエリ条件を満たすデータが返されます。Not論理演算子を選択すると、クエリ条件を満たさないデータが返されます。

    3. ベクトル フィールドを選択し、追加をクリックします。

    4. クエリ タイプ パラメータをKNN ベクトル クエリ (knnvectorquery) に設定し、クエリするベクトルと topK パラメータの値を入力します。

      プロンプトに従って、有効な形式でベクトルを入力します。

    5. デフォルトでは、並べ替え機能は無効になっています。クエリ結果を特定のフィールドに基づいて並べ替える場合は、並べ替えをオンにして、クエリ結果を並べ替えるフィールドと並べ替え順序を指定します。

    6. デフォルトでは、集計機能は無効になっています。特定のフィールドの統計を収集する場合は、統計の収集をオンにして、統計を収集するフィールドを指定し、統計の収集に必要な情報を設定します。

  4. OKをクリックします。

    クエリ条件を満たすデータが、インデックスタブに指定された順序で表示されます。

Tablestore SDK の使用

説明

KNN ベクトル クエリ機能は、Tablestore SDK for Java V5.17.0 以降、最新バージョンの Tablestore SDK for Go、Tablestore SDK for Python V5.4.4 以降、および Tablestore SDK for Node.js V5.5.0 以降でサポートされています。

Tablestore SDK for JavaTablestore SDK for GoTablestore SDK for Python、または Tablestore SDK for Node.js を使用して、KNN ベクトル クエリ機能を使用できます。この例では、Tablestore SDK for Java を使用します。

次のサンプル コードは、指定されたベクトルと最も類似性の高い上位 10 個のベクトルをテーブルでクエリする方法の例を示しています。この例では、上位 10 個のベクトルは次のクエリ条件を満たす必要があります。Col_Keyword 列の値は hangzhou で、Col_Long 列の値は 4 未満です。

private static void knnVectorQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    KnnVectorQuery query = new KnnVectorQuery();
    query.setFieldName("Col_Vector");
    query.setTopK(10); // 指定されたベクトルと最も類似性の高い上位 10 個のベクトルをテーブルで返します。
    query.setFloat32QueryVector(new float[]{0.1f, 0.2f, 0.3f, 0.4f});
    // 上位 10 個のベクトルのクエリ条件を指定します。Col_Keyword 列の値は hangzhou で、Col_Long 列の値は 4 未満です。
    query.setFilter(QueryBuilders.bool()
            .must(QueryBuilders.term("Col_Keyword", "hangzhou"))
            .must(QueryBuilders.range("Col_Long").lessThan(4))
    );
    searchQuery.setQuery(query);
    searchQuery.setLimit(10);
    // クエリ結果をスコアに基づいて並べ替えます。
    searchQuery.setSort(new Sort(Collections.singletonList(new ScoreSort())));
    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    columnsToGet.setColumns(Arrays.asList("Col_Keyword", "Col_Long"));
    searchRequest.setColumnsToGet(columnsToGet);
    // Search オペレーションを呼び出します。
    SearchResponse resp = client.search(searchRequest);
    for (SearchHit hit : resp.getSearchHits()) {
        // スコアを表示します。
        System.out.println(hit.getScore());
        // データを表示します。
        System.out.println(hit.getRow());
    }
}

関連情報

付録 1: KNN ベクトル クエリとブール クエリの組み合わせ

KNN ベクトル クエリとブール クエリをさまざまな組み合わせで使用できます。クエリのパフォーマンスは、使用する組み合わせによって異なります。このセクションの例では、少量のデータがフィルタ条件を満たしています。

この例では、100 億枚の画像がテーブルに保存されており、50,000 枚の画像がユーザー A に属しています。50,000 枚の画像のうち、50 枚の画像が過去 7 日間に保存されています。ユーザー A は、50 枚の画像の中で指定された画像と最も類似性の高い 10 枚の画像を検索したいと考えています。次の表に、ユーザー A がクエリ要件を満たすために使用できる KNN ベクトル クエリとブール クエリの 2 つの一般的な組み合わせを示します。

組み合わせ

クエリ条件

説明

KNN ベクトル クエリのフィルタでのブール クエリ

image

KNN ベクトル クエリのクエリ条件を満たす行は、ブール クエリのクエリ条件を満たす上位 K 行です。上位 K 行は、ユーザー A がクエリするベクトルと最も類似性が高くなっています。SearchRequest へのレスポンスの行数は、Size パラメータの値に基づいて決定されます。Size パラメータは、ユーザー A が上位 K 行の中で類似度の高い順に返す行数を指定します。

この組み合わせを使用すると、KNN ベクトル クエリのフィルタを使用して、過去 7 日間に保存されたユーザー A のすべての画像 (50 枚) が取得されます。次に、50 枚の画像の中でユーザー A がクエリする画像と最も類似性の高い上位 10 枚の画像が検出され、ユーザー Aに返されます。

ブール クエリでの KNN ベクトル クエリ

image

ブール クエリの各サブクエリ条件が最初に照合され、次にすべてのサブクエリの結果の積集合が計算されます。

この組み合わせを使用すると、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;
  }