AI测试 简单项目 AI 随便写,复杂度一上来就顾头不顾尾

匠测AI说 · 2026年09月07日 · 188 次阅读

这个"病"长什么样

先说个公道话:简单项目里,AI 是真的神。

写个单文件爬虫、改个正则、调一个 prompt、写个数据清洗脚本——你话还没说完,它代码已经给你了,跑起来就是对的。我见过太多人(包括我自己)在这个阶段产生幻觉:"这东西已经能替我干活了。"

然后项目一复杂,它就开始"犯病",而且犯得非常有规律:

  • 你让它优化模块 A,A 确实优化得漂亮,模块 B 崩了
  • 你让它修 B,B 修好了,模块 C 崩了
  • 你让它把 B 和 C 一起修,它俩都好了,D 悄悄坏了三天你才发现
  • 每一次它都态度诚恳:"已修复,测试通过 ✅"

像什么呢?像多米诺骨牌。你伸手推倒的是第一块,倒的是一整排。 而 AI 每次都只盯着你让它扶的那块,扶完就举手报告,从来不看后排正在连锁倒塌。

这个病最坑人的地方在于:它不是能力下降,是视野缺失。 单模块任务里它 90 分,多模块联动里它还是那个 90 分的单模块水平——但系统需要的是 100 分的全局观,这 10 分没人补,窟窿就一个接一个。


我的真实案例

我有个跑了挺久的 AI 资讯日报工作流,4 个节点串联:

节点1 资讯抓取 → 节点2 AI筛选去重 → 节点3 AI摘要 → 节点4 排版输出
  • 节点 1:HTTP 抓取 + 解析,输出文章列表 [{title, url, source, publish_time}]
  • 节点 2:LLM 筛选,去重、打分、分类,输出选中的文章
  • 节点 3:LLM 逐篇生成摘要
  • 节点 4:按分类分组,排版成 Markdown 日报推送

这个工作流跑了一个多月,相安无事。直到我觉得日报太长——每天推 20 多条,根本看不完。我让 AI 优化节点 2:"筛选收紧一点,只留高价值的,控制在 8 条以内。"

第一轮:节点 2 优化完成 ✅

AI 干得相当漂亮。它把节点 2 重写了:

  • 去重逻辑从"标题完全相同"升级成"标题相似度 > 0.85"
  • 每篇文章加了 score(打分)和 reason(入选理由)
  • 输出从一个平铺列表,改成了按优先级分组的结构:
# 旧输出:list
[{title, url, category, ...}, ...]

# 新输出:dict,按优先级分组
{
  "high":   [{title, url, score, reason, ...}, ...],
  "medium": [{title, url, score, reason, ...}, ...]
}

它还贴了节点 2 的单测结果:喂 30 篇模拟文章进去,输出 high 组 3 篇、medium 组 5 篇,打分有理有据。

"优化完成,筛选准确率明显提升。"

我看着挺满意。那天晚上,日报空了。

第二轮:节点 3 崩了

节点 3 的代码是按列表写的:

for article in node2_output:          # 以前这里是 list
    summary = llm_summarize(article)  # 现在 node2_output 是 dict

dict 直接 for 遍历,拿到的是 key——字符串 "high""medium"。节点 3 拿着这两个字符串当文章内容去喂 LLM 摘要,输出了一堆不知所云的东西,工作流直接报错中断。

节点 2 的输出结构变了,消费这个输出的节点 3,AI 一个字没动。 它的"测试通过",是只测了节点 2 自己。

我让它修。它很快把节点 3 改成先 flatten 分组结构再遍历,还顺手适配了新字段。节点 3 跑通了,摘要质量看着不错。

"已修复。"

第三轮:节点 4 崩了

第二天日报出来了,能推送,但是所有文章都挤在"未分类"里,原本"行业动态/技术干货/产品发布"三个版块全乱。

原因:节点 3 在适配新结构时,输出字段从 summary 改成了 content,flatten 的时候还把 category 字段弄丢了。节点 4 按 category 分组排版,取不到字段,全部落进默认分组。

我继续让它修。节点 4 修好了,分组恢复正常。

第四轮:回头一看,节点 1 也歪了

到这里我多了个心眼,让它把全链路跑一遍——这才发现最隐蔽的问题:

节点 2 的去重逻辑升级后,漏斗变紧了(30 篇进来,筛完只剩 8 篇)。但节点 1 的抓取参数还停留在旧时代——分页只抓 30 篇。以前 30 篇筛 20 条够用,现在 30 篇筛 8 条,high 组经常只有 1-2 篇,日报的"重点推荐"版块天天开天窗。

这个问题不会报错、不会中断、输出格式也全对——它只是静默地变差。如果不是端到端跑了一遍完整数据,我可能要等周报数据难看时才发现。

四轮下来,我的体感是:

我每说一句话,它就精准地完成这句话字面意思的 20%——就是我指着的那块。至于这块动了之后,整条链上还有什么会跟着动,它从来没主动看过一眼。


为什么 AI 会这样?

1. 它的注意力天生是"局部"的

你说"优化节点 2",模型这轮的全部注意力都在节点 2 上:怎么让筛选更准、结构更合理。节点 3、节点 4 在上下文里存在,但在这一轮的注意力分配里,它们是背景板。

