Databricks 矢量搜索

本文概述了 Databricks 的矢量数据库解决方案“Databricks 矢量搜索”,包括它是什么以及它的工作原理。

Databricks 矢量搜索是一个矢量数据库,内置于 Databricks Data Intelligence 平台中,并与其治理和生产力工具集成。 矢量数据库是一个经过优化的数据库,可存储和检索嵌入。 嵌入是数据(通常是文本或图像数据)语义内容的数学表示。 嵌入由大型语言模型生成,是许多 GenAI 应用程序的关键组成部分,这些应用程序依赖于查找彼此相似的文档或图像。 例如 RAG 系统、推荐器系统以及图像和视频识别。

借助矢量搜索,可以从 Delta 表创建矢量搜索索引。 该索引包含带有元数据的嵌入数据。 然后,可以使用 REST API 查询索引,以识别最相似的向量并返回关联的文档。 可以构造索引,以在基础 Delta 表更新时自动同步。

Databricks 矢量搜索使用分层可导航小世界 (HNSW) 算法进行近似最近邻域搜索,并使用 L2 距离距离指标来衡量嵌入矢量相似性。 如果要使用余弦相似性,需要在将数据点嵌入内容输入到矢量搜索之前对其进行规范化。 规范化数据点时,L2 距离产生的排名与余弦相似性产生的排名相同。

矢量搜索的工作原理是什么?

若要在 Databricks 中创建向量数据库,必须先决定如何提供矢量嵌入。 Databricks 支持三个选项:

  • 选项 1:提供包含文本格式的数据的源 Delta 表。 Databricks 使用指定的模型计算嵌入内容,并选择性地将嵌入内容保存到 Unity Catalog 的表中。 随着 Delta 表的更新,索引与 Delta 表保持同步。

    下图演示了此概过程:

    1. 计算查询嵌入。 查询可以包含元数据筛选器。
    2. 执行相似性搜索以识别最相关的文档。
    3. 返回最相关的文档并将其追加到查询中。

    矢量数据库,Databricks 计算嵌入

  • 选项 2:提供包含预先计算的嵌入的源 Delta 表。 随着 Delta 表的更新,索引与 Delta 表保持同步。

    下图演示了此概过程:

    1. 查询由嵌入组成,可以包含元数据筛选器。
    2. 执行相似性搜索以识别最相关的文档。 返回最相关的文档并将其追加到查询中。

    矢量数据库,预先计算的嵌入

  • 选项 3:提供包含预先计算的嵌入的源 Delta 表。 更新 Delta 表时未自动同步。 嵌入表发生更改时,必须使用 REST API 手动更新索引。

    下图演示了该过程,与选项 2 相同,只是当 Delta 表发生更改时,矢量索引不会自动更新:

    矢量数据库,预先计算的嵌入,不会自动同步

相似度搜索计算

相似度搜索计算使用以下公式:

1 加上距离平方的倒数

其中 dist 是查询 q 与索引条目 x 之间的欧氏距离:

欧氏距离,差值平方和的平方根

若要使用 Databricks 矢量搜索,必须创建以下内容:

  • 矢量搜索终结点。 此终结点提供矢量搜索索引。 你可以使用 REST API 或 SDK 查询和更新终结点。 终结点会自动缩放以支持索引的大小或并发请求的数量。 有关说明,请参阅创建矢量搜索终结点
  • 矢量搜索索引。 矢量搜索索引是从 Delta 表创建的,经过优化以提供实时近似最近邻域搜索。 搜索的目标是识别与查询相似的文档。 矢量搜索索引显示在 Unity Catalog 中,并受其管理。 有关说明,请参阅创建矢量搜索索引

此外,如果选择让 Databricks 计算嵌入,还必须为嵌入模型创建模型服务终结点。 请参阅创建基础模型服务终结点中的说明。

若要查询模型服务终结点,请使用 REST API 或 Python SDK。 查询可以根据 Delta 表中的任何列定义筛选器。 有关详细信息,请参阅在查询时使用筛选器API 参考Python SDK 参考

要求

  • 已启用 Unity Catalog 的工作区。
  • 已启用无服务器计算。
  • 源表必须启用“更改数据馈送”。
  • 目录架构中支持创建索引的 CREATE TABLE 权限。
  • 已启用个人访问令牌

数据保护和身份验证

Databricks 实施以下安全控制来保护数据:

  • 客户对矢量搜索发出的每个请求都经过逻辑隔离、身份验证和授权。
  • Databricks 矢量搜索会加密所有静态数据 (AES-256) 和传输中数据 (TLS 1.2+)。

Databricks 矢量搜索支持两种身份验证模式:

  • 个人访问令牌 - 可以使用个人访问令牌通过矢量搜索进行身份验证。 请参阅个人访问身份验证令牌。 如果在笔记本环境中使用该 SDK,它会自动生成 PAT 令牌进行身份验证。
  • 服务主体令牌 - 管理员可以生成服务主体令牌并将其传递给 SDK 或 API。 请参阅使用服务主体。 对于生产用例,Databricks 建议使用服务主体令牌。

监视矢量搜索用量和成本

通过可计费用量系统表可以监视与矢量搜索索引和终结点关联的用量和成本。 下面是一个示例查询:

SELECT *
FROM system.billing.usage
WHERE billing_origin_product = 'VECTOR_SEARCH'
  AND usage_metadata.endpoint_name IS NOT NULL

有关计费用量表内容的详细信息,请参阅可计费用量系统表参考。 以下示例笔记本中提供了其他查询。

矢量搜索系统表查询笔记本

获取笔记本

资源和数据大小限制

下表汇总了矢量搜索终结点和索引的资源和数据大小限制:

资源 粒度 限制
矢量搜索终结点 每工作区 100
嵌入 /终结点 100,000,000
嵌入维度 每个索引 4096
索引 /终结点 20
每个索引 20
支持的类型:Bytes、short、integer、long、float、double、boolean、string、timestamp、date
元数据字段 每个索引 20
索引名称 每个索引 128 个字符

以下限制适用于矢量搜索索引的创建和更新:

资源 粒度 限制
增量同步索引的行大小 每个索引 100KB
增量同步索引的嵌入源列大小 每个索引 32764 字节
直接矢量索引的批量 upsert 请求大小限制 每个索引 10MB
直接矢量索引的批量删除请求大小限制 每个索引 10MB

以下限制适用于矢量搜索的查询 API。

资源 粒度 限制
查询文本长度 每个查询 32764
返回的最大结果数 每个查询 10,000

限制

  • PrivateLink 目前仅限于一组选定的客户。 如果有兴趣将该功能与 PrivateLink 配合使用,请联系 Databricks 客户代表。
  • 不支持受管制的工作区,因此此功能不符合 HIPAA 要求。
  • 不支持行级和列级权限。 但是,你可以使用筛选器 API 实现自己的应用程序级 ACL。

其他资源