← 知识平台 课程 10 章 · 67 课 67/67 课完成

从0打造编码Agent

从 0 打造一个编码 Agent:循环 → 工具 → 权限 → 沙箱 → 上下文 → 记忆 → 编排 → 模型接入 → 评测
问题链 · 按章推进

一课回答一个问题,每课结尾暴露下一个缺口。主链按顺序走;缩进的「岔路」课来自学习中冒出来的真问题,可按需绕进去。

A0 工作流还是 Agent:什么时候需要 agent,什么时候一段代码就够? 6/6 完成

整门课的开篇。在写任何 agent 之前,先问要不要 agent:同一个修 bug 任务,一条轨道由代码决定每一步(workflow),一条由模型决定每一步(agent)。本课项目用本机 Qwen3-8B 把 4 个任务各跑了一遍两条轨道:workflow 修好 2 个、agent 修好 3 个,可在 workflow 已经够用的任务上,agent 花了 4.5 到 5.3 倍的 token,还有一个没修好。这一章从这些真实数字出发,讲清两条轨道的分野、它们之间的光谱,和先判别再选轨道的三条标准。

  1. 1
    修好 test_parse_date,最朴素的程序怎么写?
    ↓ 缺口:那就多加几步、多加几个分支?
    已完成
  2. 2
    多加几步、加分支,能覆盖所有情况吗?
    ↓ 缺口:把决定权交给模型,代价是什么?
    已完成
  3. 岔路 已完成
  4. 3
    把「下一步做什么」交给模型,要付什么代价?
    ↓ 缺口:模型决定下一步的那个循环,到底长什么样?(A1)
    已完成
  5. 岔路 已完成
  6. 实验
    同 4 个任务,workflow 与 agent 双轨真跑:每个任务哪条轨道够用?
    ↓ 缺口:进入 A1:模型决定下一步的那个循环,到底长什么样?
    已完成
A1 循环:模型只会吐文字,它怎么改你的文件?什么时候停? 8/8 完成

语言模型只会生成文字。这一章从「让它把命令写进回复、程序抠出来执行」出发,被真实数字一步步逼到工具调用协议、循环、双重校验的停止条件和轮数上限。全部数据来自本课项目 miniagent 用本机 Qwen3-8B 的 26 次真实运行;6 个开源 harness 的终止判定被搬进浏览器,与原实现逐格比对。

  1. 1
    模型只会吐文字,它怎么「动手」?
    ↓ 缺口:一次调用只能动一步,跑测试、读文件、改、再跑,怎么串起来?
    已完成
  2. 2
    一次调用不够,怎么让它连续干活?
    ↓ 缺口:那它什么时候停?「没有工具调用就停」够不够?
    已完成
  3. 岔路 已完成
  4. 岔路 已完成
  5. 3
    「没有工具调用就停」够不够?
    ↓ 缺口:停不下来怎么办?要不要给循环设上限?
    已完成
  6. 4
    要不要给循环设上限?设多少?
    ↓ 缺口:循环转起来了,模型怎么说清「改哪里」?(A2)
    已完成
  7. 岔路 已完成
  8. 实验
    同一个任务跑了很多次,循环每次怎么转、在哪一轮、因为什么停?
    ↓ 缺口:循环转起来了,模型怎么说清「改哪里」?(A2)
    已完成
A2 工具系统:模型怎么说清「改哪里」? 7/7 完成

循环转起来之后,模型得把「改哪里」说清楚。这一章从「报行号」出发,被真实数字一步步逼到唯一片段替换、容错匹配、语法约束的 patch,再看外部工具经 MCP 接进来时每一轮要付多少上下文。五个真实 edit 引擎被搬进浏览器,跑的是本课项目 trace 里的真实 edit。

  1. 1
    让模型按行号改,行不行?
    ↓ 缺口:片段锚定,匹配不上或匹配到两处怎么办?
    已完成
  2. 岔路 已完成
  3. 2
    old_string 和文件差一个空格,该报错还是容错?
    ↓ 缺口:能不能从源头就让模型写出合法格式?
    已完成
  4. 3
    能不能从源头保证 patch 格式合法?
    ↓ 缺口:内置工具之外,外部工具怎么接进来?
    已完成
  5. 4
    外部工具怎么接进来?MCP 放在哪一层?
    ↓ 缺口:工具能执行 rm -rf,谁来拦?
    已完成
  6. 岔路 已完成
  7. 实验 已完成
A3 权限与审批:它要执行 rm -rf 怎么办? 7/7 完成

模型已经能改文件、跑命令了。这一章从最朴素的黑名单出发,一路被真数字逼到规则求值语义、分层放行和模型审批:同一份规则换一种语义就换一个答案,问多了人就不看,审批者必须比被审者权限更小。规则和审批都管不到的部分,交给下一章的沙箱。

  1. 1
    拦危险命令,写个黑名单行不行?
    ↓ 缺口:规则一多就会冲突,听谁的?
    已完成
  2. 2
    两条规则冲突时,听谁的?
    ↓ 缺口:规则再好,每个调用都要人点「允许」吗?
    已完成
  3. 岔路 已完成
  4. 3
    每个调用都问人,人会怎样?
    ↓ 缺口:让另一个模型来审批,审批者该有多大权限?
    已完成
  5. 岔路 已完成
  6. 4
    让另一个模型来审批,审批者该有多大权限?
    ↓ 缺口:规则和审批都放行了一个 python -c,谁拦?
    已完成
  7. 实验
    实验课:真实调用 × 规则集 × 六种求值语义
    ↓ 缺口:规则和审批都放行了一个 python -c,谁拦?(A4)
    已完成
