Perplexity 用 AI Agent 辅助完成从 DynamoDB 向新数据库的迁移,但最终被禁止让 Agent 运行数据库,反映出 AI 工作流权限隔离的实际挑战。
Perplexity 觉得 DynamoDB 费用太高,同时对读取性能的把控也不够满意。于是他们自己动手写了一个数据库:CobbleDB。
这个数据库由两名工程师在两个月内建成,开发过程中有数百个持续运行的 coding agent 全程参与,最终产出约 40,000 行 Rust 代码,如今已承接 Perplexity 生产环境搜索流量的一部分。迁移完成后,Perplexity 测得的批量读取中位延迟为 5.6 毫秒,而此前 DynamoDB 上的数据是 31.4 毫秒;p99 延迟则从 123 毫秒降到了 24.2 毫秒。
预计 CobbleDB 的成本比 DynamoDB 至少低 20%,且 Perplexity 计划在未来某个时间点将其开源。
但数据库本身只是故事的一部分。CMU 教授 Andy Pavlo 在今年早些时候的 Percona Live 大会上提出,数据库是 AI agent 面临的最难且最重要的挑战之一,部分原因在于涉及生产数据的错误可能难以甚至无法回滚。
Perplexity 最终还是动用了数百个 agent 来协助构建数据库,但他们并没有给这些 agent 生产环境的访问权限。
预计 CobbleDB 的成本比 DynamoDB 至少低 20%,且 Perplexity 计划在未来某个时间点将其开源。
每次搜索请求都需要服务层拉取预先分块的段落和向量嵌入,一次 Search API 调用会批量拉取 100 到 120 个页面键,每批大小为 10 到 20 个。每个条目平均约 50 KB。
DynamoDB 让 Perplexity 无法控制读取操作的处理方式,这意味着一个慢副本可能会拖累整个请求。此外,搜索、爬取和重新处理产生的大量读写操作让成本随流量和语料库规模增长而不断攀升,这让云服务费用越来越难以为继。
这促使 Perplexity 将长期文档存储与服务于实时搜索的数据库分离。
存储栈分为三个部分。Pillar 将持久的文档状态保存在 YTsaurus 的 HDD 上,包括版本化元数据、分块和向量嵌入;Lorry 将更新打包成特定分区的批次,通过 S3 流向 CobbleDB。
处理后的页面数据在每个分区上分散为三个副本,以哈希化的 URL 为键,RocksDB 将频繁访问的数据保留在内存中,其余留在本地 NVMe 上。读取尽可能在同一可用区完成,路由器可以在某个副本响应慢时转向另一个,而不是让整个批次卡住。
更新通过 S3 到来后独立应用,允许某个副本落后并追赶,而不会阻塞其他副本。
Perplexity 在测量 CobbleDB 时大约处理着每秒 200,000 个请求,此时批量读取中位延迟为 5.6 毫秒,而此前在 DynamoDB 上记录的数字是 31.4 毫秒。在 p99 延迟上,从 123 毫秒降到了 24.2 毫秒。
在后续的负载测试中,CobbleDB 达到每秒 500,000 请求后才开始出现性能衰减。
这个对比有一个重要的注意事项:DynamoDB 和 CobbleDB 并未在相同流量下进行并肩测试;DynamoDB 的数据是切换前记录的,CobbleDB 的数据是切换后记录的。Perplexity 另外使用 10 到 15 个键的批次做了合成基准测试,值从 100 字节到 100 KiB 不等。
其成本模型显示 CobbleDB 在所评估的各种承诺方案下比 DynamoDB 至少低 20%,不过该估算未包含维护数据库的工程成本。
在后续的负载测试中,CobbleDB 达到每秒 500,000 请求后才开始出现性能衰减。
这些 agent 在不同 session 之间传递上下文,能够发现恢复假设和运行时配置方面的问题,同时推进修复和测试工作。但它们并不直接运行数据库。
两名工程师牢牢掌控着架构和生产系统——尤其考虑到 Pavlo 关于不要让 agent 接近关键生产数据的警告,这一点至关重要。
用八周时间交付 CobbleDB 解决了 Perplexity 眼前的工程瓶颈,但维护一个自定义数据存储可能会困难得多。延迟数据并非来自受控的并肩基准测试,预估的节省也未包含维持 CobbleDB 运转以及故障时应急响应的工程师成本。
与 Shopify 和 Ramp 类似——这两家公司围绕第三方模型构建了自定义 coding agent——Perplexity 保留了云基础设施,但用针对自身需求打造的方案替换了某个托管服务。CobbleDB 展示了 AI 辅助开发如何改变了这个算盘,让小型工程团队也更能负担得起自定义基础设施。
CobbleDB 展示了 AI 辅助开发如何改变了这个算盘,让小型工程团队也更能负担得起自定义基础设施。