AI検索インデックスをクエリーする
このページでは、ページネーション、フィルタ、および再ランキングを含め、AI Searchインデックスをクエリする方法について説明します。
たとえば、AI Search エンドポイントとインデックスを作成およびクエリする方法を説明するノートブックについては、AI Search サンプル ノートブックを参照してください。リファレンス情報については、 Python SDK リファレンスを参照してください。
Databricks AI Search(旧 Databricks ベクトル検索)でした。
インストール
AI Search SDK を使用するには、ノートブックにインストールする必要があります。パッケージをインストールするには、次のコードを使用します。
%pip install databricks-ai-search
dbutils.library.restartPython()
次に、AISearchClientをインポートするには、次のコマンドを使用してください。
from databricks.ai_search.client import AISearchClient
認証に関する情報については、「データ保護と認証」を参照してください。
AI検索インデックスをクエリする方法
AI Search インデックスのクエリを実行できるのは、Python SDK、REST API、または SQL vector_search() AI 関数を使用した場合のみです。
インデックスをクエリするユーザーが、AI検索インデックスの所有者ではない場合、ユーザーは次の UC 権限を持っている必要があります。
- AI Search インデックスを含むカタログに対するUSE CATALOG権限。
- AI検索インデックスを含むスキーマに対するUSE SCHEMA。
- AI検索インデックスを選択します。
デフォルトのクエリ タイプは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 リファレンスを参照してください。
既存のフィルタ インターフェイスは、ストレージに最適化された AI Search インデックス用に再設計され、標準の AI Search エンドポイントで使用されるフィルタ ディクショナリの代わりに、より SQL に似たフィルタ文字列を採用しました。
client = AISearchClient()
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 AI 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 AI 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 AI 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 AI 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関数を参照してください。
ページ分割
クエリが1,000件を超える結果を要求する場合、結果は自動的に最大1,000件ずつのページで返されます。単一のクエリですべてのページにわたって返される結果の最大数は 10,000 です。標準とストレージ最適化エンドポイントの両方がページネーションをサポートしています。
ページ分割はすべてのクエリタイプに対応しています。
- Python SDK
- REST API
Python SDKはページネーションを透過的に処理します。num_results を 1,000 より大きい値に設定すると、SDK はすべてのページを自動的に取得し、完全な結果セットを返します。追加のコードは不要です。
# The SDK automatically paginates and returns all 5000 results
results = index.similarity_search(
query_text="Greek myths",
columns=["id", "text"],
num_results=5000
)
REST API を直接使用する場合、ページネーションを手動で処理する必要があります。さらに結果がある場合、応答にはnext_page_tokenフィールドが含まれます。結果の次のページを取得するには、このトークンをquery-next-pageエンドポイントに渡します。
REST API リファレンスドキュメント: POST /api/2.0/vector-search/indexes/{index_name}/query-next-pageを参照してください。
export TOKEN=...
export INDEX_NAME=...
export WORKSPACE_URL=https://...
# Initial query - if num_results exceeds 1000, the response includes next_page_token
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": 5000, "query_text": "...", "columns": ["id", "text"]}'
# Use next_page_token from the response to get the next page
curl -X GET -H 'Content-Type: application/json' -H "Authorization: Bearer $TOKEN" \
--url $WORKSPACE_URL/api/2.0/vector-search/indexes/$INDEX_NAME/query-next-page \
--data '{"page_token": "<next_page_token from previous response>"}'
トークンが空になるか、存在しなくなるまで、各応答からのnext_page_tokenを使用してquery-next-pageエンドポイントを呼び出し続けます。これにより、すべての結果が返されたことが示されます。
クエリーでフィルターを使用する
クエリは、Delta テーブル内の任意の列に基づいてフィルターを定義できます。similarity_search は指定されたフィルターに一致する行のみを返します。
次の表は、サポートされているフィルターの一覧です。
ストレージ最適化エンドポイントでは、結果が過剰に取得されます。num_results を k に設定すると、k を超える結果が取得され、取得された結果にフィルターが適用されます。フィルター条件に一致するデータセットに結果が存在する場合でも、それらのドキュメントのスコアが上位ではない場合、結果が返却されない可能性があります。
フィルタ演算子 | 挙動 | 例 |
|---|---|---|
| 標準 :フィルターを否定します。キーの末尾は「NOT」でなければなりません。たとえば、値が"red"の"color NOT"は、色の値が赤ではないドキュメントと一致します。 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準: フィールド値がフィルター値より小さいかどうかを確認します。キーの末尾は「 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| Standard :フィールド値がフィルター値以下であるかどうかを確認します。キーの末尾は「 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準:フィールド値がフィルター値より大きいかどうかを確認します。キーの末尾は「 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 :フィールド値がフィルター値以上であるかどうかを確認します。キーの末尾は「 ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 標準 : フィールド値がいずれかのフィルター値に一致するかどうかを確認します。キーには、複数のサブキーを区切るために ストレージ最適化 : | 標準 : ストレージ最適化 : |
| 「Standard」:文字列内の空白で区切られたトークンに一致します。 ストレージ最適化 : |
|
フィルタ演算子が指定されていません | 標準:フィルターは完全一致を確認します。複数の値が指定されている場合、いずれかの値に一致します。 | 標準 : ストレージ最適化 : |
| ストレージ最適化:タイムスタンプでフィルターします。 | ストレージ最適化 : |
使用上の注意 LIKE
LIKE 標準エンドポイントの例
{"column LIKE": "apple"}: 「apple」と「apple pear」に一致しますが、「pineapple」には一致しません。「apple」という部分文字列を含むにもかかわらず、「pineapple」とは一致しないことに注意してください。これは、「apple pear」のように、空白で区切られたトークンで完全に一致するものを探します。
{"column NOT LIKE": "apple"} 反対です。「pineapple」と「pear」とは一致しますが、「apple」や「apple pear」とは一致しません。
LIKE ストレージ最適化のエンドポイントの例
フォーマット | 一致 |
|---|---|
|
|
| プレフィックスが |
| サフィックスが |
|
|
コードの例
- Python SDK standard endpoint
- Python SDK storage-optimized endpoint
- REST API
# 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
)
選択したテキスト列を検索し、結果を並べ替え、集計を返します (ベータ版)
ベータ版
選択したテキスト列の検索、並べ替え、および集計の返却のオプションは、ベクトル検索:全文検索のベータ版の一部です。query_columns、sort_columns、またはfacetsを使用するには、 ベクトル検索: Full-Text Search パブリックプレビューを有効にします。プレビューを有効にするには、アカウントチームにお問い合わせいただくか、Databricks プレビューの管理を参照してください。
これらのオプションを使用して、選択したテキストフィールドを検索したり、明示的な結果順序を適用したり、一致する結果の集計を返したりできます。
これらのオプションはフルテキストおよびハイブリッドクエリでサポートされています。ANNクエリではサポートされていません。
選択したテキスト列を検索
query_columns を使用して、指定したテキスト列のみを検索します。列名を省略すると、クエリはすべてのテキスト列を検索します。
query_columns=["title", "text"]
結果の並べ替え
sort_columns を使用して、デフォルトの関連度順ではなく列の値で結果を並べ替えます。エントリは"<column> ASC"または"<column> DESC"の形式を使用します。
sort_columns=["rating DESC", "publication_year DESC"]
集計を返します。
facets を使用して、一致する結果の集計件数を返します。
値ファセットは、言語やカテゴリなどの列内の個別の値に基づいて、一致する結果をカウントします。TOP は返される値の数を制限し、省略された場合、デフォルトで10です。
facets=["language TOP 5"]
応答例:
{
"facet_result": {
"facet_array": [
["language", "en", 28],
["language", "el", 14]
]
}
}
数値バケットは、出版年や価格などの指定された数値範囲に該当する一致する結果をカウントします。バケット境界は包括的です。
facets=["publication_year BUCKETS [[1900,1949],[1950,1999],[2000,2025]]"]
応答例:
{
"facet_result": {
"facet_array": [
["publication_year", "[1900,1949]", 8],
["publication_year", "[1950,1999]", 14],
["publication_year", "[2000,2025]", 20]
]
}
}
全文クエリの場合、AI Searchは、クエリとフィルタに一致するすべての結果について集計をコンピュートします。これは、レスポンスで返された行に限定されません。ハイブリッド クエリの場合、AI Search は、インデックスのすべての行に対してではなく、ハイブリッド検索によって生成されるバインドされた候補セットに並べ替えと集計を適用します。
REST API のリクエストフィールドとレスポンススキーマについては、POST /api/2.0/vector-search/indexes/{index_name}/queryを参照してください。
クエリでリランカーを使用する
エージェントのパフォーマンスは、クエリに最も関連性の高い情報を取得するかどうかに依存します。再ランク付けは、取得したドキュメントを評価して、意味的に最も関連性の高いドキュメントを特定することで、検索品質を向上させる手法です。Databricks は、これらの文書を識別するための研究ベースの複合AI システムを開発しました。また、各ドキュメントの関連性を評価するときに、リランカーが追加のコンテキストに使用するメタデータを含む列を指定することもできます。
リランキングは、わずかなレイテンシ遅延が発生しますが、検索品質とエージェントのパフォーマンスを大幅に改善できます。Databricks は、あらゆる RAG エージェントのユースケースで再ランキングを試すことを推奨しています。
AI 検索リランカーは、データの所在地を管理するためにDatabricks Geos を使用するDatabricks 指定サービス です。米国とEU以外の顧客は、リランカーを使用するには、Geo間処理を有効にする必要がある場合があります。
このセクションの例では、AI Search リランカーの使用方法を示しています。リランカーを使用する際は、返す列(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-ai-search --force-reinstall
dbutils.library.restartPython()
from databricks.ai_search.reranker import DatabricksReranker
results = index.similarity_search(
query_text = "How to create an AI 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 an AI Search index", "columns": ["id", "text", "parent_doc_summary", "date"], "reranker": {"model": "databricks_reranker",
"parameters": {
"columns_to_rerank":
["text", "parent_doc_summary"]
}
},
"debug_level": 1}'
ポイントルックアップ
ポイントルックアップを行うには、任意の主キー列でフィルタを使用してください。
検索アルゴリズム
このセクションでは、さまざまな取得アルゴリズムまたはクエリタイプと、それぞれがいつ使用されるかについて説明します。query_typeパラメーターを使用して、使用する取得アルゴリズムを指定します。インデックスの異なるアルゴリズムのパフォーマンスを自動的に比較する方法については、AI Search 取得品質の評価を参照してください。
戦略 | 仕組み | どのようなタスクにベストなのか |
|---|---|---|
ANN (近似最近傍) | ベクトル埋め込みを使用して、セマンティック類似ドキュメントを検索します。 | 厳密な表現よりも意味が重視される、概念的およびセマンティックなクエリ。 |
全文 | キーワードの正確な一致による検索。 | 特定の用語、固有名詞、製品ID、または専門用語を含むクエリ |
ハイブリッド | ANNと全文検索の結果は、Reciprocal Rank Fusion(RRF)を使用して結合されます。 | 汎用検索。ほとんどのユースケースにおける推奨される開始点です。 |
ハイブリッド + リランカー | ハイブリッド検索を実行し、その後、クロスエンコーダーリランカーモデルで結果を再スコア付けします。 | レイテンシーが許容される場合により高い精度が得られます (クエリあたり約1.5秒追加)。 |
ANN(ベクトル検索)
ANN検索は、クエリをベクトルエンベディングに変換し、エンベディングが最も類似しているドキュメントを見つけます。これは 意味 を理解するのに効果的です。例えば、「how to fix a broken pipe」のようなクエリーは、それらの正確な単語が含まれていない場合でも、配管に関するドキュメントと一致します。
- ANNのパフォーマンスが良好な場合: クエリは概念的、会話的であるか、ドキュメントとは異なる語彙を使用します。
- ANN のパフォーマンスが低下する可能性のある状況 : クエリーは、埋め込みが正確に捉えきれない可能性のある、正確なキーワード、固有名詞、またはドメイン固有の専門用語に依存しています。
全文検索(キーワード検索)
全文検索は、クエリの用語を含むドキュメントに一致します。全文検索は精度が高いです。ユーザーが特定の名前、コード、または専門用語を検索する場合、キーワード一致は、ベクトル検索が見逃す可能性のある完全一致を検出します。
全文検索またはハイブリッドクエリオプションを使用して、選択したテキスト列を検索したり、結果を並べ替えたり、集計数を返したりします。「選択したテキスト列を検索し、結果を並べ替えて集計を返す (ベータ版)」を参照してください。
- 全文検索のパフォーマンスが良い場合: クエリには、特定の識別子、製品名、エラーコード、またはドメイン固有の用語が含まれます。
- 全文検索のパフォーマンスが低下する可能性: クエリがドキュメントとは異なる表現で記述されているか、類義語や言い換えが使用されている場合。
ハイブリッド検索
ハイブリッド検索は、ANNと全文検索の両方を並行して実行し、その後、Reciprocal Rank Fusion(RRF)を使用して結果を結合します。これは、ベクトル検索の意味的理解とキーワードマッチングの精度を組み合わせたものです。
- ハイブリッド検索が効果を発揮する場面 :クエリのワークロードが、概念的なクエリとキーワードを多用するクエリの組み合わせである場合。Hybrid は最も堅牢な汎用戦略です。
リランカー
リランカーは、任意の戦略の上に適用されるオプションのセカンドパスです。初期取得後、クロスエンコーダーモデルはクエリのコンテキストで各結果を再評価し、より正確な関連性の順序付けを生成します。
再ランカーは通常、品質を約10%向上させますが、レイテンシが増加します。品質が最も重要なRAGチャットボットなどのアプリケーションには適していますが、高スループット、低レイテンシーの検索アプリケーションには向いていない可能性があります。