A4 沙箱与隔离:规则拦不住一个自己写文件的 Python 脚本,谁拦? 6/6 完成

上一章的权限规则和模型审批,看的都是「命令长什么样」。一个 python -c 脚本在运行时才决定写哪个文件,它们看不见。这一章交给操作系统:不管命令怎么写,越界的系统调用都会被内核拒绝。我们在本机用 sandbox-exec 加载 Codex 的真策略,把 14 条命令逐条真跑,看沙箱拦在哪、拦了什么、又拦不住什么;再看五家在沙箱、容器、不做之间怎么选。

  1. 1
    规则说不许写 ~/.ssh,一个 python -c 脚本写了,谁拦?
    ↓ 缺口:沙箱到底拦在哪、拦了什么?
    已完成
  2. 2
    沙箱到底拦在哪、拦了什么?
    ↓ 缺口:沙箱、容器、干脆不做——各家怎么选,代价是什么?
    已完成
  3. 3
    沙箱、容器、干脆不做——各家怎么选,代价是什么?
    ↓ 缺口:边界设好了,任务一长,上下文装不下怎么办?
    已完成
  4. 岔路 已完成
  5. 岔路 已完成
  6. 实验
    14 条命令 × 4 策略的真实录制:回放、对照、核对拒绝判定
    ↓ 缺口:边界设好了,任务一长,上下文装不下怎么办?(A5)
    已完成
A5 上下文:对话太长装不下怎么办? 7/7 完成

循环每转一轮,整段历史就要重发一次。这一章先把一轮请求拆开看清楚,再被真数字一步步逼着走:截掉最早的会丢掉读过的文件,裁工具输出会裁掉唯一关键的那一行,让模型写摘要会编出不存在的东西。最后落到现代做法:什么时候触发靠预留和真实 usage,压缩本身是给接手者写交接文档。全部数字来自本课项目的真实运行重放,四家的触发规则从 pin 源码移植进浏览器现算。

  1. 1
    上下文为什么会满?每一轮到底发了多少?
    ↓ 缺口:最省事的办法:截掉最早的消息,行不行?
    已完成
  2. 岔路 已完成
  3. 2
    直接截掉最早的消息,行不行?
    ↓ 缺口:什么时候触发压缩?按百分比、按余量,还是按估算?估算准不准?
    已完成
  4. 3
    什么时候触发压缩?按百分比、按余量,还是按估算?
    ↓ 缺口:压缩了之后,丢了什么?
    已完成
  5. 岔路 已完成
  6. 4
    压缩成摘要、整个重置,还是写交接文档?
    ↓ 缺口:会话压完了,明天开新会话,它还记得这个项目的规矩吗?
    已完成
  7. 实验
    实验课:八条真实运行 × 四家触发规则 × 几种压缩策略
    ↓ 缺口:会话压完了,明天开新会话,它还记得这个项目的规矩吗?(A6)
    已完成
A6 记忆与会话:明天它还记得吗? 6/6 完成

A5 让一个会话能接着干;可明天开一个新会话,messages 从空列表开始。这一章被真数字逼着走:规矩写在第一条消息里,压缩和新会话都会把它弄丢;记忆一写就刷新 system,前缀缓存在记忆块处断开;几十份技能全文塞进 prompt,比窗口还大;会话存成列表,换条路就得删掉原路径。现代做法落在四件事上:指令文件每个请求重注入、记忆冻结到下一个会话、技能索引常驻正文按需、会话存成树。全部数字来自本课项目的 T10 两天会话录制与 pin 源码。

  1. 1
    明天开新会话,它怎么知道这个项目的规矩?
    ↓ 缺口:agent 自己学到的东西,什么时候写进 prompt?
    已完成
  2. 2
    agent 自己学到的东西,什么时候写进 prompt?
    ↓ 缺口:流程性知识(skills)也这样全量注入吗?
    已完成
  3. 岔路 已完成
  4. 3
    几十个技能说明,全塞进 prompt 吗?
    ↓ 缺口:会话本身怎么存?想回到三轮前换条路呢?
    已完成
  5. 4
    想回到三轮前换条路,会话该存成列表还是树?
    ↓ 缺口:一个 agent 的上下文装不下整件事、或需要别人把关时,怎么分工?
    已完成
  6. 实验
    实验课:两天会话——冻结 vs 刷新、第二天读到了什么、一次分叉
    ↓ 缺口:一个 agent 的上下文装不下整件事、或需要别人把关时,怎么分工?(A7)
    已完成
A7 子 agent:一个 agent 忙不过来、或需要别人把关时,怎么分工? 7/7 完成

