首页 时政热点 科技头条 智能AI 安全攻防 数码硬件 开发者生态 汽车 游戏 社会热点 开源推荐 医疗健康 归档 标签 关于

RIP,矢量数据库

摘要

RIP, vector database September 30, 2026 • Dan Harrison (Engineer) We are changing turbopuffer's storage architecture to take search to the next level. turbopuffer v3 changes how documents and indexes ...

the and vector turbopuffer search index storage but query with
2026-10-02 1 阅读 约8分钟阅读 razin
分享:
字号:
RIP,矢量数据库 2026 年 9 月 30 日 • Dan Harrison(工程师) 我们正在改变turbopuffer 的存储架构,以将搜索提升到一个新的水平。 turbopuffer v3 改变了文档和索引在turbopuffer 中的布局、写入、压缩和查询方式。它将使我们能够在各个方面提高搜索速度,包括矢量搜索,但它也为将更多 SQL 查询转移到turbopuffer 并提高速度奠定了基础。 Turbopuffer 作为无服务器矢量数据库 (v1) 推出,高度专业化,专门用于提供极其便宜且相当快速的矢量搜索服务。对象存储作为事实来源提供了经济性,分层 NVMe SSD/内存缓存提供了性能。这些特定权衡的价值得到了我们最早的客户(包括 Cursor 和 Notion)的验证。 Turbopuffer 发展到具有非常强大的文本和正则表达式搜索 (v2),并且被用于许多非搜索用例,例如 Linear 的同步引擎。查询引擎一直在发展以支持所有这些查询计划,但存储架构基本保持不变:ANN 向量索引过去是、现在仍然是所有其他索引和查询计划围绕的主索引。这种设计限制了多个查询计划,例如 GROUP BY 和聚合。我们已经尽可能地推动了向量主架构,是时候继续前进了。我们正在转向新的主索引,并使 ANN 成为“另一个”二级索引。我们认为打开大门并让您跟随可能会很有趣。对于第一次更新,我们将首先说明为什么要这样做。跟我一起走过从tpuf v1到今天的短暂旅程。 v1:ID 和向量 在turbopuffer 的第一个版本中,文档只包含ID 和向量。当时流行的智慧是基于图的向量索引,但分层聚类索引在对象存储中效果更好。我们从 SPANN 开始,最终迁移到 SPFresh 以支持增量索引。向量被聚类成组,组的质心依次聚类,重复形成单根树。 ┌─────────────────┐ │ 根质心 │ └─────────────────┘ ╱ │ ╲ ╱ │ ╲ ┌───────────────────┐ ┌───────────────────┐ ┌─────────────────┐ │ 叶质心│ │ 叶子质心 │ │ 叶子质心 │ └──────────────────┘ └──────────────────┘ └────────────────────┘ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ╱ ╲ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ ┌────────┐ │向量 │ │向量 │ │向量 │ │向量 │ │向量 │ │向量 │ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ └────────┘ ┌────────────────┐ │ 根质心 │ └──────────────┘ ╱ │ ╲ ╱ │ ╲ ┌────────┐┌────────┐┌────────┐ │ 叶子 │ 叶子 │ 叶子 │ 质心 │质心 │质心 └────────┘└────────┘└────────┘ ╱ ╲ ╱ ╲ ╱ ╲ ┌───┐┌───┐┌───┐┌───┐┌───┐┌───┐ │vec││vec││vec││vec││vec││vec│ └───┘└───┘└───┘└───┘└───┘└───┘我们在呈现为键值映射的存储层之上实现了这一点,具有排序且唯一的键。每个簇都被赋予一个 ClusterId ,并且每个簇内的向量被赋予一个密集的 LocalId 。 K::向量(C0L0)=vec! [ 0.45 , 0.32 , ...] K::Id (C0L0) = 7 K::向量 (C0L1) = vec! [- 0.28 , 0.96 , ...] K::Id (C0L1) = 13 K::向量(C1L4) = vec! [ 0.64 , - 0.48 , ...] K:: Id (C1L4) = C0 正如您在上面所看到的,一切都由 ClusterId 和 LocalId (例如 C0L1 )作为键控,我们将它们一起称为 ANN 地址。这就是我们说 ANN 索引是主索引时的意思。 v2:属性过滤和全文搜索 两个新的查询计划标志着从turbopuffer v1 → v2:属性过滤和全文搜索的非正式过渡。属性过滤 自然地,客户希望能够添加属性值并过滤它们的矢量搜索。为了使过滤快速且召回率高,我们将它们建模为倒排索引,将属性值映射到包含该属性值的文档的 ANN 地址。 K:: AttrIndex ("家族", "Alcidae") -> vec! [C0L3, C1L2, C1L3, ...] K:: AttrIndex ( "genus" , "Fratercula" ) -> vec! [C0L3, C1L2, C1L9, ...] 对于投影 ( include_attributes ),我们还将文档属性与 ID 和向量一起存储。 K::向量(C0L0)=vec! [ 0.45 , 0.32 , ...] K:: Id (C0L0) = 7 K:: Attr (C0L0, "family" ) = "Alcidae" K:: Attr (C0L0, "genus" ) = "Fratercula" 全文搜索 BM25 全文搜索是另一个明显且需求旺盛的查询计划。与属性搜索类似,全文搜索的工作原理是首先查找存在查询词的文档(通常称为“帖子”)。对于 FTS 索引,我们还包括 BM25 评分所需的(术语计数、文档长度)元数据:K:: FTS ( "description" , "Atlantic" ) -> vec! [(C0L0, 2 , 37 ), (C9L4, 1 , 42 ), ...] K:: Attr (C0L0, "description" ) -> "大西洋海雀是一种衣着鲜明的黑白海鸟,有着巨大的、五彩斑斓的喙,通常被称为海洋小丑。它在
这篇文章对您有帮助吗?

订阅66必读

每日精选科技资讯,直达你的邮箱