跳到正文
行开心的颠倒世界 logo

行开心的颠倒世界

你以为 Agent 在 debug,其实它在猜

你以为 Agent 在 debug,其实它在猜

2026年6月11日
AI编程 Debug 可观测性 Agentic

你以为 Agent 在 debug,其实它在猜

我第五次让 Agent 改同一个 bug。

它每一轮都很笃定:根因找到了,这次应该好了。然后我跑起来,报错照旧。

它的动作也很固定:读一遍代码,构造一套解释,改一版实现,等运行结果。失败之后,再构造一套新解释,再改一版。看着它一轮轮转,我突然意识到,它已经陷进了源码的内循环——在用静态文本想象一个动态系统。说白了,它不是在 debug,是在猜。

最近我在做一个本地小工具:worker 收集同一台机器上几个 coding agent 留下的会话,前端把它们聚合起来方便回看。排查这个工具自己的 bug 时,我看到一个很稳的规律——只要我不给运行时输出,Agent 就开始在源码里编假设;一旦我贴出几行日志,它通常很快就指出问题在哪。

决定 debug 质量的,不是它有多聪明,是它手里有没有程序真实跑起来之后的证据。


一次典型的”改错层”

举个刚发生过的。

前端页面一直显示空列表。Agent 头几轮都在改渲染:一会儿怀疑 state 没刷新,一会儿怀疑 effect 依赖写漏了。改了三版,列表还是空的。

我让它停下,别改逻辑,先在三个位置打日志:worker 收到了多少条会话、接口返回了什么、前端过滤函数进出各是什么。我复现一次,把输出贴回去。

结论立刻翻盘:worker 已经拿到 12 条会话,接口也正常返回 12 条,前端在一个写错条件的 filter 里把它们全筛掉了。问题从头到尾都在过滤这一层,跟渲染没关系。前三版修改,全打在了错误的层上。

不是它笨。是它前三轮手里只有代码,看不到那 12 条数据其实已经到了前端。它一直在为一个错误的假设找补,而这个假设,一行日志就能推翻。

数据流与误判:Worker→API→Filter→Display,Agent 前三版全改在了错误层


只给源码,它就只能做静态推理

把这事想清楚,得先看 Agent 的处境。

你让它改 bug,它能拿到的主要是代码:函数、调用链、类型定义。它读完,在脑子里跑一遍这段代码”应该”怎么执行。注意是”应该”——它做的是静态推理,对着不会动的文本想象一个会动的程序。

人也这么干。区别是,有经验的人卡住时会停下来拿现实校准:打个断点,print 一个中间值,翻一眼日志,看看脑子里那套执行模型是不是错了。

只拿到源码的 Agent 没有这一步可做。它把”想象中的执行”当成了”真实的执行”,一版又一版都在同一个没验证过的假设上往下推。假设错了,推得越认真,离得越远。

静态推理 vs 运行时观测:源码里的世界 vs 运行中的世界


更强的模型,也只是猜得准一点

发现这点之前,我试过几条看起来更努力的路。

把相关文件给全、换更强的模型、把要求写细——该给的上下文我都给了,这本来就是基本操作。但它们解决的是”想得够不够多”,解决不了”看没看见真实现场”。

更强的模型确实猜得更准,能从代码里嗅出更多线索。可”准一点”和”看见了”是两回事。一个竞态,一个第三次调用才脏掉的缓存,一个上游字段在某种输入下悄悄变成 null——这些不在代码的字面里,它在代码跑起来那一刻才发生。再强的模型,也读不出一个没写进源码的事实。

bug 修错方向的时候,缺的通常不是脑子,是现场。


谁来观测不重要,能不能观测才重要

后来我换了个顺序:先观测,再动手。

bug 出来,我不直接说”修一下”,先让它把活拆出观测这一步——列几个最可能的假设,给每个假设设计一个最小观测点:打印哪个变量、在哪个分支、预期看到什么、什么输出能推翻它,然后只加日志、不改实现。我复现一次,把输出贴回去,再让它照真实输出改。这一版往往就对了。

这里有个容易忽略的点:日志得能回答问题,不是”走到这里了”。好的观测点说得清——输入是什么、分支怎么走、状态在哪一步变脏、输出从哪一层开始偏。前面那个空列表,就是”前端过滤进出各是什么”这一句把方向掰回来的。

你可能会说,带执行权限的 agent 自己就能跑、能加 print、能读日志,何必人来贴?没错。我那套”人复现、人贴回去”的流程,是当时工具和习惯的产物,不是 agent 做不到自我观测。

但这恰恰说明,瓶颈从来不在”谁去喂证据”。换成 agent 自己跑,如果程序的关键路径根本没日志、状态变化没留痕,它跑起来看到的也只是一个光秃秃的报错栈——它还是在猜,只是换个地方猜。能不能 debug,不取决于喂证据的是人还是 agent,取决于系统肯不肯把现场交出来。


可观测性是自动化的前提

所以真正该补的,不是 debug 时临时插几行日志,是让系统平时就可观测。关键路径、状态流转、外部调用都留下痕迹,排查的起点就完全不同——现场一直在那儿,不用等出事了再回去造。

这件事的回报,远不止”人查 bug 快一点”。系统可观测到一定程度,你可以让 agent 自己读输出、自己定位、自己提修复,人退到审核位。它不必再等你一次次复现、贴日志,因为现场它自己就拿得到。

这才是我真正想说的:可观测性不是出了事给人善后的工具,是让 agent 能自主排查、自动改善应用的基础设施。你给系统装的每一个观测点,都是在给以后的自动化铺路。反过来,一个不可观测的系统,再强的 agent 接进去也只能在源码层打转——你以为请了个会 debug 的,其实还是个会猜的。

可观测性金字塔:从基础设施到 Agent 自动化,人退到审核位


收尾

所以分工不是”人喂证据、agent 推理”那么简单。更靠谱的说法是:先让系统可观测,剩下的不管谁来查都好办。

下次它又开始第二版、第三版地改同一个 bug,先停一下,问三个问题:这一版的假设是什么?哪条运行时证据支持它?哪条日志能推翻它?

答不上来,就先别改实现——先让程序开口。要是程序根本开不了口,那要补的不是 prompt,是这个系统的可观测性。

版权声明

作者
XingKaiXin
标题
你以为 Agent 在 debug,其实它在猜
发布时间
2026年6月11日

本作品采用 CC BY-NC-ND 4.0 DEED 许可。

XingKaiXin