主题
12 · 学完之后:演进方向
这一站是毕业典礼:主线十三站走完,你已经从「会调 API」走到「能组装生产级 Agent 系统」——循环手写过、防御真撞过、评估跑过分、全栈部署过。这一章不教新零件,做两件事:给你一张「已具备能力」的验收清单,和一张「接下来往哪走」的演进地图。
前置:01–11 全部(本章逐站点名,缺哪站回头补哪站) 配套读:agent-app/BACKLOG.md(演进方向的真实挂账——本章第二节的每一项都能在里面找到触发条件与设计稿) 深读:how-to · MATURITY(生产前置清单——演进方向的另一半)
一、你已具备什么:对照十三站逐条验收
学习最大的错觉是「都看懂了」。用证据说话——每一站你留下过什么:
| 站 | 能力 | 你的证据 |
|---|---|---|
| 01 | LLM API 与结构化输出 | 徒手调通 OpenAI 兼容网关;说得出 JSON 模式 vs 工具调用的可靠性排序 |
| 02 | 手写工具循环 | 200 行无框架循环带五道防御:maxSteps 保险丝 / 校验闸回灌 / 幂等壳 / 审批壳 / signal 中止 |
| 03 | 记忆与压缩 | 三层记忆 + 滚动摘要(超 40 条触发、压完保 20 条、模型挂了降级纯截断) |
| 04 | RAG | 五步链路全跑通;引用编号后端分配;入库逐块过注入扫描 |
| 05 | 工具层加固 | 会话+工具名+参数指纹的幂等窗口;壳组合器叠壳不改循环 |
| 06 | 护栏与安全 | 红队驱动的四道护栏:脱敏 / 防注入 / 审批闸 / 审计账本——洞是自己打出来的 |
| 07 | MCP 标准插口 | 任意 MCP 服务器工具并入工具表,循环一行未改 |
| 08 | 评估框架 | 76 例考卷三档判分;改 prompt 前后用跑分说话 |
| 09 | 产品线组装 | 硬规则路由优先于模型 + 三分类兜模糊 + 转人工带 HandoffPack + 降级转人工不报错 |
| 10 | Web 前端与 SSE | 事件驱动的流式对话;状态机是可脱离组件测试的纯函数 |
| 11 | 生产化与成熟度 | env 工厂切真实持久化;compose 四容器全栈;看得懂诚实清单上每一项差距 |
这张表也是面试时的「弹药库」:每一条都是一段你真做过的故事,不是背过的名词。验收方式很朴素——遮住右列,只看站名,你能对每一行说出自己的证据吗?说得出就是你的;说不出,那一站值得回去重跑一遍代码。
二、演进方向:从 BACKLOG 里挑真实条目
BACKLOG.md 的纪律是「挂账不遗忘,到触发条件再开工」——以下按主题归组,每项都有真实设计稿:
① 多 Agent 协作(编排器已实现)。编排的全生命周期就是三个字——拆(大任务变小任务)、派(小任务分配给谁执行)、跑(多个执行者协作不打架)。每个字对应编排器的一个阶段,也是面试的一条主线:
text
拆 Split ── 大任务怎么变成小任务?
│ · 什么时候拆:四个「超过」信号全满足才拆
│ · 怎么拆:按业务域 / 按认知角色 / 按数据权限
│ · 产物:TaskSpec[](id / goal / dependsOn / acceptance)
│
派 Dispatch ── 小任务怎么分配给谁执行?
│ · 依赖序:dependsOn 决定执行顺序
│ · 路由:硬规则先行(能 if/else 的不用 LLM)
│ · 工具表裁剪:最小权限(工人只拿该拿的锤子)
│
跑 Run ────── 多个执行者怎么协作不打架?
· 状态机:显式迁移表(非法迁移直接抛)
· 失败策略:retry / degrade / compensate / escalate
· 预算:token / 时间是控制信号不是监控指标
· 事件流:每步广播(可接 SSE / 审计 / OTel)**编排器(✅ 已实现)**就是这三个字的代码化——orchestrator/ 模块(8 文件 ~985 行,Effect 范式):显式状态机 + TaskSpec 验收标准(critic 已接线)+ DAG 波次并行派发 + 失败四分支策略 + 预算控制 + 失败终态落盘 + 事件流 + 可插拔三角色(Planner / Executor / Critic)。一键体验:pnpm team "查订单A-1024,未发货就建催发工单" --trace(--plan 传静态任务单 / --id 断点续跑)。主线教程见 09b · 多 Agent 编排,完整深读见 参考库 · 编排器。
P2 的示例目标设计得很妙:「查订单 A-1024,未发货就建催发工单」——正好逼出拆/派/跑三分工。风险也在账上写死了:planner 的计划 JSON 不稳(宽松解析 + 重试一次 + 失败降级单步)、critic 打回死循环(重试上限 2 次,超限带「未完全达成」诚实收尾)——你看,又是熟悉的「防御先行」味道。
② 压缩水位线升级。条数阈值(40 条)不是 token 的合格代理——40 条「你好」和 40 条 10KB 日志天差地别。工业做法:水位线 = 模型上下文窗口 × (1 − 25% buffer),估算三层(上次 usage 回馈校准 / 字符×模型系数 / 无数据退回条数兜底),压到窗口 50% 水位。改动边界只有一个文件(compression.ts),接口接缝就是为此留的。
③ 重试与退避。LLM 调用无 429/5xx 指数退避 + 抖动——模型调用失败即失败。先核实 ai SDK 内置重试的边界,再补应用层策略。
④ 生产壳:认证 / RBAC 多租户 / 限流 / CORS 收紧。web/api 目前对公网裸奔(11 站诚实清单原文)。
⑤ 在线评估。76 例是离线考卷;真实流量回流成数据集(trace 里躺着现成的样本),「有真实流量后」是它的触发条件——你自己的项目有流量那天,就是开工那天。
⑥ 语义缓存与成本面板。pgvector 存「问题 → 答案」,相似问题直接命中不再调模型;配套 token 用量聚合(usage 现在飘过就丢)。素材:week21 Day 6。
⑦ OTel 可观测。结构化日志 + 请求关联 ID 贯穿 + OTel GenAI 规范的 trace 导出——从 stderr 图标流升到工业级三件套(日志/指标/追踪)。素材:week21 Day 1。
先做哪个?按「设计稿完整度 ÷ 改动边界」排序:压缩水位线最适合先动手(设计稿带验收标准,只动 compression.ts 一个文件);重试退避次之(工业差距审查的 bug 级条目);生产壳与 OTel 等你有真实部署再开——BACKLOG 的触发条件纪律本来就是「到条件再开工,不提前透支」。
三、生态选型观:框架与平台的边界
学完手写再看生态,你的视角和入门者完全不同(素材:week12 加餐 · LangChain 生态地图):
- LangChain/LangGraph 不是一个框架,是一组分层的库:core(消息/工具/模型抽象)、langchain 1.0(
create_agent+ middleware 快捷方式)、langgraph(编排引擎)、langsmith(可观测)。create_agent幕后生成的正是你在 02 站手写的那约 30 行装配与路由——学手写不是为了拒绝快捷方式,是为了快捷方式对你不再是黑盒。 - 旧范式为什么死,看一眼就懂:LCEL 的管道符
|串的是直线(prompt | llm | parser),装不下 Agent 的环——执行工具、回填、再调模型的循环它从语法上就表达不了,这是旧 Chains 整体归进 classic 遗留包的根本原因。1.0 的扩展点是 middleware:SummarizationMiddleware(历史超阈值自动摘要——你在 03 站手写过的东西)、HumanInTheLoopMiddleware(工具执行前等人批准——你在 05 站套过的壳)。框架的进化方向,正是把你手写的那些「壳」收编成配置项。 - Dify / Coze 是低代码平台(素材:week19 Day 5 · Day 6):把高频管道固化成拖拽节点,原型半天出师;代价是表达力锁死在节点类型提供的范围里。平台「到顶」的三个信号:多 Agent 状态机、深度人机协同、评估体系——见一个就知道该回代码了。选型先答三个问题,答案自己会浮出来:
| 问题 | 云端 Coze | 自托管 Dify | 自建(手写/框架) |
|---|---|---|---|
| 数据能不能出域? | 不出域就排除它 | ✓ 数据在自己服务器 | ✓ |
| 逻辑有多复杂? | 高频管道内很快 | 到顶三信号出现就回代码 | 任意复杂度 |
| 谁长期维护? | 无需运维 | 要管一套 compose | 要管代码本身 |
立场一句话:框架是省事,代价是黑盒;手写版的可控性在你需要深度定制时完胜。什么时候该用框架?——02 站岔路 3 给过答案:当你发现自己在循环里重复造「消息裁剪 / 工具缓存 / 并行调度」这三个轮子时。在那之前,手写。
四、面试衔接:把这段经历变成 offer
主线十三站是一份现成的项目叙事,归档里备好了冲刺材料:
- week22 · 系统设计与复盘:系统设计方法论(缓存三件套 / 队列 / 异步任务)、STAR 法则复盘三个里程碑、简历写成成果导向——你的「里程碑」就是 agent-app 这套东西;
- week23 · 面试冲刺:Agent 八股(ReAct / RAG / MCP / A2A / 评估 / 安全 / 框架对比——每一样你都做过实物)、模拟面试、面试速查卡。
被问「你会 LangChain 吗」,低分答法是背组件名;高分答法是从分层开始答,最后补一句「等价的循环我自己手写过」——这半句你现在说得出口。
STAR 复盘也不用编——随手起一个头:S(客服 Agent 有建单这类高危写操作)→ T(模型好心办坏事怎么办)→ A(审批壳挂起等人裁决 + 幂等壳防重复执行,叠加顺序是审批在外幂等在内)→ R(同会话重复建单实测拿到同一个工单号;60s 超时自动拒绝)。一段话四个坑全是你踩过的实录。
两份材料共同的动作是「把做过的事翻译成面试官听得懂的语言」——翻译的原材料,第一节那张表已经给全了。
五、收尾:闭环已走通,起点永远在
回看这条线:从一次裸的 generateText 出发,加了手(工具循环)、加了记性(三层记忆)、加了书架(RAG)、戴了护具(护栏)、进了考场(评估)、组了产品(路由客服)、画了脸(SSE 前端)、落了地(容器部署)——从 0 到生产的完整闭环,每一环都是你自己敲出来的。
Agent 这个领域还在高速变化,但你在 02 站握住的那台发动机不会过时:所有新框架剥到最里层都是它。往后无论工具怎么换,你都有能力拆开看。
三个习惯值得带走,它们比任何一节知识都耐用:跑起来再说(每站的第一节永远是「先有体感」)、诚实标注边界(不知道就说不知道,没做就写进清单——本教程的成熟度矩阵就是这个习惯的产物)、用证据检验(改 prompt 前后跑分、切存储后进数据库数行数——「我认为」不算数,「我验证过」才算)。
下一步的起点也早写好了:往 examples/ 里加一个自己的工具(扩展指南 三件套:description / zod schema / execute)——从那里长出来的,可能就是你的下一个项目。
去吧。
动手任务(毕业不算通关,做了才算)
- 把第一节的能力表复制进自己的笔记,每条补一句「我当时的踩坑」——这份笔记就是你的面试弹药库。
- 从第二节挑一项 BACKLOG 条目实现它(推荐压缩水位线:设计稿最完整、改动边界最小),给仓库提你的第一个演进 PR。
- 改造:给
examples/加一个你自己业务里的工具,跑通「模型自己决定调它」的那一刻——把这一刻记下来。
自测题(先凭记忆答,再展开)
- 多 Agent 相对单 Agent 只多出哪三个新问题?编排器(
orchestrator/)里 Planner / Executor / Critic 三角色分别对应哪个? - 「什么时候该用框架」的判断标准是什么?为什么说学过手写的人用框架更有优势?
- 压缩水位线升级要替代什么现状?估算三层指哪三层?
答案
- 分工(谁干什么)、共享状态(互相知道什么)、质量闭环(谁验收);Planner 对应分工、StateStore 快照对应共享状态、Critic 对照 Acceptance 验收标准对应质量闭环(Executor 是干活的工人)。一键体验:
pnpm team "目标"。 - 当你发现自己在重复造「消息裁剪 / 工具缓存 / 并行调度」三个轮子时(02 站岔路 3);手写过的人知道框架幕后的每一根线怎么接——快捷方式行为不对时能拆开看,不是黑盒。
- 替代「写死 40 条消息触发压缩」的条数阈值(条数不是 token 的合格代理变量);三层 = 上次 generateText 的 usage 回馈校准、字符数×模型系数估算、无任何数据时退回条数兜底(向下兼容)。
延伸
- agent-app/BACKLOG.md(GitHub)
- 下一站:13 · 面试实战:带着问题通关 —— 用十七道高频面试题反向验收十三站 —— 演进方向的真实挂账:每项带触发条件与设计稿
- how-to · MATURITY —— 生产前置清单;扩展指南 —— 加工具 / 加存储 / 换网关的最小步骤
- 归档周教程:week21 · 可观测与成本 · week22 · 系统设计与简历 · week23 · 面试冲刺
- 下一站:毕业 —— 主线到此收束;新故事从你往
examples/里加的那个工具开始