← 文章 / AI技术
InfoQ 3小时前 · 2026-09-07 16:48:42 · 2 阅读

“薄 Agent Loop,厚 Control Plane”:TiDB 用数据库思维重做 Harness

过去一段时间,TiDB 团队启动了一项面向 Agent 的基础设施尝试——TiDB Cloud Filesystem。它把 Workspace 从 Session 和 Sandbox 的生命周期中独立出来:Agent 仍然通过熟悉的文件系统接口工作,背后则提供数据库级的持久化、版本、分支、回滚和权限控制。即使 Sandbox 被回收,新的 Executor 也能接管同一份文件和状态继续任务。TiDB Cloud Filesystem 保存的不是一台机器,而是 Agent 的工作现场。目前,它已经承载超过数百万个 Agent Workspace。

这次极限测试的背后,是 TiDB 在实践中逐渐形成的一套 Harness。彼时 Claude Code 已经出现,但今天用于大规模多 Agent 编排的 Dynamic Workflows 尚未发布。TiDB 没有从零编写 Agent Loop,而是借助开源项目完成最内层核心,将更多精力放在任务编排、权限、Sandbox、持久状态和失败恢复上——这些恰恰是数据库团队过去二十年最擅长的领域。

这套 Harness 的设计哲学被 TiDB 唐刘概括为 “薄 Agent Loop,厚 Control Plane” :Agent Loop 是变化最快、最易同质化的一层,完全可以站在开源巨人的肩膀上;但状态、权限和副作用的边界必须保持稳定。“这就像数据库,”唐刘强调,“SQL 可以越来越聪明,Optimizer 可以越来越聪明,但 Transaction、Privilege、Durability 这些边界不能因为‘上层更聪明’就消失。”

在接受 InfoQ 专访时,唐刘从数据库的可靠性哲学出发,分享了 TiDB 在构建 Harness 过程中的一系列独特思考:

  • 数据库行业天然就在做 Harness——对于开源数据库而言,真正的护城河往往不是 GitHub 上的开源代码,而是背后庞大的测试体系;测试代码、故障注入、随机测试和线上 Case 积累本身,就是 Harness。

  • Agent Orchestration 的未来是越来越少的编排——正如数据库从手写 Join 顺序演进到声明式 SQL,模型越强,显式编排就越会从命令式走向声明式。

  • 多 Agent 系统不该像一百个 Agent 在 Slack 群里开会——通信即复杂度,好的多 Agent 系统应像 Unix 哲学一样安静,通过状态共享而非消息广播来协作。

  • “Fail Fast”比“Retry”更重要——这是分布式系统最深刻的教训:真正危险的不是一个 Agent 犯错,而是错误被不断 Retry 后放大成系统雪崩。

以下是 InfoQ 与唐刘的完整对话。

InfoQ:你们做 Harness 的时候,是基于某个开源框架搭的,还是完全从零写的?当时为什么做这个选择?这个选择后来怎么塑造了你们 Harness 现在的样子?

唐刘:坦白来说,我们 TiDB 内部并没有一个所谓“完整的 Harness 最佳实践”。我们现在的系统是混合的:最内层的 Agent Loop 没有从零写,主要基于开源项目 Pi;但是任务编排、权限、持久状态、Sandbox、失败恢复这些部分,很多是我们自己做的。

当时的判断其实很朴素。Agent Loop 是今天变化最快、也最容易同质化的一层。模型协议、Tool Calling、Streaming、Reasoning 这些能力一直在变化,而且我相信长期来看,无论是 LLM 公司还是云厂商,都会把这一层做得越来越好。

所以我们没有必要在这里内卷。站在巨人的肩膀上就可以了。

我们真正熟悉的,是数据库团队过去二十年一直在解决的问题:状态怎么持久化;权限怎么收口;副作用怎么控制;失败以后怎么恢复;一个结果到底怎么证明是真的;出问题以后怎么审计和复盘。

所以如果一定要总结我们的设计哲学,我会说是:薄 Agent Loop,厚 Control Plane。

这个设计有两个好处。第一,我们很容易换模型、换 Agent Core。实际上我们现在用 Pi,也是后来替换掉了最开始使用的 OpenCode。但不管上面的 Agent 怎么换,下面的 Sandbox、权限、状态和控制面并不需要一起推倒重来。第二,模型能力越强,我们越可以放宽它在 Sandbox 里的探索空间,但完全没有必要同时放宽它对真实生产系统的副作用边界。

这其实很像数据库。SQL 可以越来越聪明,Optimizer 可以越来越聪明,但 Transaction、Privilege、Durability 这些边界不能因为“上层更聪明”就消失。

所以我们越来越相信一句话:Agent Framework 可以不断变化,但状态、权限和副作用的边界必须稳定。