人类工程师接到"优化筛选"的需求,第一反应是:"筛选结果谁在用?改了输出结构,下游会不会炸?" 这个反应叫影响面分析。AI 没有这个本能——它不是不会,是你不逼着问,它默认不做。

2. 它手里没有"系统全景图"

4 个节点的 prompt、代码、数据结构,理论上都在上下文窗口里。但"在窗口里"不等于"在注意力中心"。

这就像一份 40 页的文档摊在你桌上,你正盯着第 12 页改错别字——第 28 页引用了第 12 页的一个表格名,这件事你"看得见全文"也想不起来。复杂度的本质不是代码多,是关系多;而关系,恰恰是上下文里最先被压扁的东西。

3. 它的"测试通过"是单点测试,不是系统测试

这是我做了 10 年测试最敏感的一点。AI 改完一个模块,验证方式是给这个模块喂输入看输出——这相当于只跑单元测试。

但真实项目里,单测全绿、集成全崩是日常。模块间的契约(数据结构、字段名、类型、顺序)才是集成测试的主战场,而 AI 验证自己的改动时,几乎从不跨模块走一遍。

4. 为什么简单项目没这个病?

因为单文件脚本里没有"关系":代码从上到下顺序执行,输入输出就一条线,改哪是哪。

不是 AI 在简单项目里更聪明,是简单项目里根本没有能连锁崩塌的东西。一旦模块间出现契约和耦合,改动就开始沿关系网传播——而 AI 只会在你指给它的那个节点上使劲。


这种病的代价

  • 🔴 修一个崩三个,4 轮对话过去,你分不清现在系统是好是坏,只知道"每个被点名的问题都修好了"
  • 🔴 静默劣化最致命:报错的问题你会修,不报错的问题(抓 30 条筛 8 条、数据量悄悄缩水)会一直潜伏,直到数据难看才暴露
  • 🔴 你的注意力被拖进细节:本来雇 AI 是让它干脏活,结果你成了那个唯一记得全局的人,逐个节点排查关系——架构师的活一点没少
  • 🔴 信任成本飙升:从"改完直接用"退化成"改完全链路重测",AI 提效的收益被返工和回归吃掉一大块

怎么治

方法 1:你当架构师,AI 当模块工

接受一个现实:全局视角这个活,AI 接不住,只能你自己扛。

动手改之前,你自己先花 10 分钟把数据流画出来:

节点1 → [articles: list] → 节点2 → [high/medium: dict] → 节点3 → [items: list] → 节点4 → Markdown

不用多规范,纸上、白板、注释里都行。关键是:谁的输出是谁的输入,每一段传递的数据长什么样,你心里要有这张图。 AI 负责节点内部怎么实现,节点之间的契约,你拍板。

方法 2:契约先行,schema 就是法律

每个节点的输入/输出写成明确的契约文档:

## 节点2 输出契约
- 类型:object
- 字段:
  - high: array,必填,文章对象列表,0-5条
  - medium: array,必填,文章对象列表,0-10条
- 文章对象:{title: string, url: string, category: string, score: number, reason: string}

然后给 AI 立规矩:

"优化节点 2 内部逻辑可以,但输出结构不许动。如果你认为必须改输出结构,先停下来告诉我改什么、为什么,等我确认并同步改完契约文档,再动代码。"

结构变更从"AI 顺手就改"变成"必须走审批",连锁崩就断了源头。

方法 3:每次改动,先逼它做影响面分析

下指令时加一句固定台词:

"在动手改之前,先列出:这个改动会影响哪些下游节点/模块?逐个节点列出它依赖的输入字段,以及需要同步修改的地方。列完给我确认,再动手。"

它列不全,没关系——以我这轮的经验,它自己列出来的部分就能挡掉 80% 的连锁崩。关键是把"影响面分析"从它的可选项变成你的必问项。

方法 4:黄金用例端到端回归,不接受单点"已修复"

测试老兵的老本行:准备 1-2 条固定的真实输入(比如某天抓回来的 30 篇原始文章存成 fixture),每次改动后,从节点 1 跑到节点 4,检查最终日报

验收标准只认一条:最终产物对不对,不看中间节点"测试通过"。

"已修复"不算数。跑一遍全链路,把最终输出贴出来,我看过才算。

单节点测试是 AI 的自我安慰,端到端才是系统的真相。

方法 5:连锁两轮就停手,回滚重来

给自己设一条熔断线:

修 A 坏 B、修 B 坏 C,连续两轮——立刻停,不要再让 AI"接着修"。

继续修下去,它只会在局部打更多补丁,系统变成谁也不敢碰的屎山。正确动作是:回滚到上一个完整可工作的版本,重新理一遍节点契约,想清楚改动路径,再重新下手。

返工一小时,好过补丁打三天。


一句话总结

简单项目里 AI 是神兵,复杂项目里 AI 是新兵——单兵能力满分,战场态势感知为零。复杂度一上来,你就不再是写代码的人,而是那个唯一看着全局的人:契约你来定,影响面你来盯,端到端回归你来卡。它负责把点做深,你负责让点连成线。


暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册