1. 核心思路:为什么AI开发必须测试驱动
先说一个挺现实的现状。这两年大模型应用开发、AI Agent开发的项目越来越多,但我见过的团队里,真正能把交付节奏稳定住的,往往不是那些“提示词写得特别花”的,而是那些愿意把测试前置、把任务拆清楚的。这个现象一开始我也没太在意,直到自己在一个RAG项目上连续踩了三次“修完这个问题,冒出那两个新问题”的循环之后,才算彻底想明白一件事:AI开发的不确定性,天然需要外部约束,而这个约束最好的来源,就是测试。
1.1 传统开发的TDD经验不能直接搬
传统的测试驱动开发(TDD),核心循环是红-绿-重构:先写一个失败的单测,再写让测试通过的最小实现,然后重构。这套方法论在确定性系统里非常好用,因为函数输入输出基本可预期,行为边界是清晰的。但一旦进入AI应用开发,事情就变了:
- 模型的输出有随机性,同样的输入,温度和top_p不同,结果可能差一大截。
- 提示词工程的改动往往是“牵一发动全身”,这边把格式修好了,那边逻辑又开始漏。
- Agent开发里,工具调用的顺序、分支选择、兜底策略,叠加起来是一个巨大的状态空间,根本没法用传统的穷举式单测覆盖。
我见过不少团队拿着传统TDD的套路硬套AI项目,最后结果都是测试写了一堆,但没有一个能稳定跑过三天,维护成本高到让人怀疑人生。所以在AI开发里,测试驱动不是说“先写单元测试再写代码”,而是说:先用架构和测试策略把任务的边界锁死,再动手开发。
1.2 测试驱动AI开发的本质:用测试锁定任务边界
后来我自己做AI Agent开发的项目多了,慢慢总结出一个相对能用的方法,也是这篇文章标题里想讲的:把架构和测试策略当作任务分解的输入,先想清楚“怎么测”,再确定“做什么”。这句话听起来有点绕,我换个方式解释。
你在拆分一个AI开发项目的时候,不是按“功能模块”一刀切,比如先做文档解析、再做向量检索、最后做生成回复。而是先想清楚:这个项目里,哪些部分是确定性逻辑,哪些部分是模型行为,各自用什么方式验证。这个“验证方式”就是任务分解的核心依据。
说得直白一点:任务不是按模块拆的,是按测试策略拆的。 确定性逻辑用单测锁行为,模型输出用黄金测试集锁质量,集成链路用契约测试锁交互。不同的测试策略对应不同的任务边界和责任范围,每一步做完了,都有明确的验收信号。
这个思路在和架构结合之后更落地。比如你做一个分布式的AI Agent系统,上游是意图识别服务,中间是任务规划引擎,下游接了一堆工具调用。每个服务之间的接口定义,本身就是契约测试的天然载体。接口定清楚了,测试写出来了,任务自然就被拆成了几个可以并行推进、独立交付的单元。
所以整个方法论的核心逻辑是:架构先行(确定边界和交互方式),测试策略跟上(确定每个边界如何验证),任务分解随后(依据验证方式切分交付单元)。这套逻辑下来,AI开发不再是“边写提示词边看效果”的玄学,而是一条看得见、测得到、能卡进度的流水线。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 架构先行与测试策略设计:先将边界定型再动手
2.1 架构先行的核心:明确边界才能谈测试
做AI应用开发,很多人习惯拿到需求就开写,先调通一个能跑的Demo再说。这个思路在原型验证阶段没有错,但一旦项目进入正经交付阶段,问题马上暴露:提示词散落在代码里,数据处理逻辑和模型调用糊在一起,不同的模块之间通过隐式的文本格式约定交互,根本没法做针对性测试。
我自己的习惯是,在任务分解之前,先花半天到一天把架构图画出来。不是那种特别复杂的UML图,而是一个清晰的模块划分和数据流向图。重点回答几个问题:
- 输入数据从哪来,格式是什么,进入系统后第一步做什么归一化处理。
- 哪些模块调用大模型,哪些模块是纯逻辑处理,哪些模块是外部工具/服务交互。
- 模块之间传递的数据结构是什么样的,用Pydantic模型还是TypedDict,字段约束有哪些。
- 错误处理和兜底策略在哪一层做,每层的失败标准是什么。
有了这个架构图之后,测试策略就有地方落了。每一个模块边界,就是一条测试线。纯逻辑模块用单元测试覆盖边界条件,模型调用模块用黄金测试集锁输出质量,跨模块交互用契约测试锁接口兼容性。这里有个特别需要注