InfoQ:当市面上大多数 Harness 是在“让 AI 写通用代码”这个场景中打磨出来的,你们的 Harness 是在“让 AI 写分布式数据库”这个场景中被逼出来的。在你们构建 Harness 的过程中,哪些环节迫使你们做出了跟主流 Harness 不一样的设计选择?

唐刘:其实我个人并不觉得我们跟主流 Harness 有多么不一样。反过来,我甚至觉得数据库行业天然就在做 Harness,只是以前没有用这个词。大多数 Coding Harness 的默认路径是:先读代码,再改代码、跑测试,最后生成 Patch。对于很多日常开发任务,这已经够用了。但对数据库来说,远远不够。

因为数据库是 Mission Critical System。我们发布一个版本,不只是要求“代码能运行”,还要保证:客户数据不能损坏;服务不能中断;新旧版本能够兼容;异常发生以后能够恢复;一个正常 Case 通过,不能代表整个系统就是正确的。所以在 Harness 这个概念流行之前,数据库公司其实早就在构建各种 Harness。

我一直有一个观点:对于开源数据库来说,真正最深的护城河往往不是 GitHub 上那些开源代码,而是背后没有被完整公开出来的测试体系。TiDB 也一样。我们的测试代码、故障注入、随机测试、兼容性测试、性能测试以及各种线上 Case 积累,本身可能比数据库内核代码还要庞大。这些东西其实就是 Harness。

你可以把数据库代码看成“被测试的对象”,而围绕它构建的整个验证体系,才决定这个系统敢不敢被放到生产环境里。这一点也非常符合我们设计分布式系统的哲学:不要相信一个组件说自己是正确的,要用外部不变量证明它是正确的。

Agent 也是一样。Agent 说:“我已经修好了。”对我们来说没有意义。真正的问题是:哪个 Commit?什么测试?什么输入?什么故障条件?什么 Evidence?换一个人能不能重现?所以 AI 时代最大的变化不是我们突然发明了一套测试体系,而是 Agent 可以开始更深地进入这套体系,把过去大量人工完成的验证、分析和反馈连接起来。

当然,我们现在远远没有解决所有问题。代码测试其实是相对简单的一环。真正更难的是 Cloud Service。发布数据库软件时,你还能在实验室里反复测试;但云服务升级是在真实客户流量下做的。这个就是我们经常说的:开着飞机换引擎。

这时候怎么设计 Harness,怎么让 Agent 帮你做逐步 Rollout、验证、观察、Fail Fast、Rollback,同时确保客户业务连续性,我觉得才是我们接下来真正值得探索的问题。

InfoQ:一些开发者,甚至一些 Coding 工具从业者,比如 PI、Devin、Factory 创始人,都认为在日常编程任务上已经感受不到主流模型之间的明显差距,甚至不少认为“模型到顶了”“模型已经死了”。你认同这个判断吗?

唐刘:我并不认为模型到顶了。

当然,在很多领域,尤其是通用编程领域,模型之间的差距确实越来越小。比如我们现在在用 Rust 重写 TiDB 的一些部分。这种工作里面有相当一部分,本质上是 Translation:理解现有实现,然后转换成另外一种语言和工程表达。这种任务中,几个主流模型之间的差距确实没有以前那么明显。

但是进入复杂系统以后,我还是非常希望模型能够更强一点。比如刚才说的 Cloud Service Upgrade。它不是一个 Repository 里的 Coding 问题。它涉及多个复杂系统、多个软件版本、不同客户环境、实时流量、灰度发布、故障恢复和业务连续性。

这里真正困难的早已超出“帮我写一段代码”:你敢不敢根据当前所有信息做出一个决策,并承担这个决策的后果?

这也是我觉得今天 AI 和人的一个很大差异。AI 越来越会做事情,但我们还很难让 AI 承担责任。

很多 Mission Critical 的工作,最终还是会有一个 Engineer 说“Go”,或者“Stop”,甚至“Rollback”。

为什么?因为最后承担结果的是这个人。所以我觉得模型下一阶段真正重要的突破,可能不只体现在 Coding Benchmark 再提高几个百分点,还在于模型能不能越来越可靠地处理不完整信息、不确定性、多目标权衡、风险、反事实和错误后果。

换句话说,等到模型不仅可以给建议,而且可以逐渐成为一个值得托付决策的主体时,模型能力才算又向前迈了一大步。

InfoQ:现在涌现了大量个人 Harness 项目,各家 Coding 工具在大方向上的做法也越来越像,AI Coding 工具的实现路径是否正在收敛?真正能拉开差距的环节是什么?

唐刘:我觉得可见的路径肯定是在收敛,而且这是一件好事。

Planner、Coder、Reviewer、Search、Edit、Shell、Sub-agent、MCP,这些东西慢慢都会变成标准部件。

这很像数据库。大家都有 SQL,都有 Optimizer,都有 Storage Engine。

