共通検索インデックスをクエリする
この記事では、フィルタや再ランキングの使用方法を含め、高速検索インデックスをクエリする方法について説明します。
たとえば、連続検索エンドポイントとインデックスを作成およびクエリする方法を説明するノートブックについては、 「連続検索サンプル ノートブック」を参照してください。 リファレンス情報については、 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_typeをhybridに設定します。 ハイブリッド検索では、すべてのテキスト メタデータ列が含まれ、最大 200 件の結果が返されます。
クエリでリランカーを使用するには、 「クエリでリランカーを使用する」を参照してください。
ベータ版
全文検索はベータ機能として利用できます。全文検索を実行するには、パラメーターquery_typeをFULL_TEXTに設定します。 全文検索では、ベクトルエンべディングを使用せずに、キーワードの一致に基づいて最大 200 件の結果を取得できます。
- Python SDK standard endpoint
- Python SDK storage-optimized endpoint
- REST API
- SQL
詳細については、 Python SDK リファレンスを参照してください。
# 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
)
詳細については、 Python SDK リファレンスを参照してください。
既存のフィルタ インターフェイスは、ストレージに最適化された地下鉄検索インデックス用に再設計され、標準の地下鉄検索エンドポイントで使用されるフィルタ ディクショナリの代わりに、より SQL に似たフィルタ文字列を採用しました。
client = VectorSearchClient()
index = client.get_index(index_name="vector_search_demo.vector_search.en_wiki_index")
# similarity search with query vector
results = index.similarity_search(
query_vector=[0.2, 0.33, 0.19, 0.52],
columns=["id", "text"],
num_results=2
)
# similarity search with query vector and filter string
results = index.similarity_search(
query_vector=[0.2, 0.33, 0.19, 0.52],
columns=["id", "text"],
# this is a single filter string similar to SQL WHERE clause syntax
filters="language = 'en' AND country = 'us'",
num_results=2
)
REST API リファレンス ドキュメント: POST /api/2.0/vector-search/indexes/{index_name}/queryを参照してください。
本番運用アプリケーションの場合、 Databricks は パーソナルアクセストークン の代わりに サービスプリンシパル を使用することをお勧めします。 サービスプリンシパルを使用すると、セキュリティとアクセス管理の向上に加えて、クエリごとに最大 100 ミリ秒のパフォーマンスを向上させることができます。
次のコード例は、サービスプリンシパルを使用してインデックスをクエリする方法を示しています。
export SP_CLIENT_ID=...
export SP_CLIENT_SECRET=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...
export WORKSPACE_ID=...
# Set authorization details to generate OAuth token
export AUTHORIZATION_DETAILS='{"type":"unity_catalog_permission","securable_type":"table","securable_object_name":"'"$INDEX_NAME"'","operation": "ReadVectorIndex"}'
# If you are using an route_optimized embedding model endpoint, then you need to have additional authorization details to invoke the serving endpoint
# export EMBEDDING_MODEL_SERVING_ENDPOINT_ID=...
# export AUTHORIZATION_DETAILS="$AUTHORIZATION_DETAILS"',{"type":"workspace_permission","object_type":"serving-endpoints","object_path":"/serving-endpoints/'"$EMBEDDING_MODEL_SERVING_ENDPOINT_ID"'","actions": ["query_inference_endpoint"]}'
# Generate OAuth token
export TOKEN=$(curl -X POST --url $WORKSPACE_URL/oidc/v1/token -u "$SP_CLIENT_ID:$SP_CLIENT_SECRET" --data 'grant_type=client_credentials' --data 'scope=all-apis' --data-urlencode 'authorization_details=['"$AUTHORIZATION_DETAILS"']' | jq .access_token | tr -d '"')
# Get index URL
export INDEX_URL=$(curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME | jq -r '.status.index_url' | tr -d '"')
# Query vector search index.
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url https://$INDEX_URL/query --data '{"num_results": 3, "query_vector": [...], "columns": [...], "debug_level": 1}'
# Query vector search index.
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url https://$INDEX_URL/query --data '{"num_results": 3, "query_text": "...", "columns": [...], "debug_level": 1}'
次のコード例は、個人アクセスマラソン (PAT) を使用してインデックスをクエリする方法を示しています。
export TOKEN=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...
# Query vector search index with `query_vector`
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/query --data '{"num_results": 3, "query_vector": [...], "columns": [...], "debug_level": 1}'
# Query vector search index with `query_text`
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/query --data '{"num_results": 3, "query_text": "...", "columns": [...], "debug_level": 1}'
vector_search() AI 機能はパブリック プレビュー段階です。
このAI 機能を使用するには、 vector_search機能を参照してください。
クエリにフィルターを使用する
クエリでは、Delta テーブル内の任意の列に基づいてフィルターを定義できます。similarity_search指定されたフィルターに一致する行のみを返します。
次の表に、サポートされているフィルターを示します。
フィルタ演算子 | 挙動 | 例 |
|---|---|---|
| 標準 : フィルターを無効にします。キーは「NOT」で終わる必要があります。たとえば、値が「red」である「color NOT」は、色が赤ではないドキュメントと一致します。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 : フィールド値がフィルター値より小さいかどうかを確認します。キーは「<」で終わる必要があります。たとえば、値が 200 の「price <」は、価格が 200 未満のドキュメントに一致します。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 : フィールド値がフィルター値以下かどうかをチェックします。キーは「<=」で終わる必要があります。たとえば、値が 200 の「price <=」は、価格が 200 以下のドキュメントに一致します。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 : フィールド値がフィルター値より大きいかどうかを確認します。キーは「>」で終わる必要があります。たとえば、値が 200 の「price >」は、価格が 200 より大きいドキュメントに一致します。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 : フィールド値がフィルター値以上かどうかを確認します。キーは「>=」で終わる必要があります。たとえば、値が 200 の「price >=」は、価格が 200 以上のドキュメントに一致します。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 : フィールド値がフィルター値のいずれかと一致するかどうかを確認します。複数のサブキーを区切るには、キーに ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 : 文字列内の空白で区切られたトークンと一致します。以下のコード例を参照してください。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
フィルタ演算子が指定されていません | 標準 : フィルターは完全一致をチェックします。複数の値を指定した場合、いずれかの値と一致します。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| ストレージ最適化 : タイムスタンプでフィルタリングします。 | ストレージ最適化 : |
次のコード例を参照してください。
- Python SDK standard endpoint
- Python SDK storage-optimized endpoint
- REST API
- LIKE
# 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
)
# Match rows where `title` exactly matches `Athena` or `Ares`
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
filters='title IN ("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 = "Ares" OR id = "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 != "Hercules"',
num_results=2
)
LIKE 例
{"column LIKE": "apple"}: 文字列「apple」および「apple pear」には一致しますが、「pineapple」や「pear」には一致しません。「pineapple」には部分文字列「apple」が含まれていますが、一致しないことに注意してください。「apple pear」のように、空白で区切られたトークン間で完全一致を検索します。
{"column NOT LIKE": "apple"} その逆のことをします。「pineapple」や「pear」には一致しますが、「apple」や「apple pear」には一致しません。
クエリでリランカーを使用する
プレビュー
この機能は パブリック プレビュー段階です。
エージェントのパフォーマンスは、クエリに最も関連性の高い情報を取得するかどうかに依存します。再ランク付けは、取得したドキュメントを評価して、意味的に最も関連性の高いドキュメントを特定することで、検索品質を向上させる手法です。Databricks は、これらの文書を識別するための研究ベースの複合AI システムを開発しました。また、各ドキュメントの関連性を評価するときに、リランカーが追加のコンテキストに使用するメタデータを含む列を指定することもできます。
再ランク付けにより、若干の遅延が発生しますが、検索品質とエージェントのパフォーマンスが大幅に向上します。Databricks では、あらゆる RAG エージェントの使用例で再ランク付けを試すことを推奨しています。
このセクションの例では、ベクトル検索リランカーの使用方法を示します。再ランク付け機能を使用する場合、返される列 ( columns ) と再ランク付けに使用するメタデータ列 ( columns_to_rerank ) を個別に設定します。num_resultsは返される結果の最終的な数です。これは、再ランク付けに使用される結果の数には影響しません。
クエリ デバッグ メッセージには、ステップの再ランキングにかかった時間に関する情報が含まれています。 例えば:
'debug_info': {'response_time': 1647.0, 'ann_time': 29.0, 'reranker_time': 1573.0}
再ランク付け呼び出しが失敗した場合、その情報はデバッグ メッセージに含まれます。
'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 SDK
- REST API
# 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()
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"])
)
レイテンシ情報を確実に取得するには、 debug_level少なくとも 1 に設定してください。
export TOKEN=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" --url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/query --data '{"num_results": 10, "query_text": "How to create a Vector Search index", "columns": ["id", "text", "parent_doc_summary", "date"], "reranker": {"model": "databricks_reranker",
"parameters": {
"columns_to_rerank":
["text", "parent_doc_summary"]
}
},
"debug_level": 1}'