メインコンテンツまでスキップ

ベクトル検索インデックスをクエリする

このページでは、ページネーション、フィルタ、再ランキングなど、ベクトル検索インデックスに対するクエリの方法について説明します。

たとえば、ベクトル検索エンドポイントとインデックスを作成およびクエリする方法を説明するノートブックについては、 ベクトル検索サンプル ノートブックを参照してください。 リファレンス情報については、 Python SDK リファレンスを参照してください。

インストール

ベクトル検索SDKを使用するには、ノートブックにインストールする必要があります。 パッケージをインストールするには、次のコードを使用します。

%pip install databricks-vectorsearch
dbutils.library.restartPython()

次に、次のコマンドを使用してVectorSearchClientをインポートします。

from databricks.vector_search.client import VectorSearchClient

認証に関する情報については、 「データ保護と認証」を参照してください。

ベクトル検索インデックスをクエリする方法

ベクトル検索インデックスをクエリできるのは、Python SDK、REST API、または SQL vector_search() AI 関数を使用する場合のみです。

注記

インデックスをクエリするユーザーが、ベクトル検索インデックスの所有者ではない場合、ユーザーは次の UC 権限を持っている必要があります。

  • ベクトル検索インデックスを格納するカタログに対するUSE CATALOG権限。
  • ベクトル検索インデックスを含むスキーマに対する USE SCHEMA 権限。
  • ベクトル検索インデックスに対するSELECT権限。

デフォルトのクエリタイプはann (近似最近傍)です。さまざまな検索アルゴリズムの詳細については、 「検索アルゴリズム」を参照してください。

  • ハイブリッド キーワード類似検索を実行するには、問題query_typehybridに設定します。 ハイブリッド検索では、すべてのテキストメタデータ列が含まれ、最大200件の結果が返されます。
  • クエリでリランカーを使用するには、 クエリでリランカーを使用するを参照してください。
備考

ベータ版

全文検索はベータ版機能として利用可能です。全文検索を実行するには、問題query_typeFULL_TEXTに設定します。 全文検索では、ベクトル埋め込みを使用せずに、キーワードの一致に基づいて最大200件の結果を取得できます。全文検索は、標準エンドポイントとストレージ最適化エンドポイントの両方でサポートされています。ストレージ最適化エンドポイントでは、埋め込み情報を使用しない専用の全文検索インデックスを作成することもできます。全文検索インデックスの作成(ベータ版)を参照してください。

詳細については、 Python SDK リファレンスを参照してください。

Python
# Delta Sync Index with embeddings computed by Databricks
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "field2"],
num_results=2
)

# Delta Sync Index using hybrid search, with embeddings computed by Databricks
results3 = index.similarity_search(
query_text="Greek myths",
columns=["id", "field2"],
num_results=2,
query_type="hybrid"
)

# Delta Sync Index using full-text search (Beta)
results4 = index.similarity_search(
query_text="Greek myths",
columns=["id", "field2"],
num_results=2,
query_type="FULL_TEXT"
)

# Delta Sync Index with pre-calculated embeddings
results2 = index.similarity_search(
query_vector=[0.9] * 1024,
columns=["id", "text"],
num_results=2
)

ページネーション

クエリで1,000件を超える結果が要求された場合、結果は自動的に最大1,000件ずつのページに分けて返されます。1回のクエリで全てのページにわたって返される結果の最大数は10,000件です。標準エンドポイントとストレージ最適化エンドポイントの両方でページネーションがサポートされています。

ページネーションは、すべてのクエリタイプに対応しています。

Python SDKはページネーションを透過的に処理します。num_resultsに1,000より大きい値を設定すると、SDKは自動的にすべてのページを取得し、完全な結果セットを返します。追加のコードは必要ありません。

Python
# The SDK automatically paginates and returns all 5000 results
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
num_results=5000
)

クエリにフィルターを使用する

クエリでは、Delta テーブル内の任意の列に基づいてフィルターを定義できます。similarity_search指定されたフィルターに一致する行のみを返します。

次の表に、サポートされているフィルターを示します。

注記

ストレージ最適化エンドポイントの場合、結果はオーバーフェッチされます。num_results kに設定すると、 kを超える結果が取得され、取得された結果にフィルターが適用されます。データセット内にフィルター条件に一致する結果があっても、これらのドキュメントのスコアが上位にない場合は、結果が返されない可能性があります。

フィルタ演算子

挙動

NOT

標準 : フィルターを無効にします。キーは「NOT」で終わる必要があります。たとえば、値が「red」である「color NOT」は、色が赤ではないドキュメントと一致します。

ストレージ最適化 : != (bangeq 符号) 演算子を参照してください。

標準{"id NOT": 2} {“color NOT”: “red”}

ストレージ最適化 : "id != 2" "color != 'red'"

<

標準 : フィールド値がフィルター値より小さいかどうかを確認します。キーは「<」で終わる必要があります。たとえば、値が 200 の「price <」は、価格が 200 未満のドキュメントに一致します。

