我们是怎么让 AI 找到那个 Bug 的

我们是怎么让 AI 找到那个 Bug 的?

上一篇结尾留了一句话:给系统补上调用链检索能力之后,原本要搜 2-4 小时的路径,AI 用几分钟就定位到了。

今天把这个"补上"拆开讲。

它不是一个 Prompt,也不是一段咒语。

要让 AI 真正完成一次故障排查,我们最后补上的,其实是四种能力:

看得见代码、拿得到现场、找得到经验、验证得了结论。

对应的,就是四套基础设施:

代码图谱、运行时通道、经验知识库、验证闭环。

每一套都不性感。

但缺任何一套,AI 都可能停在"给你一个看起来很合理的答案"这里。

而我们真正想要的,是让它能够继续往下走,直到:

从一个模糊症状,走到一个可以被验证的根因。

⸻

先回忆一下那个 Bug 的困境

OAuth2 登录失败,返回一个空的 HTTP 错误。AI 说"去 SSO 认证链路查 validate 方法",方向完全正确。

但工程师面对的是:大量微服务,散在多个代码仓,海量源文件。搜错误码,搜到的全是 REST 侧的正确处理,越搜越远;搜 HTTP 状态码,全是无关噪音。

核心困难不是"不知道往哪查",而是从方向到 文件:行号 之间的距离太远了。

这个距离,就是我们要帮 AI 补上的。

⸻

第一条路:代码图谱------让 AI 沿着调用链走,而不是全局搜

一个大型微服务系统,你不可能把所有源码塞进上下文。塞不进去,AI 就只能靠通用知识猜。

我们做的第一件事是给代码建索引------不是全文索引,是符号级的调用关系图谱。

用 AST 解析把 21 个仓库里的类、方法、字段全部抽出来,同时识别跨服务调用注解,把微服务之间的 HTTP 调用关系也建进图里。然后封装成工具,AI 可以按需调用:给一个类名,返回它在哪个文件第几行;给一个方法,沿着调用关系向上或向下展开,包括跨服务的链路。

回到 OAuth2 那个 Bug。AI 拿到这些工具后,做的事情是:

复制代码
搜索 "OAuth2" → 找到 Token 端点 Controller
向下追踪 → handleRequest → 调用 validate
向上追踪 → 找到 UserAuthenticator

几步跳转,定位到 validate 方法里一个典型的 catch 块:

java 复制代码
} catch (final Exception e) {
    throw new GenericAuthException("Authentication failed", e);
}

所有认证失败------密码错误、账号锁定、账号失效------在这里被统一包装成一个通用异常,业务错误码全部丢失。

但 AI 没有停在这里。它顺着图谱继续走,发现同一个系统里 REST 侧已经有一套完整的异常处理结构------HTTP 状态码 + 错误码 + 错误信息,规规矩矩。而 OAuth 端点压根没接入这套机制。

这个发现之所以重要,是因为它不仅定位了 Bug,还同时给出了修复方向:不需要从零设计,接入已有机制就行。

grep 给不了这个信息。grep 能告诉你某个字符串出现在哪里,但它不知道两段代码之间的调用关系,更不知道"这个系统里已经存在一个正确的实现"。

调用关系图谱让 AI 从"全局搜关键词"变成"沿着调用链精确跳转"。 这是从方向到行号之间最短的路。

⸻

第二条路:运行时通道------让环境事实能送到 AI 面前

代码图谱解决了"代码里写了什么"的问题。但 Bug 往往不只是代码问题------它还跟环境有关。

Pod 是不是在 Running?配置在多节点之间是不是一致?日志里的异常栈长什么样?这些运行时事实,原本只有进客户隔离网络才能看到。

而 AI 不能进客户网络。这是安全红线,不可谈判。

我们的做法是把工作流切成三层,让 AI 和数据在物理上分离:

复制代码
第一层:AI 在本地,根据症状生成一个诊断脚本
          ↓  脚本送到客户环境
第二层:脚本在客户机器上执行,收集证据
          ↓  报告带回本地
第三层:AI 在本地,解析报告,给出判定

这里有一个关键的设计决策,也是我觉得做 Agent 最容易踩的坑:

很多人做 Agent 的第一反应是------给它一个 Shell,让它自己执行命令。

我们反过来。AI 不能自己写命令,它只能从一个预置的只读命令模板库里选取------目前 110+ 条,每条都经过安全审计,标注了风险等级;AI 的工作是根据症状选对组合,而不是自由发挥。

