教你跑通一个全自动 Coding Agent 的 MVP —— 大模型规划,小模型干活
我最近想验证一个反直觉的猜想:
在多 agent 编排里,非思考小模型反而比思考大模型更省钱。
为了验证这件事,我搭了个最小 MVP:hero-coding。然后用同一个 harness 跑了三组模型:ChatGPT 5.4、Ling-2.6-flash、Ling-2.5-1T。
跑出来的数据让我推翻了自己一开始的判断——并不是单纯的小模型赢。
下面把整个过程拆开讲。
一、什么是全自动 coding agent
一句话:丢一个 user story 进 inbox,半天后回来看 git log,检查完成情况。
inbox/us-001.md ← user story(markdown + frontmatter)
│
▼
Dispatcher ──── 监听 inbox/,spawn 子进程
│
▼
Worker ──── pi-coding-agent --mode json
│ 原子化执行,每改一个东西就 git commit
▼
Judge ──── 读 git log + 全部 diff,结构化 verdict
│
┌───┴───┐
PASS FAIL
│ │
▼ ▼
done/ 把 reason 追加到 story,再起一轮 worker
三个组件全是 stateless 一次性进程:
- Worker 一次只活一遍,跑完退出
- Judge 一次只活一遍,给完结论退出
- 所有状态都靠 git + 文件系统持久化
这正好是 brief 里反复推的工作流形态——长任务一直执行其实就是短任务串成长链。
Worker 这一块我直接用 @badlogicgames 的 pi-coding-agent。Mario 在他自己的 README 里也说:
Pi 故意不做 sub-agent 和 plan mode,留给你自己扩展。
我做的就是那个扩展——用 ~400 行 TypeScript 把 pi 包成一个有 inbox 的自动变成小助手:
这个比例就是文章想说的另一件事:搭一个真的能跑的 coding agent 工厂,不需要重写一个 coding agent。把现成的 harness 拼好就行。
二、什么是 user story
一个最小可执行的任务单位。我用 markdown + frontmatter 写:
---
id: us-001
title: Add timezone parameter to formatDate
priority: normal
max_retries: 3
---
## Goal
给 formatDate 加可选 timezone 参数,默认 UTC。
## Acceptance Criteria
- [ ] 函数签名加 timezone?: string
- [ ] 不传时和现在 byte-identical
- [ ] 传 Asia/Tokyo 时按该 tz 格式化
- [ ] 在 tests/utils.test.ts 加 3 个测试
- [ ] npm test 全绿
## Out of Scope
- 不改其他函数
- 不动 locale 设置写好之后丢进 inbox/,Dispatcher 自动接管。
模板里 Out of Scope 比 Goal 更值钱——非思考小模型容易自由发挥,这一节是给它的紧箍咒。brief 里输入越清楚结果越好那条直接呼应。
三、跑了什么、用什么跑的
我准备了一个故意带 bug 的 mini TS 项目(examples/target-repo-pristine),3 个 utility 函数:
- formatDate(date) —— 不支持 timezone(待加)
- parseRange(1-5) —— 应该返回 [1,2,3,4,5],但有 off-by-one 返回 [1,2,3,4]
- formatNumber(-1234) —— 应该返回 -1,234,但代码 bug 返回 --1,234
3 个 user story 对应三种典型工作量:
3 组模型对照:
- ChatGPT 5.4(思考模型)—— 通过本地反代走真实账号
- Ling-2.6-flash(非思考小)—— 蚂蚁百灵 OpenAI 兼容 API
- Ling-2.5-1T(非思考大)—— 同上
Worker 和 Judge 通过 ~/.pi/agent/models.json 配置不同 provider,全部走 OpenAI 兼容协议,model 字段一改就能切。
四、跑出来的数据
原始表格统计数据:
由上面的数据可得的结论
1.明确 bug 修复,Ling-flash 比 ChatGPT 快 31%
us-002 同一个任务,Ling-flash 90s,ChatGPT 131s。Ling-flash 调了 52 次 tool(比 ChatGPT 的 14 次多得多),但每次都极快——这也是 Ling-flash 主打的:小步快跑。
这种高频小任务场景就是 Ling-flash 的舒适区:编辑器补全、快速改写、报错修复。
2.加功能任务,Ling-1T 用 ChatGPT 的 11% token、63% 时间
us-001 同一个任务,Ling-1T 1 轮 130s 13K token 就过了。ChatGPT 用了 2 轮 205s 120K token——10 倍的 token 量级差距。
为什么?因为 ChatGPT 5.4 思考更多内容,每次响应都隐式 reasoning,输入 prompt 又被来回带进 context。Ling-1T 思考强度更克制一点,token 都花在理解和输出上。
3.加输入校验,Ling-1T 又是 33% 更快
us-003 同一个任务(给 parseRange 加边界校验 + 友好错误信息 + 测试),Ling-1T 1 轮 58s 7 tools 5K token,ChatGPT 1 轮 86s 8 tools 13K token。两个都过,但 Ling-1T 用一半多一点的时间和 40% 的 token。
3 个对照里 Ling 全部胜出——胜幅 30-36%。实测来的,不打诳语,同一个 harness、同一个 user story、同一个 Judge 跑出来的数据。仓库里 runs/*.json 全部公开。
五、总结
我一开始全部用 Ling-2.6-flash 当 worker,结果 us-001 死循环了——worker 改完代码后陷入echo done循环停不下来:
worker → bash: echo All criteria met.
worker → bash: echo All criteria met.
worker → bash: echo All criteria met.
... (一直到 80 tool 上限触发)
woker 的日志记录
后来我想到,这样做:
Ling-2.6-1T 负责理解、规划、拆解,Flash 负责快速执行、快速补全和快速修补。
flash 根本就不该承担 us-001 这种加功能 + 写测试的设计任务非思考小模型一点规划也不能做。只能是 Ling-2.6-1T 来做。
把 us-001 的 worker 换成 Ling-1T 之后,1 轮就过了。
实测结果:非思考小模型用对了地方,比思考模型又快又便宜;用错了地方,就乱来了。
六、harness 在干什么—— harness 工程的简单且有效的实践
我这次开发 Coding Agent 一共翻车五次,全是非思考小模型的典型 pitfall。虽然看似简单的一个小小编程 coding,但只有真跑过你才知道有需要怎么样的 harness 去做兜底,然后让小模型能够顺利完成任务。
Claude 写的护栏代码加起来不到 50 行。
循环检测(worker.ts,~10 行):
const recent: string[] = [];
if (sig) {
recent.push(sig);
if (recent.length > 6) recent.shift();
if (recent.filter(s => s === sig).length >= 4) {
child.kill(SIGKILL); // 同一 sig 6 次窗口内出现 4 次 = 循环
}
}Auto-rescue commit(dispatcher.ts,~10 行):
async function autoRescueCommit(repo: string, round: number) {
const status = await git([status, --porcelain], repo);
if (!status.trim()) return false;
await git([add, -A], repo);
await git([commit, -m, `chore(rescue): ${round}`], repo);
console.log( ↳ auto-rescue: committed pending changes left by worker);
return true;
}第二个特别值得说——Ling-1T 在 us-003 上把代码全改对了,但忘 commit。如果没有 dispatcher 这一层兜底,Judge 看 git log 会说没 commit 直接 FAIL,整个 round 白跑。dispatcher 自动 commit 之后 Judge 立刻 PASS。
七、写在最后
这篇文章一直都落在想法库,未写出来,趁着 Ling 模型发布,就顺便来验证我自己的瞎想了。
-
Ling-2.6-flash 在它擅长的高频小任务上确实更快(us-002 比 ChatGPT 快 31%)。如果你在搭 IM 助手、编辑器补全、批量改写、code review 标注这类高频低延迟工作流,flash 是好选择。
-
Ling-2.5-1T 做规划和理解类任务能省到夸张的 token(us-001 比 ChatGPT 省 89%)。1M 上下文的优势在 multi-agent 场景里特别突出——可以把整个仓库 + 所有 git history 一次喂进去。最关键的是还很便宜。
-
小模型跑 agent 必须配 harness。这不是 Ling 的问题,是非思考模型本身的特性。所以我用 ~400 行就把 harness 写出来了,放进去跑就很安逸了。
-
Ling 1T 作为大脑 + flash 手分工是真理。
如果让我给一个最简单的建议:在你已经有真实 harness 的场景下,换成 Ling-2.6 系列,按上面说的分工用——你的 token 会下降一个数量级,速度反而上去。
如果你想自己跑这套 demo,仓库在评论区,自取。
跑起来你就会看到 Worker 实时滚动每个工具调用——这一段我特别推荐你亲自跑一次,比读这篇文章值钱。
最后来个小彩蛋~~
👉 想获取更多 AI 实操干货、工具资源和最新玩法
欢迎加入AI Spark「限时免费」社群 !
一起学习交流 + 资源共享,添加小助理v:rivanow
名额有限,先到先到~
来源
暂无来源