ストレージ最適化 : < (lt 記号) 演算子を参照してください。

標準{"id <": 200}

ストレージ最適化 : "id < 200"

<=

標準 : フィールド値がフィルター値以下かどうかをチェックします。キーは「<=」で終わる必要があります。たとえば、値が 200 の「price <=」は、価格が 200 以下のドキュメントに一致します。

ストレージ最適化 : <= (lt eq 記号) 演算子を参照してください。

標準{"id <=": 200}

ストレージ最適化 : "id <= 200"

>

標準 : フィールド値がフィルター値より大きいかどうかを確認します。キーは「>」で終わる必要があります。たとえば、値が 200 の「price >」は、価格が 200 より大きいドキュメントに一致します。

ストレージ最適化 : > (gt sign) 演算子を参照してください。

標準{"id >": 200}

ストレージ最適化 : "id > 200"

>=

標準 : フィールド値がフィルター値以上かどうかを確認します。キーは「>=」で終わる必要があります。たとえば、値が 200 の「price >=」は、価格が 200 以上のドキュメントに一致します。

ストレージ最適化 : >= (gt eq sign) 演算子を参照してください。

標準{"id >=": 200}

ストレージ最適化 : "id >= 200"

OR

標準 : フィールド値がフィルター値のいずれかと一致するかどうかを確認します。複数のサブキーを区切るには、キーにORを含める必要があります。たとえば、値が["red", "blue"]であるcolor1 OR color2color1redであるか、 color2blueであるドキュメントと一致します。

ストレージ最適化 : or演算子を参照してください。

標準{"color1 OR color2": ["red", "blue"]}

ストレージ最適化 : "color1 = 'red' OR color2 = 'blue'"

LIKE

標準 : 文字列内の空白で区切られたトークンと一致します。

ストレージ最適化 : like演算子を参照してください。

LIKEの使用に関する注意を参照してください。

フィルタ演算子が指定されていません

標準 : フィルターは完全一致をチェックします。複数の値を指定した場合、いずれかの値と一致します。

ストレージ最適化 : = (eq 記号) 演算子in述語を参照してください。

標準{"id": 200} {"id": [200, 300]}

ストレージ最適化 : "id = 200" "id IN (200, 300)"

to_timestamp (ストレージ最適化エンドポイントのみ)

ストレージ最適化 : タイムスタンプでフィルタリングします。to_timestamp関数を参照

ストレージ最適化 : "date > TO_TIMESTAMP('1995-01-01')"

使用上の注意 LIKE

LIKE 標準エンドポイントの例

{"column LIKE": "apple"}: 文字列「apple」および「apple pear」には一致しますが、「pineapple」には一致しません。「pineapple」には部分文字列「apple」が含まれていますが、一致しないことに注意してください。「apple pear」のように、空白で区切られたトークン間で完全一致を検索します。

{"column NOT LIKE": "apple"} その逆のことをします。「pineapple」や「pear」には一致しますが、「apple」や「apple pear」には一致しません。

LIKE ストレージ最適化エンドポイントの例

フォーマット

一致

"column LIKE 'apple'"

=演算子と同等です。完全一致のみを返します。

"column LIKE 'apple%'"

プレフィックスがappleと一致する行 (例: applepieを返します。

"column LIKE '%apple'"

サフィックスがappleと一致する行 (例: pineappleを返します。

"column LIKE '%apple%'"

pineapplecakeなど、 appleに一致する部分文字列を持つ行を返します。

コード例

Python
# Match rows where `title` exactly matches `Athena` or `Ares`
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
filters={"title": ["Ares", "Athena"]},
num_results=2
)

# Match rows where `title` or `id` exactly matches `Athena` or `Ares`
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
filters={"title OR id": ["Ares", "Athena"]},
num_results=2
)

# Match only rows where `title` is not `Hercules`
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
filters={"title NOT": "Hercules"},
num_results=2
)

クエリでリランカーを使用する

エージェントのパフォーマンスは、クエリに最も関連性の高い情報を取得するかどうかに依存します。再ランク付けは、取得したドキュメントを評価して、意味的に最も関連性の高いドキュメントを特定することで、検索品質を向上させる手法です。Databricks は、これらの文書を識別するための研究ベースの複合AI システムを開発しました。また、各ドキュメントの関連性を評価するときに、リランカーが追加のコンテキストに使用するメタデータを含む列を指定することもできます。

再ランク付けにより、若干の遅延が発生しますが、検索品質とエージェントのパフォーマンスが大幅に向上します。Databricks では、あらゆる RAG エージェントの使用例で再ランク付けを試すことを推奨しています。

このセクションの例では、ベクトル検索リランカーの使用方法を示します。再ランク付け機能を使用する場合、返される列 ( columns ) と再ランク付けに使用するメタデータ列 ( columns_to_rerank ) を個別に設定します。num_resultsは返される結果の最終的な数です。これは、再ランク付けに使用される結果の数には影響しません。