这不是普通的 Tool Calling,而是把 Agent 的自由度限制在一个预先验证过的动作空间里。

在分诊和分析环节,AI 可以充分推理、做判断。但在取证环节------涉及客户生产环境的那一步------它的每一个动作都是受限的、可审计的、确定性的。

创造性留给两端,确定性守住中间。这是整套设计里最重要的取舍。

脚本输出同时生成人读的文本和机读的结构化数据。第三层 AI 拿到的不是一堆原始日志,而是每项检查的名称、状态和判定理由。

当受控远程通道可用时,这个过程可以进一步自动化------AI 通过预审计的执行工具上传脚本、取回报告,中间不需要人工搬运。所有远程操作同样走白名单,只读命令直接执行,任何写操作必须经人确认,完整审计日志落盘。通道不可用时,系统完全退化成手动模式------人把脚本拷进去、执行完、把结果粘贴回来,一样能跑。

客户环境零依赖------不需要装 AI、不需要装任何额外工具,只执行我们送进去的只读脚本。这是方案能在大量隔离环境里推开的前提。

⸻

第三条路:经验知识库------让同一个问题不再排查第二次

前两条路解决了单次排查的效率。但有一个问题它们解决不了:

同一个故障模式,在不同客户那里被独立排查了一遍又一遍------每次都从零推理,因为上一次的经验只在某个工程师的脑子里。

解决方案听起来很朴素:把经验结构化,让 AI 在分诊阶段就能检索到。

我们从历史工单里提炼出 46 个故障模式,按"是否要改代码"分成两层------现场能闭环的归一类,必须转研发的归另一类。每个模式配上匹配规则和确认步骤。

分类不是为了整齐,是为了在分诊阶段就决定这单该谁接。回顾未闭环工单的归因数据,我们发现不少故障其实属于配置、环境或容量类问题,现场就能闭环,根本不需要研发改代码------但之前经常被误转到研发。这是效率损耗的一个重要来源。

在此之上,我们维护了一个"已知问题库"------经过验证的闭环方案,连修复步骤都写好了。同样的问题第二次出现时,AI 直接命中已知条目,输出已验证的方案,不用再推理,不用再排查。

经验沉淀不是让 AI 去"学习",而是把人的经验翻译成 AI 可消费的结构化数据,我们后来发现,故障知识库真正有价值的地方,不是让 AI "知道更多",而是让它在面对一个症状时,少走几条错误的路。

⸻

第四条路:验证闭环------找到根因之后,怎么证明它真的对

前三条路解决了"让 AI 拿得到证据"。但拿到证据不等于诊断正确。

AI 有一个很危险的特点:即使证据不足,它也能给你一个听起来非常完整的解释。它可以用合理的逻辑串起一段分析,读起来天衣无缝,但根因可能完全错了。

所以我们设计了一个分层验证体系,强度逐级递增:

必须过的关:Bug 复现 + 回归测试。

修复前是红的,修复后是绿的------没有红变绿的证据,不算修复。同时,改过的每个点,它的调用者的原有行为不能变------不是"我觉得不会影响",是实际跑过测试。

这两层是硬门槛,过不了就不能说"修好了"。

能做的尽量做:环境对照。

如果能连到测试环境,AI 会通过浏览器自动化工具登录系统、按照复现步骤操作、截图。修复后再走一遍,断言反转------原来验证"症状存在",现在验证"症状消失"。修复前后的截图并排归档,任何人都能复核。连不上环境时,跳过这层,不阻断流程。

修复完成后:知识回流。

验证通过后,修复记录沉淀到一个独立的修复历史库------症状关键词、根因类型、涉及的代码位置、修复模式。它和代码图谱是两个东西:图谱记录代码结构,修复历史记录"这段代码出过什么问题、怎么修好的"。下次遇到相似症状,AI 在定位阶段就能检索到这条记录,第三条路的知识库也因此持续生长。

这就形成了一个闭环:诊断产生证据 → 证据驱动修复 → 修复产生验证 → 验证沉淀为知识 → 知识加速下一次诊断。

验证体系不是质量流程的附属品,它是整套系统能自我进化的前提。

⸻

四条路拼在一起

回到最开始的问题:我们到底"补上"了什么?

路 解决什么 没有它会怎样
代码图谱 AI 看不见跨服务调用关系 全局 grep,搜很久
运行时通道 AI 拿不到环境事实 只能凭症状猜,无法确认
经验知识库 同一个问题每次从零推理 同一模式反复排查
验证闭环 AI 的分析无法被证实或证伪 越猜越自信,一次误判摧毁信任

