我们是怎么让 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 动力实验室

相关推荐
赵赵43040 分钟前
AI 写前端,优化的是演示,不是交付
ai编程
ClouGence43 分钟前
从 Prompt 到可复用作业辅导助手:我搭了一个 AI 作业批改工作流
人工智能·aigc·ai编程
Ticnix1 小时前
我删了 200 行 if-else,把决策逻辑全写进了 System Prompt
python·llm·agent
9i编程1 小时前
1. 把 DDD 开源脚手架化为自己的:先读懂它——Spring Boot 4.1 的四层架构、多数据源与领域事件
人工智能·openai·ai编程
镜舟科技1 小时前
Semantic View 技术解析(二):业务口径如何进入数据库执行路径
数据库·sql·agent
wangruofeng1 小时前
开源看板 Multica:让人和 26 个 AI Agent 共用一个团队
aigc·agent·ai编程
liulilittle2 小时前
OpenCode 中解禁 Muse-Spark 1.3 - max 档
ai·spark·llm·agent·tools·opencode·muse
wangruofeng2 小时前
Pro 七个月没转正,Flash 四个月连发四代 Stable,写代码怎么选?拆解 Gemini 两条产品线分化逻辑。
google·aigc·ai编程
阿里云大数据AI技术2 小时前
阿里云PAI推出InferX:Agent时代重塑企业专属的高保障SLO推理服务
人工智能·agent