クエリ デバッグ メッセージには、ステップの再ランキングにかかった時間に関する情報が含まれています。 例えば:

Bash
'debug_info': {'response_time': 1647.0, 'ann_time': 29.0, 'reranker_time': 1573.0}

再ランク付け呼び出しが失敗した場合、その情報はデバッグ メッセージに含まれます。

Bash
'debug_info': {'response_time': 587.0, 'ann_time': 331.0, 'reranker_time': 246.0, 'warnings': [{'status_code': 'RERANKER_TEMPORARILY_UNAVAILABLE', 'message': 'The reranker is temporarily unavailable. Results returned have not been processed by the reranker. Please try again later for reranked results.'}]}
注記

columns_to_rerankにリストされる列の順序は重要です。再ランク付けの計算では、列がリストされている順序で取得され、見つかった最初の 2000 文字のみが考慮されます。

Python
# Install the most recent version.
# Databricks SDK version 0.57 or above is required to use the reranker.
%pip install databricks-vectorsearch --force-reinstall
dbutils.library.restartPython()
Python
from databricks.vector_search.reranker import DatabricksReranker

results = index.similarity_search(
query_text = "How to create a Vector Search index",
columns = ["id", "text", "parent_doc_summary", "date"],
num_results = 10,
query_type = "hybrid",
reranker=DatabricksReranker(columns_to_rerank=["text", "parent_doc_summary", "other_column"])
)

ポイント検索

ポイント検索を実行するには、任意の主キー列でフィルターを使用します。

検索アルゴリズム

このセクションでは、さまざまな検索アルゴリズムまたはクエリの種類と、それぞれがどのような場合に使用されるかについて説明します。query_type問題を使用して、使用する取得アルゴリズムを指定します。 インデックスに対して異なるアルゴリズムのパフォーマンスを自動的に比較するには、 「ベクトル検索取得品質の評価」を参照してください。

戦略

仕組み

どのようなタスクにベストなのか

ANN(近似最近傍法)

ベクトル埋め込みを用いて、意味的に類似した文書を検索する。

概念的および意味論的なクエリで、正確な表現よりも意味が重要な場合。

全文

完全一致のキーワード検索。

特定の用語、固有名詞、 ID、または専門用語を含むクエリ。

ハイブリッド

相互順位融合(RRF)を用いて、人工ニューラルネットワーク(ANN)と全文検索結果を組み合わせます。

汎用的な検索。ほとんどのユースケースにおいて推奨される出発点です。

ハイブリッド+再ランキングツール

ハイブリッド検索を実行し、その後、クロスエンコーダー再ランキングモデルを使用して結果を再スコアリングします。

レイテンシーに余裕がある場合、より高い精度が得られます(クエリあたり約1.5秒の追加)。

ANN (トレンド検索)

ANN検索は、クエリをベクトル埋め込みに変換し、埋め込みが最も類似している文書を検索します。これは 意味 を理解するのに効果的です。例えば、「壊れたパイプの修理方法」のような検索クエリは、たとえその単語が正確に含まれていなくても、配管に関する文書に一致します。

  • ANNがうまく機能する場合 :クエリが概念的、会話的であるか、または文書とは異なる語彙を使用している場合。
  • ANNの性能が低下する可能性がある場合 :クエリが正確なキーワード、固有名詞、またはドメイン固有の用語に依存しており、埋め込みではそれらを正確に捉えられない場合。

全文検索(キーワード検索)

全文検索では、検索語句を含む文書が一致します。全文検索の精度は高い。ユーザーが特定の名前、コード、または技術用語を検索する場合、キーワードマッチングによって、ベクトル検索では見逃してしまう可能性のある正確な一致結果が見つかります。

  • 全文検索がうまく機能する場合 :クエリに特定の識別子、製品名、エラーコード、またはドメイン固有の用語が含まれている場合。
  • 全文検索のパフォーマンスが低下する可能性がある場合 :クエリの表現が文書の内容と異なる場合、または同義語や言い換え表現が使用されている場合。

ハイブリッド検索

ハイブリッド検索は、ANN検索と全文検索を並行して実行し、相互ランク融合(RRF)を使用して結果を統合します。これは、ベクトル検索の意味理解とキーワードマッチングの精度を組み合わせたものです。

  • ハイブリッド検索がうまく機能する場合 :クエリのワークロードが、概念的なクエリとキーワードを多用したクエリの混合である場合。ハイブリッド戦略は、最も堅牢な汎用戦略である。

リランカー

リランカーは、任意の戦略に適用されるオプションの2回目の処理です。最初の検索後、クロスエンコーダーモデルはクエリのコンテキストで各結果を再評価し、より正確な関連性順序を生成します。

リランカーは通常、品質を約10%向上させますが、レイテンシが増加します。RAGチャットボットなど、品質が最優先されるアプリケーションには適していますが、高スループットかつ低遅延の検索アプリケーションにはあまり適していない可能性があります。