从零到一:我如何用对抗式方法设计并实现了一个 AI 任务引擎
一天之内,从一张白板到 3838 行代码上线,这大概是我做过最疯狂的 side project 了。
这一切是怎么开始的?
事情要从一个尴尬的时刻说起。
那天我让 AI 帮我处理一个任务,它花了三分钟,洋洋洒洒写了一大篇,结果我一看——方向全错了。它把简单问题当复杂问题处理,把需要多步协作的任务用一个 prompt 就打发了。
我心想:不行,得让这个 AI 学会判断任务难度,再用不同的方式去处理。
这个想法并不新鲜——很多工程系统都有类似的任务分级。但我的需求有点特殊:我需要 AI 自己判断任务的复杂度,然后在每次调用 LLM 的时候,都注入相应的提示词来做规范。不是让一个子代理完成整个流程,而是每次只让它完成流程中的一步。
对抗式解题法给了我这个思路——把一个复杂问题拆解成多个步骤,每个步骤由不同的”角色”来完成,环环相扣,层层把关。
于是,一个疯狂的想法诞生了:我要在一天之内,完成从设计到上线的全流程。
第一站:复杂度分类器
任何任务引擎的第一步,都是判断”这个任务有多难”。
我设计了一套两段式架构:
- Phase 1(预分类):任务刚进来时,通过文本特征分析快速判断是简单、中等还是复杂。这一阶段不依赖任何工具调用,纯文本分析,几十毫秒出结果。
- Phase 2(动态监测):任务执行过程中,EngineMonitor 持续观察进展。如果发现任务其实比预想更难(比如 solver 卡住了、结果质量不达标),自动触发升级信号,把任务从”简单”升级到”中等”或”复杂”。
三级分类表如下:
| 等级 | 典型任务 | 处理方式 |
|---|---|---|
| 🟢 简单 | 查询信息、格式化输出、翻译 | 单次 LLM 调用 |
| 🟡 中等 | 代码编写、文案创作、数据分析 | Solver + Discriminator 两步 |
| 🔴 复杂 | 跨领域问题、多步骤推理、系统设计 | 完整对抗式解题法流程 |
关键设计决策:置信度阈值三档制(≥0.8 直接判定 / 0.6~0.8 软判定 / <0.6 兜底),以及误分类容错机制——分类错了不要紧,Phase 2 的动态监测会把你拉回来。
第二站:管道执行引擎
分类完了,任务该怎么执行?这是我设计的三条管道:
1 | 简单任务 → SimplePipeline: [单次LLM调用] → 直接输出 |
每条管道的每一步,都在调用 LLM 之前注入特定的角色提示词。比如 Solver 步骤注入架构师提示词,Discriminator 步骤注入现实检验者提示词。
这里有个关键设计:角色提示词分层继承体系。
1 | _base.prompt(根级模板) |
总共 16 个角色提示词文件,每个都有 frontmatter(role_id、name、extends、version 等字段),支持模板继承和占位符渲染。
第三站:交付与质量闭环
任务执行完了,不能就算完。我需要一个质量闭环:
- QualityGate(质量门禁):每次 pipeline 输出都要经过自动化质量检查。如果质量不达标,触发重新执行或升级。
- EngineMonitor(引擎监控器):持续监测任务执行状态,检测”是否需要升级处理”或”是否陷入死循环”。
- FeedbackCollector(反馈收集):记录每次任务执行的指标——耗时、完成率、失败原因、升级事件。
- MetricsAggregator(指标聚合):把原始数据变成可行动的洞察。
- AuditLogger(审计日志):所有事件不可篡改地记录,方便事后复盘。
这个设计让我在后续的数据驱动优化中尝到了甜头——没有数据,优化就是盲人摸象。
三场硬仗:对抗式评审
设计稿写出来了,但我问了自己一个问题:这些设计真的能落地吗?
为了回答这个问题,我引入了判别者角色——让我自己的 AI 切换视角,像审计员一样审视设计文档。
第一次评审,发现了 8 个问题——包括 P1 级的”分类接口未定义”和”Phase2 执行主体不明确”。
修。修完了再审。
第二次评审,又发现了 9 个跨站一致性问题——比如目录结构冲突(prompts/ vs engine/roles/)、数据流定义缺失(PipelineResult 没定义)、状态管理分歧(state.json vs ExecutionContext)。
再修。修完再审。
第三次评审——17/17 修复全部通过验证。
整个过程让我深刻体会到:写代码容易,做对设计难;做对设计容易,让多个设计保持一致难。
这就是对抗式解题法的威力——你既是解题者,也是判别者。自己给自己把关,比等人来骂你效率高多了。
实施编码:从 0 到 3838 行
设计通过评审后,我开始编码。但有意思的是,评审阶段我发现代码已经写了很大一部分——因为设计文档里包含了大量伪代码和实现思路,很多直接转化成了 Python 代码。
最终成果:
1 | 36 个 Python 文件 — 3838 行代码 |
核心架构如下:
1 | 任务输入 |
端到端测试:23/23 全部通过
代码写完后,我跑了 23 个端到端测试用例,覆盖:
- 简单任务(5 个):天气查询、翻译、格式转换等
- 中等任务(8 个):代码编写、文案创作、数据分析
- 复杂任务(7 个):系统设计、多步骤推理
- 边界情况(3 个):空输入、超长文本、模糊指令
结果:23/23 全部通过。
交付验证检查了 7 个维度——代码完整性、模块可导入性、角色文件正确性、测试通过率、目录一致性、配置完整性、文档索引完备性——全部通过。
数据驱动优化:用数字说话
测试通过不代表完美。我跑了 40 个基准任务,拿到第一组真实数据:
| 指标 | 优化前 | 优化后 |
|---|---|---|
| 完成率 | 82.5% | 87.5% |
| 失败率 | 17.5% | 12.5% |
| 升级检测率 | 0% | 7.5% |
| 平均耗时 | 0.02s | 0.02s |
关键发现:
- 质量门禁过于严格——有些正常输出被误判为”质量不合格”。调整阈值后,误判率大幅下降。
- 升级检测没触发——RewardMonitor 的收敛检测太保守,调整灵敏度后开始正确识别需要升级的任务。
- Bug 藏在细节里——一个
PipelineResult.__init__的参数顺序问题导致了数据显示错误,修复后数据链路完全打通。
没有数据,你永远不知道你的系统在真实场景下表现如何。 这是这次经历给我最深刻的教训。
上线:三个层级的选择
系统测试通过了,但”上线”有不同的含义。我定义了三个层级:
- 🅰️ 层级 A:启用任务管理工具(create/list/claim/transition 等 CRUD 操作)——一键开关,零风险
- 🅱️ 层级 B:任务创建后自动经分类器 → 管道执行器处理——核心价值所在
- 🅲 层级 C:引擎完全接管 AI 主循环——架构级变更
最终选择了 层级 A 先跑起来,让任务管理工具链立即可用。至于层级 B 和 C,可以逐步推进。
写在最后
这 24 小时,我从一张白板开始,经历了:
- 三站设计:复杂度分类 → 管道执行 → 质量闭环
- 三轮评审:判别者视角审计,修复 17 个问题
- 编码落地:3838 行 Python 代码
- 端到端测试:23/23 全部通过
- 数据驱动优化:完成率 82.5% → 87.5%
- 正式上线:引擎可用
最大的收获不是代码量,而是这套工作方法:
- 对抗式解题法:解题者和判别者轮流上阵,自己给自己把关
- 数据优先:不要在黑暗中优化,先跑出数据再决策
- 分步上线:不是 all-or-nothing,而是渐进式交付
如果你的 AI 也有”任务处理”的痛点,不妨试试这套方法。毕竟,让 AI 学会衡量自己该花多大力气,本身就是一种元认知的进化。
文章由 AI 辅助撰写,但设计决策和代码实现全部手动完成。