四条路不是并列摆设,而是一条可以持续推进的排查链路:

这四条路的共同点:它们都不改变模型本身,只改变模型能看到什么、能做什么、以及怎么被验证。

模型还是那个模型。从"给个方向,人搜 2-4 小时"变成"几分钟定位到文件行号",中间差的不是更好的 Prompt,是这四条基础设施。

几个数字可以概括这套投入:21 个仓库 建图谱,110+ 条 审计过的诊断命令,46 个 故障模式------排查时间从 2-4 小时 压到几分钟。

⸻

一个可能更重要的观察

整套系统做下来,最让我意外的不是提效倍数,而是一个定性的变化:

AI 的角色从"高级搜索引擎"变成了"可以独立推进排查的执行体"。

以前,工程师问 AI 一个问题,AI 回答一个方向,然后工程师自己去做所有的事情。

现在,AI 沿着调用链定位代码、生成诊断脚本、解析执行结果、给出判定、验证修复、回流知识。人做的事情变成了:确认关键假设、批准敏感操作、在验证环里做最终判断。

这不是"AI 更聪明了",而是系统被改造成了 AI 可以持续推进的形态。

这也是我在第一篇里说的那个观点的具体展开:

AI 不是不会做,而是系统有没有给它足够的证据、工具、边界和验证机制,让它能够持续把事情做完。

⸻

尾声

有人可能会问:这套东西的建设成本高不高?

说实话,不低。代码图谱要做 AST 解析和跨服务关系识别,故障模式要从历史工单里逐个提炼,诊断命令要逐条审计安全性,验证流程要反复踩坑打磨。

但换一个角度看:这些东西建一次,用在每一次后续的排查里。而"每次从零推理"的成本,是在每一个工单上反复支付的。

前者是一次性投入,后者是持续税。

下一篇,我想换个视角,聊聊 AI Coding Agent 在 0→1 建设新系统时到底能做到什么程度------不是"辅助写代码"的程度,而是"十几万行代码没有一行是人写的"的程度。它的前提是什么,边界在哪里,我们踩了哪些坑。

⸻

最后说个事

这篇文章讲的是四条路的 What 和 Why。

但真正做起来,最费时间的往往是 How:

CodeGraph 的 AST 解析器到底怎么设计?

跨服务调用关系怎么建立?

110+ 条诊断命令怎么做安全边界?

46 个故障模式怎么从历史工单里提炼出来?

AI 不按流程走的时候怎么办?

验证环为什么会失效?

这些东西很难在一篇文章里全部展开。

所以我会把更原始的工程过程放进知识星球:

不是只记录最后的答案,也记录答案是怎么被做出来的。

包括踩坑、方案权衡、被推翻的设计、工具链实现,以及我每天看到的一手 AI 工程实践。

如果你正在做 AI Agent、Coding Agent、AI Native 研发效能,或者正在尝试把 AI 真正接进企业研发流程,可以来这里一起研究。

AI 动力实验室

相关推荐
枫叶丹46 分钟前
AI Agent 说完成了,怎样验证任务真的完成
人工智能·chatgpt·开源·agent·codex
六边形工程师9 小时前
致敬,DeepSeek 最新开源的不是模型,是国产算力的地基
ai编程
全栈弄潮儿9 小时前
哪些任务该交给 AI,哪些必须由开发者负责?
aigc·openai·ai编程
stormzhangV10 小时前
A 社为什么反超了
人工智能·ai编程·claude
想要打 Acm 的小周同学呀11 小时前
无需自己设计Agent架构的业务系统,依赖第三方Agent,基于SKILL和MCP服务实现企业级内部提效工具开发
架构·agent
空心木偶☜13 小时前
LangGraph 错误处理和重试机制
ai·ai编程·langgraph
老周聊架构14 小时前
智能体业务关键引擎:Agent Skills 与企业能力资产沉淀
agent·skills
hpoenixf14 小时前
一个 Bug 为什么要改五层:Agent 架构如何从跨层修补走向局部 Owner
agent
网络毒刘14 小时前
用测试夹具约束 Agent:给定失败用例,要求只输出最小 diff 的提示词套路
agent·测试·提示词·diff
码云之上15 小时前
把网页变成可引用知识——Chatbot 联网工具
人工智能·架构·agent