但没有人会因此认为 MySQL、TiDB、PostgreSQL、Snowflake 都一样。真正的差距从来都不在“有没有这个 Component”,而是在这些 Component 最后怎么组成一个真正能解决问题的系统。

所以我觉得 Coding Agent 最终真正的差异,也一定会回到现实世界:你到底要解决什么问题?你敢让这个 Agent 做到什么程度?

我一直非常关注“责任”这个问题。AI 能力越来越强,但是如果 AI 不能承担责任,那么对于很多真正重要的场景,人类的经验、判断甚至魄力,还是有非常大的价值。

很多决定不是一个更聪明的实习生就能做出来的。比如线上出了问题:要不要 Rollback?要不要让一个大客户继续冒险?是性能退化还是数据风险更重要?什么程度的问题值得停止整个发布?这些都不是单纯依靠 Coding Ability 就能解决的问题。

这里其实还有一个我最近越来越担心的问题。

今天的新一代 Software Engineer 正在快速跳过我们过去经历过的大量“很烦、很笨、很无聊”的工程实践。

我们以前要手工 Debug、看 Core Dump、熬夜 Oncall、查几十 GB 日志、做线上恢复、为一个错误承担后果。现在 AI 很多时候直接把这些东西包起来了。表面上看,这是巨大的生产力提升。但问题是:那些看起来很低效的过程,其实也在训练工程师对系统的直觉。为什么我看到一个指标就觉得不对?为什么我看到某个 Retry 就知道后面可能雪崩?为什么我知道这个 Change 虽然理论上没问题,但今天晚上最好别上线?很多这类能力,很难从一本书里面学到。

当然,事情可能没有这么悲观。今天的程序员也不用像四十年前一样学汇编、手工管理寄存器,但一样可以用 Rust 写非常好的系统。

所以,另外一种可能是:AI 会让 Engineering 的抽象层继续向上移动。以后我们会少关注“这一行代码怎么写”,更多关注“这个系统应该具有什么性质”。如果真是这样,我觉得这反而是一次非常大的生产力释放。

InfoQ:2026 年被称为“Agent 编排之年”。从你的角度来看,过去一年的实质进展是什么?你们自己在这个方向上在探索什么?

唐刘:我这里可能有一个稍微暴论一点的观点:Agent Orchestration 的未来,可能是越来越少的 Orchestration。

一两年前,我们让 Agent 做一个复杂任务,需要明确告诉它第一步做什么、第二步做什么、Planner 怎么工作、Coder 怎么工作、Reviewer 怎么工作,还要写一大堆 Prompt 来告诉它该怎么协作。

但是现在大家应该已经明显感受到:很多时候我们只要告诉 Agent:“我要这个结果。”它自己就能够完成大量内部规划。所以模型越强,一部分显式编排一定会消失。

这其实非常像数据库。早期应用需要告诉数据库:“我要怎么 Join、从哪张表开始、怎么访问。”

后来 Optimizer 越来越强,人只需要告诉它:“我要什么结果。”至于怎么执行,让数据库自己决定。

我觉得 Agent 也会经历这个过程:从 imperative orchestration 走向 declarative goal。

当然,这并不是说编排不重要。尤其对于复杂系统,Context 仍然不是无限的,状态仍然需要持久化,错误仍然需要恢复,所以还是会存在更高层的任务边界。

我们现在主要探索几个方向。

第一个是并行探索。我们会让多个 Agent 独立解决同一个问题,然后选择更好的结果继续推进。这里其实和我们数据库自己的 Branch 能力很契合。每一个 Agent 都可以有自己的隔离 Workspace、自己的状态、自己的实现,最后再 Merge 或者淘汰。

我觉得未来 Agent 的并行探索很像数据库里面的 MVCC:不要让所有人去争抢同一个世界,而是先让每个人拥有自己的 Version。

第二个是 Context。我们后来为什么会基于 TiDB 做 Filesystem,其中一个很重要的原因就是我们发现:对 Agent 来说,File 是一个非常自然的 Interface。

Agent 很擅长 ls、grep、cat、修改文件以及通过目录理解世界。所以,从交互上来说,File 有时候比 Database 更适合 Agent。

但同时,Agent 又需要数据库的能力:检索、索引、Transaction、Version、Branch、Rollback 和 Query。所以我们开始思考:能不能让 Agent 看到的是 File,背后拥有的却是 Database 的能力?这其实就是我们做 Filesystem/drive9 这类产品背后的一个核心思路。所以,严格来说,我们并不是想去做一个更好的 Agent。

至于 Agent Core 怎么发展,我觉得主要还是模型公司的战场。我们更想做的是:给 Agent 构建更好的数据和状态基础设施。

InfoQ:你们在多 Agent 协作这件事上走到哪一步了?为什么 Kubernetes 能管上万个容器,多 Agent 管几十个就复杂得要命?

