亚马逊AWS官方博客
Amazon S3 Vectors 现在支持元数据预筛选,以提高筛选搜索的召回率
今天,我们宣布推出 Amazon S3 Vectors 的元数据预筛选功能,该功能通过在相似度搜索之前评估您的元数据筛选条件,提高筛选查询的召回率。您可以筛选租户、类别、状态或时间等属性,并且预筛选为路径、URL 和分层键增加了使用 $startsWith 的前缀匹配功能。每个向量最多可承载 2 KB 的可筛选元数据,单个查询最多支持 100 个筛选条件约束。没有额外费用,无需重新摄取,也不会更改您的查询。
大多数应用程序从不搜索整个索引。它们搜索其中属于特定用户、账户或类别的部分,并将该范围表示为元数据筛选条件。语义搜索、检索增强生成(RAG)和智能体应用程序都需要筛选后的查询中的相同内容:相似度搜索涵盖与筛选条件匹配的向量,并返回其中最接近的向量。通过预筛选,筛选后的查询会返回更多索引包含的相关匹配项,从而提高筛选搜索的召回率。
常见使用案例
如果结果必须相关且范围正确,则适用预筛选:
- 法律和专业服务:律师事务所或电子发现平台搜索仅限于单个客户的文档,使用
$startsWith,可以根据案件号、文件夹路径或文档 ID 前缀进一步缩小范围。单个客户在全公司档案中只占一小部分,而这种范围缩小的筛选条件是预筛选最能提高召回率的情况。 - 金融服务:投资研究平台按签发者、文档类型和出版日期搜索分析师笔记、申报文件和电话记录。
- 媒体和娱乐:流式传输服务在进行语义搜索之前按内容分级和区域许可进行筛选,查找仅限于在一个地区许可的 G 和 PG 内容的类似标题。
- 智能体应用程序:处理用户会话的智能体会筛选所有者、文档集和时间戳等字段,因此其搜索涵盖与手头任务相关的材料。更高的召回率意味着有更多的材料到达智能体处,这提高了任务的可靠性
预筛选的工作原理
S3 Vectors 索引中的每个向量都可以承载应用程序定义的元数据,查询可以对这些字段进行筛选。
每个向量索引都有索引模式。在索引模式为 ENHANCED 的索引上,S3 Vectors 首先解析您的筛选条件,然后仅搜索匹配的向量。在索引模式为 CLASSIC 的索引上,S3 Vectors 同时执行向量搜索和筛选条件评估,在搜索时根据您的筛选条件对每个候选向量进行验证。现有索引在更新之前使用 CLASSIC。
以一个包含 800 万张工单的支持知识库为例,智能体在其中搜索一位客户的历史记录中是否存在反复出现的错误。如果该客户占其中 400 张工单,则首先解析 customer_id 就意味着相似度搜索会在这 400 张工单中运行,因此智能体可以看到该客户此前的发生记录。在索引更新之前,同一查询从全部 800 万张中抽取候选结果,结果集包含的该客户的匹配工单较少。
对于高选择性筛选条件,预筛选返回的匹配向量数量最多为此前在 CLASSIC 索引上执行同一查询时的 5 倍。
开始使用
开始之前,请确保您的 IAM 策略为新操作授予权限。
您可以通过三个步骤开始使用。下面的演练构建了一个小型产品目录索引并对其运行选择性筛选条件,与多租户 RAG 存储或仅限于一个客户的文档搜索所使用的模式相同。
首先,创建向量索引:
aws s3vectors create-index \
--index-name product-catalog \
--vector-bucket-name my-vector-bucket \
--dimension 1536 \
--distance-metric cosine
dimension 必须与嵌入模型的输出大小相匹配,distance-metric 应与该模型的训练方式相匹配(cosine 在文本嵌入中很常见)。其次,使用 PutVectors API 编写向量,为每个向量附加最多 2KB 的可筛选元数据:
aws s3vectors put-vectors \
--index-name product-catalog \
--vector-bucket-name my-vector-bucket \
--vectors '[{
"key": "doc-001",
"data": {"float32": [0.1, 0.2, 0.3, ...]},
"metadata": {
"tenant_id": "t-10428",
"category": "legal",
"created_date": "2026-03-15",
"active": true
}
}]'
每个向量都承载应用程序筛选条件所依据的属性。在此示例中,tenant_id 将结果范围限定为单个客户,category 按文档类型缩小范围,created_date 记录创建文档的时间,active 是一个布尔标志。默认情况下,每个元数据字段都是可筛选的,因此您可以查询其中任何一个字段,而无需预先声明架构。
第三,使用 QueryVectors API 运行经过筛选的相似度查询。筛选条件使用紧凑的 JSON 语法,其中裸键值对是等值匹配,而 $and、$or 和 $gt 等运算符组合或细化条件。传递 --return-metadata,这样查询就会返回每个向量的元数据:
aws s3vectors query-vectors \
--index-name product-catalog \
--vector-bucket-name my-vector-bucket \
--query-vector '{"float32": [0.1, 0.2, 0.3, ...]}' \
--top-k 50 \
--return-metadata \
--filter '{"$and": [
{"tenant_id": "t-10428"},
{"category": "legal"},
{"active": true}
]}'
预期结果是一个单一的向量,即 doc-001,这是唯一符合所有三个筛选条件(tenant_id、category 和 active)的向量:
{
"vectors": [
{
"distance": 0.9717477560043335,
"key": "doc-001",
"metadata": {
"tenant_id": "t-10428",
"category": "legal",
"created_date": "2026-03-15",
"active": true
}
}
],
"distanceMetric": "cosine"
}
S3 Vectors 首先将搜索空间缩小到匹配所有三个筛选条件的向量,然后返回该子集中 50 个最相似的向量。由于筛选条件是在搜索之前应用的,因此这些结果是从与之匹配的所有向量中抽取的。
使用 $startsWith 进行前缀匹配
预筛选添加了前缀匹配运算符,用于筛选路径、URL 和分层键。将大小写和文件夹结构编码为文档 ID 的文档存储可以在一个条件下将搜索范围限定为子树:
--filter '{"$startsWith": {"document_id": "matter-4417/exhibits/"}}'
$startsWith 加入了现有运算符之列:等式、数值范围、集成员资格、存在性检查,以及使用 $and 和 $or 的布尔逻辑。
开启现有索引的预筛选
对现有索引调用 UpdateIndexMode 以开启预筛选:
aws s3vectors update-index-mode \
--vector-bucket-name my-vector-bucket \
--index-name product-catalog \
--index-mode ENHANCED
预筛选已生效。您的现有向量不会被重新摄取,您的查询不会更改,新的筛选条件运算符立即可用。
这是同一个索引和同一个查询的区别。更新之前,范围为一个租户的查询会返回所请求的十个结果中的两个:
aws s3vectors query-vectors \
--vector-bucket-name my-vector-bucket \
--index-name product-catalog \
--query-vector '{"float32": [0.1, 0.2, 0.3, ...]}' \
--top-k 10 \
--return-metadata \
--filter '{"tenant_id": "t-10428"}'
{
"vectors": [
{ "key": "doc-114", "distance": 0.41 },
{ "key": "doc-322", "distance": 0.55 }
],
"distanceMetric": "cosine"
}
更新后,同一个查询会返回从该租户文档中提取的完整结果集:
{
"vectors": [
{ "key": "doc-018", "distance": 0.09 },
{ "key": "doc-207", "distance": 0.13 },
{ "key": "doc-114", "distance": 0.41 },
...7 more
],
"distanceMetric": "cosine"
}
在您的索引中推广
验证索引的预筛选后,在向量存储桶上设置默认索引模式,以便新索引无需后续调用即可使用 ENHANCED:
aws s3vectors put-vector-bucket-default-index-mode \
--vector-bucket-name my-vector-bucket \
--default-index-mode ENHANCED
要查看现有索引的其余部分,请将其列出并检查每个索引的索引模式,然后对仍在使用 CLASSIC 的索引调用 UpdateIndexMode:
aws s3vectors list-indexes \
--vector-bucket-name my-vector-bucket
aws s3vectors get-index \
--vector-bucket-name my-vector-bucket \
--index-name product-catalog
注意事项
- 在 2026 年 9 月 30 日当天或之后创建的向量存储桶中创建的索引使用索引模式 ENHANCED。在该日期之前存在的存储桶中的索引在您设置存储桶默认值之前使用 CLASSIC,包括之后在这些存储桶中创建的索引。
- 单个查询最多支持 100 个筛选条件约束,按筛选条件评估的值计算。如果查询超出该范围,您通常可以合并筛选条件,例如,用单个 caseId 字段替换针对法律案例的包含 300 个值的 $in,或者将其拆分成较小的查询,并行运行,然后按距离合并结果。
立即开始使用
元数据预筛选已在所有提供 Amazon S3 Vectors 的商业 AWS 区域以及 AWS 中国区域推出,不收取额外费用。您需要为存储、PUT 请求和查询支付标准 S3 Vectors 定价。有关完整的定价详细信息,请访问 Amazon S3 定价页面。要了解区域可用性,请访问 Amazon S3 Vectors 区域和配额。
无论您是将 RAG 应用程序的范围限定为一个租户,将智能体的搜索范围限定为一个用户的文档,还是将目录搜索范围缩小到许可窗口,预筛选都允许您在不牺牲召回率的情况下应用这些筛选条件。要了解更多信息并开始使用,请访问 Amazon S3 Vectors 文档。请将反馈发送至 AWS re:Post for S3 或通过您常用的 AWS Support 联系方式发送反馈。
— Daniel Abib