30 秒看懂
Bridgewater Associates 产品工程负责人 Aaron Linsky 介绍了公司的 Vault:其中存有约 1 亿份外部和内部文档,每份文档都有各自的权限规则。AI 分析师需要检索私有研究资料,同时确保用户只能看到自己有权访问的内容。Vault 的规模扩大后,Bridgewater 最初的搜索方案很快失效。 随后,turbopuffer 首席技术官 Nikhil Benesch 说明他们的搜索引擎如何平衡权限过滤与向量搜索。后置过滤会漏掉相关且有权访问的文档,前置过滤则可能迫使系统缓慢扫描;turbopuffer 的原生过滤把文档权限和向量簇结合起来。团队称,在数亿个向量上搜索的 P90 延迟约为 120 毫秒,同时也指出嵌套群组和元数据更新等运维难题。
- 1权限是 AI 搜索的一部分Nikhil Benesch 将 AI 分析师描述为一个同时搜索公开信息和公司私有文档的循环。公开搜索结果通常人人可见,但邮件、会议记录和研究报告各自可能有不同的访问规则。
- 2Bridgewater 的 Vault 收录 1 亿份文档Aaron Linsky 介绍了一个由授权外部研究资料、内部写作、录音和报告组成的文档库。不同来源有不同的权限约束,投资人员和 AI agent 都会从 Vault 读取内容。
- 3暴力扫描达不到延迟目标按每份文档 1 KB 计算,Benesch 估算从内存扫描 1 亿份文档约需 5 秒,远高于约 100 毫秒的搜索目标。若数据还在冷对象存储中,完整扫描会更慢。
- 4后置过滤牺牲召回率先找最近邻、再删除无权访问的结果,可能会留下很少的有用文档。用户可能知道有一份相关且有权查看的文件,但搜索会在超时或达到结果上限前都找不到它。
- 5前置过滤牺牲速度先找出用户能访问的所有文档再扫描,可以恢复召回率,却可能把查询变成暴力搜索。如果用户能访问 1 亿份 Vault 文档中的一半,扫描范围仍然太大。
- 6原生过滤同时使用两种索引turbopuffer 将向量索引与权限索引结合起来,排除不含用户可访问文档的向量簇,再搜索最近的合格簇并扫描其中的文档。
- 7系统报告的搜索延迟为 120 毫秒Benesch 报告称,在 4.5 亿个向量和 400 个搜索命名空间上,搜索延迟约为 P90 120 毫秒。用户通过过滤器表达权限规则,turbopuffer 则负责大规模应用这些规则所需的查询规划。
要点建议
- 企业 AI 分析师必须在整个检索过程中执行每份文档的权限规则,而不能等生成答案后才过滤。
- 大型非结构化研究库只有在可搜索且权限得到妥善保护时才有价值。
- 先找最近邻、再做后置过滤会导致召回率偏低,因为最接近的文档可能无权向用户展示。
- 对所有获准访问的文档做前置过滤虽然能保住召回率,但在企业级规模下可能太慢。
- 将权限索引与向量簇结合,可以缩小搜索范围,同时保留相关且用户有权访问的结果。
- 看似简单的权限表达式背后,可能隐藏着复杂的查询规划和持续的元数据维护工作。
按章节阅读完整文稿
AI 分析师为何需要权限控制
Nikhil Benesch 介绍了一个同时搜索公开网络与组织内部文档的 AI 分析师。内部文档可能按用户或群组设置不同权限,检索时必须遵守这些规则。
turbopuffer 首席技术官 Nikhil Benesch 和 Bridgewater Associates 产品工程负责人 Aaron Linsky 提出一个问题:怎样构建一位能保守秘密的 AI 分析师?在一个简化流程中,用户提出问题后,AI agent 会搜索证据并展开调查。有些证据来自公开网络,人人都能看到同样的文档;另一些则来自组织内部数据,访问权限因人和文档而异。
一家公司的邮件、会议记录和报告可能各有不同权限,既可能按群组授权,也可能单独指定用户。这就形成了一个棘手的信息检索问题:分析师需要找到相关文档,却不能把所有文档都展示给所有用户。Benesch 表示,turbopuffer 专门设计来解决这种权限感知搜索问题,随后他请 Linsky 说明这对 Bridgewater 的意义。
Bridgewater 的研究流程
Aaron Linsky 介绍 Bridgewater 如何系统化理解市场:从手写规则,经由软件逐步发展,再走向以机器为中心的研究。流程包括观察世界、提出假设、调查验证,再将经得起检验的成果整合起来。
Linsky 说,Bridgewater 花了 50 年探索市场与经济如何运作,再把这种理解编码成逻辑,并随着时间推移反复压力测试。早期的债券交易系统只是一张黄色便笺纸,上面写着一组 if-then 规则。此后流程逐渐从 Excel 迁移到 Scala 和 Python,始终以人为中心;现在公司正尝试让机器在这一学习过程中发挥更核心的作用。
Bridgewater 将研究流程称为一个五步循环:感知外部世界的变化,提出变化原因的假设,调查假设是否成立,把有效的结论系统化,再将其产业化并每天运行。Linsky 说自己在 Bridgewater 工作了约 20 年。要让人和机器都参与这一流程,就需要高质量数据,既包括时间序列数据,也包括非结构化研究资料。
Vault 与它的权限模型
Bridgewater 的 Vault 收录约 1 亿份外部和内部文档,包括授权研究资料、公司报告和会议记录。每种来源都可能有不同的访问规则;随着文档库扩大,Bridgewater 最初的搜索实现失效了。
Bridgewater 的 Vault 收录约 1 亿份由公司索引、整理并加以保护的文档。其中包括来自 135 个外部来源的资料。每个来源都可能有不同权限,Bridgewater 的法务和数据团队需要逐一谈判并取得授权。此外,Vault 也收录公司的内部写作、会议录音和报告。投资人员和 AI agent 会读取 Vault,双方生成的新内容也可能回流到其中。
Linsky 用一个简化例子解释权限模型:用户属于一些群组,每份文档则可以授权给特定用户或群组。查询既要匹配内容,也要符合查看者的权限。Bridgewater 最初没有使用 turbopuffer,自行实现了这种查询,并以为它能正常工作;但随着 Vault 增加更多文档,系统很快就撑不住了。于是他们寻找替代方案,测试了 turbopuffer,并找到了应对大规模检索的方法。
构建在对象存储之上的搜索引擎
Benesch 说明 turbopuffer 如何把数据存放在云对象存储中,并在查询时将活跃数据调入更快的存储。它支持多种搜索方式,而本次演讲聚焦于向量搜索及权限感知检索的难题。
Benesch 将 turbopuffer 描述为一种快速、可扩展且成本低的搜索引擎,底层使用 S3、Google Cloud Storage 或 Azure Blob Storage 等云对象存储。数据可以冷存储在低成本介质中,等查询需要时再调入 SSD 或内存等更快的存储。查询所需数据进入缓存后,访问速度就会很快;不常访问的数据则可以继续留在对象存储中。
Benesch 表示,这种架构能以低得多的成本扩展到数 TB 数据,同时在数据进入热缓存后提供可比于传统磁盘搜索系统的性能。turbopuffer 支持关键词搜索、正则表达式搜索和向量搜索。为了深入讲解权限问题及其权衡,他把演讲重点放在向量搜索上。
暴力搜索为何无法扩展
即便从内存中扫描,遍历 1 亿份文档也要花数秒,远超搜索的延迟目标。向量索引可以将搜索范围缩小到附近的嵌入,但权限会使简单的最近邻搜索变得复杂。
Benesch 从最简单的基线方案讲起:逐一比较查询与所有存储文档,再返回最接近的结果。即使非常保守地假设每份文档只有 1 KB,1 亿份文档也占 100 GB。按每秒约 20 GB 的内存带宽计算,扫描这批数据大约要 5 秒,而常见搜索工作负载希望结果能在约 100 毫秒内返回。如果数据还冷存在对象存储中,把它们全部读出来会更慢。
向量索引不必将查询与整个文档集合逐一比较。向量嵌入会把概念表示为高维空间中的点:搜索“红鞋”时,查询应该靠近关于“栗色凉鞋”的文档,远离关于“混凝土块”的文档。系统只需在查询向量附近搜索,无须遍历每份文档。向量嵌入通常有约 1,000 个维度;图中为了便于说明,将它简化成二维空间。
最近邻索引把搜索范围缩小到查询附近的向量,因此加快了相似度搜索。但加入权限检查后,问题就复杂了:最近的文档可能对当前用户隐藏起来,而获准访问的文档可能离得更远。若部分最近结果未经授权,索引就不能直接返回最近邻。Benesch 说,turbopuffer 投入了大量精力,专门解决向量相似度与过滤条件之间的冲突。
后置过滤会降低召回率
如果系统先找最近邻,再删除无权访问的文档,相关且获准访问的结果可能落在已检索集合之外。系统可能在找到足够多的可访问文档前就停止搜索。
一种看似直接的做法是后置过滤:先检索最近的向量,再删除用户无权访问的文档。它速度快,也使用了向量索引,但召回率可能很差。用户获准查看的相关文档可能因为被无权访问的近邻占据了排名位置而落选;即使继续向外搜索,也可能先触及时间上限,还没找到足够多的可访问文档。
前置过滤可能太慢
先筛出用户能访问的所有文档,再计算向量距离,可以保住召回率,但可能要扫描数千万份文档。这样就失去了向量索引带来的速度优势。
另一种做法是先应用权限,再比较用户能访问的每份文档与查询向量的距离。这样能返回最接近的获准结果,但如果 Aaron 可以访问 Vault 中 1 亿份文档里的 5,000 万份,系统仍然要扫描极大的集合。这种办法失去了向量索引的速度优势,可能耗时数秒乃至数分钟,所以单靠前置过滤也不够。
原生过滤结合权限与向量簇
turbopuffer 通过权限索引找出含有可访问文档的向量簇,再搜索附近的合格簇并扫描其中的文档。Benesch 认为,这种组合既能保住有效召回,又能避免宽泛的后置过滤和大规模前置扫描。
Benesch 称 turbopuffer 的方案为“原生过滤”,它结合了前面两种策略。向量索引会把相似文档归入不同簇,权限索引则会标出哪些簇至少含有一份用户可访问的文档。系统可以排除没有合格文档的簇,搜索最近的剩余簇,再扫描簇内文档。Benesch 说,目前每个簇约有 200 份文档,团队还在继续调整这个数值。
Benesch 表示,将向量索引与权限索引结合后,大规模过滤搜索才变得可行。他报告称,系统在 4.5 亿个向量和 400 个命名空间上实现了约 120 毫秒的搜索延迟;他在口头说明中把这个数字称为 P90。关键设计是围绕向量簇结合前置与后置过滤,而不是只依赖其中一种策略。
延迟、权限过滤与局限
Benesch 报告称,在 4.5 亿个向量和 400 个命名空间上,搜索的 P90 延迟为 120 毫秒,并展示了如何把权限规则转换成过滤器。嵌套群组和群组成员变更仍是运维难题;更广泛的目标是让搜索能感知组织和基础设施层面的隔离要求。
客户可以使用 turbopuffer 的过滤语法表达自己的权限模型。例如,查询可要求查看者身份匹配、用户属于指定群组之一,并且文档尚未删除。客户表达的规则相对简单,turbopuffer 则会在底层负责复杂的查询规划,从而在 1 亿份文档的规模上高效应用过滤器。
这个方案也有局限。嵌套群组会让权限更复杂;群组成员变更后,可能需要更新大量文档的元数据。Benesch 表示,turbopuffer 正努力让更多情况自动化处理,也欢迎遇到此类问题的团队与他们交流。他将权限过滤视为更广泛的隔离感知搜索工作的一部分。
除了文档权限,turbopuffer 还希望构建原生支持隔离的搜索能力。根据组织的安全和监管要求,这可能涉及区域数据驻留、将数据留在客户自己的 VPC 中、静态存储和缓存加密、专用计算资源,或由客户自行控制密钥。Benesch 将这些称为不同层级的隔离,而文档级权限过滤只是其中一层。
Benesch 最后将 Bridgewater 与 turbopuffer 的合作总结为:在大型研究库中实现快速且尊重权限的搜索。他向观众致谢,演讲随之结束。
同频道的其他文章
19:43EN → 简体中文
20:55EN → 简体中文
18:27EN → 简体中文
35:19EN → 简体中文
20:58EN → 简体中文
18:31EN → 简体中文