查询矢量搜索索引

本文介绍如何查询矢量搜索索引,包括如何使用筛选器和重新调整。

有关如何创建和查询矢量搜索终结点和索引的示例笔记本,请参阅 矢量搜索示例笔记本。 有关参考信息,请参阅 Python SDK 参考

Installation

若要使用矢量搜索 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 个结果。

若要在查询中使用重新调用程序,请参阅 在查询中使用重新调用程序

重要

全文搜索可用作 beta 功能。 若要执行全文搜索,请将参数 query_type 设置为 FULL_TEXT. 使用全文搜索,可以基于关键字匹配最多检索 200 个结果,而无需使用矢量嵌入。

Python SDK 标准终结点

有关详细信息,请参阅 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 存储优化的终结点

有关详细信息,请参阅 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

请参阅 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}'

SQL

重要

vector_search() AI 函数处于公共预览阶段

若要使用此 AI 函数,请参阅 vector_search 函数

对查询使用筛选器

查询可以根据 Delta 表中的任何列定义筛选器。 similarity_search 仅返回与指定筛选器匹配的行。

下表列出了支持的筛选器。

筛选器运算符 行为 例子
NOT 标准:否定筛选器。 密钥必须以“NOT”结尾。 例如,值为“red”的“color NOT”与颜色不为红色的文档匹配。
存储优化:请参阅 !=(感叹号等于号)运算符
标准{"id NOT": 2}{“color NOT”: “red”}
存储优化"id != 2" "color != 'red'"
< 标准:检查字段值是否小于筛选器值。 键必须以“ <”结尾。 例如,值为 200 的“price <”与价格小于 200 的文档匹配。
存储优化:请参阅 <(小于号)运算符
标准{"id <": 200}
存储优化"id < 200"
<= 标准:检查字段值是否小于或等于筛选器值。 密钥必须以“ <=”结尾。 例如,值为 200 的“price <=”与价格小于或等于 200 的文档匹配。
存储优化:请参阅 <=(小于等于号)运算符
标准{"id <=": 200}
存储优化"id <= 200"
> 标准:检查字段值是否大于筛选器值。 键必须以“ >”结尾。 例如,值为 200 的“price >”与价格大于 200 的文档匹配。
存储优化:请参阅 >(大于号)运算符
标准{"id >": 200}
存储优化"id > 200"
>= 标准:检查字段值是否大于或等于筛选器值。 密钥必须以“ >=”结尾。 例如,值为 200 的“price >=”与价格大于或等于 200 的文档匹配。
存储优化:请参阅 >=(大于等于号)运算符
标准{"id >=": 200}
存储优化"id >= 200"
OR 标准:检查字段值是否与任何筛选器值匹配。 密钥必须包含 OR 以分隔多个子项。 例如,值为 color1 OR color2["red", "blue"]color1redcolor2blue 的文档匹配。
存储优化:请参阅 or 运算符
标准{"color1 OR color2": ["red", "blue"]}
存储优化"color1 = 'red' OR color2 = 'blue'"
LIKE 标准:匹配字符串中空格分隔的标记。 请参阅下面的代码示例。
存储优化:请参阅 like 运算符
标准{"column LIKE": "hello"}
存储优化"column LIKE 'hello'"
未指定筛选器运算符 标准:筛选检查是否完全匹配。 如果指定了多个值,则它与任何值匹配。
存储优化:请参阅 =(等号)运算符in 谓词
标准{"id": 200}{"id": [200, 300]}
存储优化"id = 200""id IN (200, 300)"
to_timestamp (仅限存储优化终结点) 存储优化:根据时间戳进行筛选。 请参见 to_timestamp 函数 存储优化"date > TO_TIMESTAMP('1995-01-01')"

请参阅以下代码示例:

Python SDK 标准终结点

# 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
    )

Python SDK 存储优化的终结点

# 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
    )

REST API

请参阅 POST /api/2.0/vector-search/indexes/{index_name}/query

LIKE

LIKE 例子

{"column LIKE": "apple"}:与字符串“apple”和“apple pear”匹配,但与“pineapple”或“pear”不匹配。 请注意,即使包含“apple”子字符串,也与“pineapple”不匹配,它查找的是包含空格分隔标记的完全匹配内容,例如“apple pear”。

{"column NOT LIKE": "apple"} 则相反。 它匹配“菠萝”和“梨”,但不匹配“苹果”或“苹果梨”。

在查询中使用重新调用程序

代理性能取决于检索查询的最相关信息。 重新调整是一种技术,通过评估检索的文档来识别语义上最相关的文档,从而提高检索质量。 Databricks 开发了一个基于研究的复合 AI 系统,用于识别这些文档。 还可以指定包含希望重新创建器用于其他上下文的元数据的列,因为它评估每个文档的相关性。

重新调用会产生较小的延迟延迟,但可以显著提高检索质量和代理性能。 Databricks 建议尝试重新调整任何 RAG 代理用例。

本节中的示例演示如何使用矢量搜索重新创建器。 使用重新ranker 时,将列设置为返回(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

# 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"])
    )

REST API

若要确保获得延迟信息,请设置为 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}'

点查找

若要执行点查找,请对任何主键列使用筛选器。