唐刘:Kubernetes 这个例子其实非常好。因为它恰好证明了一件事情:“一个系统在一个场景非常成功,不代表它天然适合另外一个场景。”Kubernetes 从一开始就是为了管理长期运行、声明式、相对稳定的 Service。

但是 Agent 的 Workload 很不一样。Agent 的很多任务是瞬时的、按需启动的,空闲时间非常长,活跃度非常符合二八原则,生命周期可能只有几十秒或者几分钟,状态的重要性甚至高于 Compute 本身。这些并不是传统 Kubernetes 最擅长的东西。

所以 Kubernetes 管 Agent 不那么优雅,并不能证明 Agent 做不到 Scale。这更多说明:Workload 变了,Runtime 也应该变化。

我们自己在多 Agent 方面,反而比较克制。可能有点让人意外,我们并没有特别追求很多 Agent 相互沟通协同。

这是因为我们做分布式系统这么多年以后,对一件事情越来越敬畏:Communication is complexity(通信即复杂度)。

如果一个分布式系统里面有十个组件,每个组件都需要频繁与其他九个组件通信,这个系统大概率会非常难 Debug,性能也不会特别好。

Agent 其实也是一样。

如果完成一个任务需要 Agent A 问 Agent B、Agent B 再问 Agent C、Agent C 修改结果以后通知 A 和 D,然后大家不断同步状态,这个系统在设计上可能已经有问题了。

所以我们现在的思路反而更接近 Unix Philosophy:一个 Agent 做好一件事情。Agent 之间尽可能通过清晰的 Input / Output 解耦,而不是高频聊天。当然,更上层仍然可以有一个 Agent 或 Workflow 去分配任务、汇总结果。但是整体拓扑要尽量简单。

这也是我们做 TiDB 时一直相信的一件事情:复杂性永远有成本。不要因为我们“可以”做一个复杂系统,就一定要做复杂系统。能够用一个 Agent 解决的问题,就不要用五个 Agent。能够通过状态共享解决的问题,就不要通过消息广播解决。能够异步完成的事情,就不要做同步依赖。

所以我不觉得未来一定是一家由一百个 Agent 在 Slack 群里开会的软件公司。

真正好的多 Agent 系统,反而可能看起来非常安静。每个 Agent 都在自己的边界里面完成工作,最后通过明确的状态和结果来协作。

InfoQ:很多 Coding Agent 前十几步表现很好,到了四五十步就开始跑偏。长程稳定性会不会成为下一代 Coding 工具最重要的分水岭?

唐刘:我认为会。

但我不太喜欢把 Long Horizon 理解成模型能不能咬牙坚持跑五十步、一百步。真正的问题不是它能不能跑得久,而是一个小错误出现以后,系统能不能在它变成故障之前把它拦住。这和分布式系统其实非常像。

一个系统发生错误,本身不可怕。所有分布式系统都会失败:网络会断,磁盘会坏,机器会挂,Timeout 一定会发生。真正危险的是一个系统把 Failure 当作普通事件以后,不断 Retry,最后把一个小故障放大成系统雪崩。所以我最近其实越来越相信一句话:“Retry is dangerous. Fail fast is underrated.”

但 Fail Fast 只是第一步。真正难的是 Fail 以后怎么办?这就是 Failover。对 Agent 来说也是一样。Agent 在第十步犯一个错误,并不一定意味着任务失败。真正的问题是第十一步到第五十步还在错误前提上继续执行;Context 里的错误信息越来越多;后面的 Agent 把旧的错误结论当成事实;到最后你已经不知道从哪一步开始错的。

所以真正重要的是三个能力。第一,尽早发现错误。不要等到第五十步才发现。第二,限制错误传播。错误不能自动变成后续步骤的事实。第三,从最近一个可信状态恢复。要有 Checkpoint,要有持久状态,要能够换一个 Agent、换一条路径继续。

这其实跟数据库非常像:Transaction Log、Checkpoint、Rollback、Failover。我们不会设计一个数据库,假设这台机器永远不会坏。同样,我们也不应该设计一个 Agent System,假设这个 Agent 永远不会犯错。

真正成熟的系统哲学应该是:“Assume failure, contain failure, recover from failure(假设失败必然发生,控制失败的影响范围,并从失败中恢复)”。

所以如果问我下一代 Coding Agent 最重要的分水岭是什么,我的答案会是:比起“谁可以连续工作更久”,更重要的是谁能在 Agent 犯错后限制错误继续扩大,并让系统快速回到正确轨道。

这其实可能也是我们数据库行业可以为 Agent 时代贡献的一个很重要的设计哲学:成熟的可靠性并不追求永不失败,它要求系统在失败以后仍然能够保持正确。

原始来源: InfoQ

评论 (0)