Mosaic AI 矢量搜索

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

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

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

马赛克 AI 矢量搜索支持以下各项:

马赛克 AI 矢量搜索的工作原理是什么?

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

Mosaic AI 矢量搜索还支持混合关键字相似性搜索,将基于矢量的嵌入搜索与传统的基于关键字的搜索技术相结合。 此方法匹配查询中的确切字词,同时使用基于矢量的相似性搜索来捕获查询的语义关系和上下文。

通过整合这两种技术,混合关键字相似性搜索不仅可以检索包含确切关键字的文档,而且还可以检索包含概念上相似的关键字的文档,从而提供更全面、更相关的搜索结果。 该方法在 RAG 应用程序中特别有用,其中源数据具有独特的关键字(例如 SKU 或标识符),不太适合纯相似性搜索。

有关 API 的详细信息,请参阅 Python SDK 参考查询矢量搜索终结点

相似度搜索计算

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

1 加上距离平方的倒数

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

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

关键字搜索算法

相关性评分是使用 Okapi BM25 计算的。 搜索所有文本或字符串列,包括源文本嵌入和文本或字符串格式的元数据列。 词汇切分函数在字词边界处拆分,删除标点符号并将所有文本转换为小写。

如何结合相似性搜索和关键字搜索

使用倒数秩融合 (RRF) 函数将相似性搜索和关键字搜索结果相结合。

RRF 使用评分对每种方法中的每个文档进行重新评分:

RRF 公式

在上面的公式中,排名从 0 开始,对每个文档的评分求和并返回评分最高的文档。

rrf_param 控制排名较高和排名较低的文档的相对重要性。 根据文献,rrf_param 设置为 60。

使用以下公式对评分进行规范化,使最高评分为 1,最低评分为 0:

规范化

用于提供矢量嵌入的选项

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

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

    下图演示了此概过程:

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

    矢量数据库,Databricks 计算嵌入

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

    下图演示了此概过程:

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

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

  • 选项 3:直接矢量访问索引 嵌入表发生更改时,必须使用 REST API 手动更新索引。

    下图演示了此概过程:

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

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

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

此外,如果选择让 Databricks 计算嵌入,则可以使用预配置的基础模型 API 终结点或创建模型服务终结点来为所选的嵌入模型提供服务。 有关说明,请参阅“按令牌付费的基础模型 API”《创建生成式 AI 模型服务终结点》

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

要求

使用访问控制列表配置创建和管理矢量搜索终结点的权限。 请参阅 矢量搜索终结点 ACL

数据保护和身份验证

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

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

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

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

客户管理的密钥 (CMK) 在 2024 年 5 月 8 日或之后创建的终结点上受支持。

监视使用情况和成本

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

WITH all_vector_search_usage (
  SELECT *,
         CASE WHEN usage_metadata.endpoint_name IS NULL
              THEN 'ingest'
              ELSE 'serving'
        END as workload_type
    FROM system.billing.usage
   WHERE billing_origin_product = 'VECTOR_SEARCH'
),
daily_dbus AS (
  SELECT workspace_id,
       cloud,
       usage_date,
       workload_type,
       usage_metadata.endpoint_name as vector_search_endpoint,
       SUM(usage_quantity) as dbus
 FROM all_vector_search_usage
 GROUP BY all
ORDER BY 1,2,3,4,5 DESC
)
SELECT * FROM daily_dbus

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

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

获取笔记本

资源和数据大小限制

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

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

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

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

以下限制适用于查询 API。

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

限制

  • 不支持行级和列级权限。 但是,你可以使用筛选器 API 实现自己的应用程序级 ACL。

其他资源