A5 讲满了怎么压缩;这一章换个方向:有些东西一开始就不进主窗口。把搜索交给一个新开上下文的子 agent,主窗口只收一段报告——本课项目的真实对照里,主上下文峰值 4 组有 3 组更低。随后被真数字一步步逼出三个新问题:交接只写一句任务会丢掉约束和已做过的判断;子 agent 的轮数和递归深度要按层管;干活的 agent(包括子 agent)说「做完了」不能算数。6 次真实运行没有一次通过验收,本章如实讲清这些结论的边界。

  1. 1
    要在整个仓库里找全 parse_date 的调用点,都读进主上下文吗?
    ↓ 缺口:子 agent 只拿到一句任务描述,会丢掉什么?
    已完成
  2. 岔路 已完成
  3. 岔路 已完成
  4. 2
    子 agent 只拿到一句任务描述,会丢掉什么?
    ↓ 缺口:子 agent 还能再派子 agent 吗?轮数预算算谁的?
    已完成
  5. 3
    子 agent 能无限派下去吗?轮数预算算谁的?
    ↓ 缺口:干活的 agent 评自己的活,可信吗?
    已完成
  6. 4
    干活的 agent 评自己的活,可信吗?
    ↓ 缺口:多个 agent、成百次请求,换模型、控成本怎么办?(A8)
    已完成
  7. 实验
    实验课:有 / 无子 agent 的真实对照
    ↓ 缺口:多个 agent、成百次请求,换模型、控成本怎么办?(A8)
    已完成
A8 模型接入:换模型、控成本怎么办? 6/6 完成

harness 和模型之间隔着一层线格式:请求怎么写、回复怎么一帧帧流回来、账单按哪几段 token 算。这一章从「写死一家的格式」出发,被真数字逼着走:同一段对话换一家,9 个语义位置全换了路径;并行的两个工具调用共用一个缓冲,拼出来不是合法 JSON;按全价估账,比按缓存四段算高出 2.6 倍,而开思考时输出才是大头。线缆数据来自本课项目在本机 mlx_lm.server 上的真实流式录制;两家云端的事件流按官方文档构造,标明不是录制;价格取 2026-09-26 的官方价格页快照。

  1. 1
    同一段带工具调用的对话,发给不同厂商长得一样吗?
    ↓ 缺口:回复是一点点流回来的,工具参数什么时候才能解析?
    已完成
  2. 岔路 已完成
  3. 2
    流式回来的工具参数,什么时候才能解析?
    ↓ 缺口:每轮都重发全部历史,钱花在哪?缓存能省多少?
    已完成
  4. 岔路 已完成
  5. 3
    每轮都重发全部历史,钱花在哪?缓存能省多少?
    ↓ 缺口:能跑、能换模型、能算清账了,怎么知道它到底修得好不好?(A9)
    已完成
  6. 实验
    实验课:真实帧逐帧回放,同一次运行换价目重算
    ↓ 缺口:能跑、能换模型、能算清账了,怎么知道它到底修得好不好?(A9)
    已完成
A9 评测:怎么知道它好不好? 7/7 完成

全课终点章。前八章搭出了一个能跑、能停、能改文件、有权限与沙箱、会压缩上下文、记得住规矩、能分工、能算账的 agent;这一章问它到底好不好。朴素做法一路被真数字逼着改:跑一次看成败,同一配置换 seed 就一次 ✗ 两次 ✓;拿平均成功率套 pass@k 公式,TB 4.0 榜首行算出 98.7%、实测 71.2%;直接比厂商榜单,同一个模型换 harness 能差 16 个点;只看分数,15 次失败只剩一个 0。最后把本课的 agent 经 Harbor 接上 Terminal-Bench 2.0:先用参考解确认环境(第一次 0 / 5 是 DNS),再跑 5 个任务 × 3 次,0 / 15;同一个 harness 在贯穿任务上 3 / 3。每次失败都落到带步号的标签上,然后回到 A0 复盘:哪些任务值得用 agent。

  1. 1
    修好 test_parse_date 一次,算它会修 bug 吗?
    ↓ 缺口:分数高,是模型强还是 harness 强?
    已完成
  2. 2
    分数高,是模型强还是 harness 强?
    ↓ 缺口:分数告诉你成没成,为什么失败要看什么?
    已完成
  3. 岔路 已完成
  4. 岔路 已完成
  5. 3
    它失败了,失败在哪一步、属于哪一类?
    ↓ 缺口:把自己的 agent 接上真实评测,要跑通哪几步?
    已完成
  6. 4
    把自己的 agent 接上真实评测,要跑通哪几步?
    ↓ 缺口:课程终点:回到 A0——哪些任务值得用 agent?
    已完成
  7. 实验
    实验课(终点):自己的 agent 上 TB 2.0,算清 pass@k / pass^k、给每次失败打标签,再回到 A0 复盘
    ↓ 缺口:课程到此结束:带着自己的判别标准和评测数据,再选一次轨道。
    已完成
← 返回知识平台 从「A0 导读 · 工作流还是 Agent:什么时候需要 agent,什么时候一段代码就够?」开始 →