本文概述了马赛克 AI 矢量搜索,包括它是什么及其工作原理。
什么是 Mosaic AI 矢量搜索?
马赛克 AI 矢量搜索是一种矢量搜索解决方案,内置于 Databricks 数据智能平台中,并与其治理和生产力工具集成。 矢量搜索是一种经过优化的搜索,用于检索嵌入内容。 嵌入是数据(通常是文本或图像数据)语义内容的数学表示。 嵌入由大型语言模型生成,是许多生成式 AI 应用程序的关键组成部分,依赖于查找彼此相似的文档或图像。 例如 RAG 系统、推荐器系统以及图像和视频识别。
借助 Mosaic AI 矢量搜索,可以从 Delta 表创建矢量搜索索引。 该索引包含带有元数据的嵌入数据。 然后,可以使用 REST API 查询索引,以识别最相似的向量并返回关联的文档。 可以构造索引,以在基础 Delta 表更新时自动同步。
马赛克 AI 矢量搜索支持以下各项:
- 混合关键字相似性搜索。
- 筛选。
- 用于管理矢量搜索终结点的访问控制列表(ACL)。
- 仅同步所选列。
- 保存并同步生成的嵌入内容。
马赛克 AI 矢量搜索的工作原理是什么?
Mosaic AI 矢量搜索使用分层可导航小世界 (HNSW) 算法进行近似最近邻域搜索,并使用 L2 距离距离指标来衡量嵌入矢量相似性。 如果要使用余弦相似性,需要在将数据点嵌入内容输入到矢量搜索之前对其进行规范化。 当数据点被规范化时,L2 距离产生的排名与余弦相似性产生的排名相同。
Mosaic AI 矢量搜索还支持混合关键字相似性搜索,将基于矢量的嵌入搜索与传统的基于关键字的搜索技术相结合。 此方法匹配查询中的确切字词,同时使用基于矢量的相似性搜索来捕获查询的语义关系和上下文。
通过整合这两种技术,混合关键字相似性搜索不仅可以检索包含确切关键字的文档,而且还可以检索包含概念上相似的关键字的文档,从而提供更全面、更相关的搜索结果。 该方法在 RAG 应用程序中特别有用,其中源数据具有独特的关键字(例如 SKU 或标识符),不太适合纯相似性搜索。
有关 API 的详细信息,请参阅 Python SDK 参考和查询矢量搜索终结点。
相似度搜索计算
相似度搜索计算使用以下公式:
其中 dist
是查询 q
与索引条目 x
之间的欧氏距离:
关键字搜索算法
相关性评分是使用 Okapi BM25 计算的。 搜索所有文本或字符串列,包括源文本嵌入式数据和以文本或字符串格式的元数据列。 词汇切分函数在字词边界处拆分,删除标点符号并将所有文本转换为小写。
如何结合相似性搜索和关键字搜索
使用倒数秩融合 (RRF) 函数将相似性搜索和关键字搜索结果相结合。
RRF 使用以下分数对每个方法中的每个文档进行重新评分:
在上面的公式中,排名从 0 开始,对每个文档的评分求和并返回评分最高的文档。
rrf_param
控制排名较高和排名较低的文档的相对重要性。 根据文献,rrf_param
设置为 60。
使用以下公式对评分进行规范化,使最高评分为 1,最低评分为 0:
用于提供矢量嵌入的选项
若要在 Databricks 中创建矢量搜索索引,必须先决定如何提供矢量嵌入。 Databricks 支持三个选项:
选项 1:包含由 Databricks 计算的嵌入的 Delta 同步索引 你提供包含文本格式的数据的源 Delta 表。 Databricks 使用指定的模型计算嵌入内容,并选择性地将嵌入内容保存到 Unity Catalog 的表中。 随着 Delta 表的更新,索引与 Delta 表保持同步。
下图演示了此概过程:
- 计算查询嵌入。 查询可以包含元数据筛选器。
- 执行相似性搜索以识别最相关的文档。
- 返回最相关的文档并将其追加到查询中。
选项 2:包含自管理嵌入的 Delta 同步索引 你提供一个包含预先计算嵌入的 Delta 源表。 随着 Delta 表的更新,索引与 Delta 表保持同步。
下图演示了此概过程:
- 查询由嵌入组成,可以包含元数据筛选器。
- 执行相似性搜索以识别最相关的文档。 返回最相关的文档并将其追加到查询中。
矢量搜索索引,预先计算的嵌入
选项 3:直接矢量访问索引 嵌入表发生更改时,必须使用 REST API 手动更新索引。
下图演示了此概过程:
终结点选项
马赛克 AI 矢量搜索提供以下选项,以便你可以选择满足应用程序需求的终结点配置。
注释
存储优化终结点以公共预览版提供,可在以下区域使用:eastus
、eastus2
、westus
、westus2
、westeurope
。
- 标准 终结点的容量为 3.2 亿向量(维度为 768)。
- 存储优化 终结点具有更大的容量(维度 768 处的 10 亿多个向量),并提供 10-20 倍更快的索引编制。 对存储优化端点的查询延迟略微增加约 250毫秒。 此选项的定价针对大量向量进行优化。 有关定价详细信息,请参阅 矢量搜索定价页。 有关管理矢量搜索成本的信息,请参阅 马赛克 AI 矢量搜索:成本管理指南。
创建终结点时指定终结点类型。
另请参阅 存储优化终结点限制。
如何设置 Mosaic AI 矢量搜索
若要使用 Mosaic AI 矢量搜索,必须创建以下内容:
矢量搜索终结点。 此终结点提供矢量搜索索引。 你可以使用 REST API 或 SDK 查询和更新终结点。 有关说明,请参阅创建矢量搜索终结点。
端点会自动扩展,以支持索引的大小或并发请求的数量。 删除索引时,存储优化终结点会自动缩减。 标准终结点不会自动缩减。
矢量搜索索引。 矢量搜索索引是从 Delta 表创建的,经过优化以提供实时近似最近邻域搜索。 搜索的目标是识别与查询相似的文档。 矢量搜索索引显示在 Unity Catalog 中,并受其管理。 有关说明,请参阅创建矢量搜索索引。
此外,如果选择让 Databricks 计算嵌入,则可以使用预配置的基础模型 API 终结点或创建模型服务终结点来为所选的嵌入模型提供服务。 有关说明,请参阅 按令牌付费的基础模型 API,或 创建基础模型服务终结点。
若要查询模型服务终结点,请使用 REST API 或 Python SDK。 查询可以根据 Delta 表中的任何列定义筛选器。 有关详细信息,请参阅在查询时使用筛选器、API 参考或 Python SDK 参考。
要求
- 已启用 Unity Catalog 的工作区。
- 已启用无服务器计算。 有关说明,请参阅连接到无服务器计算。
- 对于 标准终结点,源表必须启用更改数据馈送。 请参阅在 Azure Databricks 上使用 Delta Lake 更改数据馈送。
- 若要创建矢量搜索索引,必须在要在其中创建索引的目录架构上拥有 CREATE TABLE 权限。
使用访问控制列表配置创建和管理矢量搜索终结点的权限。 请参阅矢量搜索终结点 ACL。
数据保护和身份验证
Databricks 实施以下安全控制来保护数据:
- 客户对 Mosaic AI 矢量搜索发出的每个请求都经过逻辑隔离、身份验证和授权。
- Mosaic AI 矢量搜索会加密所有静态数据 (AES-256) 和传输中数据 (TLS 1.2+)。
马赛克 AI 矢量搜索支持两种身份验证模式、服务主体和个人访问令牌(PAT)。 对于生产应用程序,Databricks 建议使用服务主体,相对于个人访问令牌,每个查询的性能最多可提高 100 毫秒。
服务主体令牌。 管理员可以生成服务主体令牌并将其传递给 SDK 或 API。 请参阅使用服务主体。 对于生产用例,Databricks 建议使用服务主体令牌。
# Pass in a service principal vsc = VectorSearchClient(workspace_url="...", service_principal_client_id="...", service_principal_client_secret="..." )
个人访问令牌。 可以使用个人访问令牌通过马赛克 AI 矢量搜索进行身份验证。 请参阅个人访问身份验证令牌。 如果在笔记本环境中使用 SDK,则 SDK 会自动生成 PAT 令牌进行身份验证。
# Pass in the PAT token client = VectorSearchClient(workspace_url="...", personal_access_token="...")
客户管理的密钥 (CMK) 在 2024 年 5 月 8 日或之后创建的终结点上受支持。
监视使用情况和成本
通过可计费用量系统表可以监视与矢量搜索索引和终结点关联的用量和成本。 下面是一个示例查询:
WITH all_vector_search_usage (
SELECT *,
CASE WHEN usage_metadata.endpoint_name IS NULL THEN 'ingest'
WHEN usage_type = "STORAGE_SPACE" THEN 'storage'
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,
CASE WHEN workload_type = 'serving' THEN SUM(usage_quantity)
WHEN workload_type = 'ingest' THEN SUM(usage_quantity)
ELSE null
END as dbus,
CASE WHEN workload_type = 'storage' THEN SUM(usage_quantity)
ELSE null
END as dsus
FROM all_vector_search_usage
GROUP BY all
ORDER BY 1,2,3,4,5 DESC
)
SELECT * FROM daily_dbus
还可以按预算策略查询使用情况。 请参阅 马赛克 AI 矢量搜索:预算策略。
有关计费用量表内容的详细信息,请参阅可计费用量系统表参考。 以下示例笔记本中提供了其他查询。
矢量搜索系统表查询笔记本
资源和数据大小限制
下表汇总了矢量搜索终结点和索引的资源和数据大小限制:
资源 | 粒度 | 限制 |
---|---|---|
矢量搜索终结点 | 每个工作区 | 100 |
嵌入 | 每个终结点 | 大约 3.2 亿 个嵌入维度在 768 维度下 约 1.6 亿,在 1536 嵌入维度 约 80,000,000 个在 3072 嵌入维度 (大约线性缩放) |
嵌入维度 | 每个索引 | 4096 |
索引 | 每个终结点 | 50 |
列 | 每个索引 | 50 |
列 | 支持的类型:Bytes、short、integer、long、float、double、boolean、string、timestamp、date | |
元数据字段 | 每个索引 | 50 |
索引名称 | 每个索引 | 128 个字符 |
以下限制适用于矢量搜索索引的创建和更新:
资源 | 粒度 | 限制 |
---|---|---|
增量同步索引的行大小 | 每个索引 | 100KB |
增量同步索引的嵌入源列大小 | 每个索引 | 32764 字节 |
Direct Vector 索引的批量更新插入请求大小限制 | 每个索引 | 10MB |
直接矢量索引的批量删除请求大小限制 | 每个索引 | 10MB |
以下限制适用于查询 API。
资源 | 粒度 | 限制 |
---|---|---|
查询文本长度 | 每个查询 | 32764 字节 |
返回的最大结果数(近似最近的邻居搜索) | 每个查询 | 一万 |
返回的最大结果数(混合关键字相似性搜索) | 每个查询 | 200 |
限制
- 保留列名
_id
。 如果源表有一个名为_id
列,请在创建矢量搜索索引之前对其进行重命名。 - 不支持行级和列级权限。 但是,你可以使用筛选器 API 实现自己的应用程序级 ACL。
存储优化端点限制
本节中的限制仅适用于 存储优化终结点。 存储优化终结点处于公开预览阶段。
- 不支持连续同步模式。
- 不支持要同步的列。
- 嵌入维度必须除以 16。
- 不支持增量更新。 每次同步都会完全重新生成矢量搜索索引。
- 与标准终结点相比,应预计同步所需的端到端时间会显著减少。 嵌入 10 亿的数据集应在 8 小时内完成同步。 较小的数据集需要更少的时间来同步。
- 不支持 HIPAA、PCI 和 FedRAMP 兼容的工作区。
- 不支持客户管理的密钥(CMK)。
- 存储优化端点最多支持 10 亿个 768 维矢量的嵌入。 如果你有更大的规模用例,请联系你的帐户团队。