学 AI 产品 · 专业 AI 产品经理播客第 1 章 · T1 工程师补课:进阶 · 算法 · 数据结构 · EP 01
第 1 章 · EP 01

为什么 Agent 跑不了长任务 · 三类风险:滥用、失控、外部攻击

时长 16:10音色 云健 · 男声

同步字幕

章节导航(点击跳转)

0:00开场1:27
1:27两种典型的失败模式2:18
3:46双角色分工与增量推进2:55
6:41脑手分离:三个组件2:44
9:26会话不等于上下文窗口2:27
11:54三类风险与两层防线2:43
14:37可带走的设计原则1:32
解读全文

长运行智能体的工程底座:交接、组件拆分与两层防线

本集对应小山学堂《学 AI 产品,从入门到精通》T1 模块第 1 集,取材自「为什么 Agent 跑不了长任务」「Initializer + Coding Agent」「Managed Agent:脑手分离」「Session ≠ Context Window」「三类风险:滥用、失控、外部攻击」五节。

一、这一集在解决什么

长运行智能体(Long-running Agent)之所以难,不在于模型写不出代码,而在于上下文断裂时的连续性无法维持。本集把这个问题拆成四个可分别治理的层次:

层次问题解法
行为层一口气做太多 / 过早宣布完成双角色分工 + 增量提交
架构层容器挂了任务就死Session / Harness / Sandbox 三组件解耦
存储层压缩不可逆,原始信息丢失Session 持久化事件流,Context Window 只做临时视图
安全层注入、越权、失控模型层 + 环境层双层 Containment

四个层次彼此独立,可以分别评估、分别改造。这也是本集最值得带走的思维框架:把「跑不完」这个笼统问题,拆成四个可验证的工程问题。


二、能力地图

能力地图 · 长运行智能体的七项基础设施

  1. 进度文件(Progress File) —— 跨轮次的状态载体,新 Agent 接手时唯一需要读的东西。
  2. 功能清单(Feature List) —— 结构化记录待办与完成状态,是「还差什么」的唯一事实来源。
  3. 增量提交(Incremental Commit) —— 每轮结束代码处于可合并状态,提供回滚点。
  4. 端到端验证(E2E Verification) —— 用浏览器自动化真点一遍,而非模型自证完成。
  5. 事件流持久化(Append-only Session) —— 原始事件永不丢失,可回溯、可重放。
  6. 组件解耦(Brain / Hand 分离) —— 任一组件失败可独立重建,不等于任务失败。
  7. 双层 Containment —— 模型层训练偏好 + 环境层结构性阻断。

这七项里,前四项决定「能不能跑完」,第五、六项决定「跑多久会不会崩」,第七项决定「崩了之后损失多大」。

能力地图 · 三类风险的识别口径

类别来源典型表现主要防线
滥用 Misuse用户侧主动生成钓鱼内容、越狱、诱导执行恶意代码模型层 + 审批机制
失控 Misbehavior模型自发过度行动、幻觉驱动操作、越权访问、死循环最小权限 + 环境层
外部攻击 External Attack数据源提示词注入、供应链篡改、数据投毒、间接注入沙箱隔离 + 供应链审计

三、审查清单

审查清单 · 评估一个长运行 Agent 产品是否靠谱

交接机制(缺一项即判定为「跑不完」高风险)

  • 是否存在跨轮次的进度文件?新会话能否仅凭该文件恢复上下文?
  • 功能清单是否为结构化格式(JSON 而非 Markdown)?
  • 是否强制「一次只做一个功能」?
  • 每轮结束代码是否处于可合并状态(无半成品、无语法错误)?
  • 是否有 git commit 作为回滚点?

验证机制

  • 是否使用 Puppeteer / Playwright 等浏览器自动化做端到端测试?
  • 是否明确禁止 Agent 修改或删除已有测试?
  • 「功能完成」的判定标准是 E2E 测试结果,还是模型自述?

架构解耦

  • Session、Harness、Sandbox 是否独立部署?
  • 沙箱故障是否表现为「工具调用返回错误」而非「会话丢失」?
  • 容器是否可在 Harness 启动前异步准备(影响 TTFT)?
  • 凭证是否通过环境变量注入或外部 vault 代理,Agent 无法直接读取?

上下文管理

  • 原始事件是否持久化在 Session 中(append-only)?
  • Context Window 是否仅作为临时视图?
  • 压缩后是否仍能从 Session 重建原始细节?
  • 是否提供类似 getEvents() 的范围查询 / 过滤接口?

安全

  • 是否同时具备模型层与环境层防线?
  • 是否按任务粒度授权?
  • 高危操作是否有人工审批?
  • 网络访问范围是否受限?
  • 每个 MCP / 第三方集成是否按供应链风险审计?

四、约束说明

约束 · 上下文压缩的不可逆性

Compaction(压缩)与 Trimming(裁剪)都是不可逆操作。一旦执行,原始细节永久丢失。而压缩决策发生在「当下」,你无法预知未来哪些 token 会成为关键决策依据。这是信息论层面的硬约束,不是工程优化能绕过的。

推论:原始数据必须存在 Session 里,Context Window 可以随便丢。丢了 Context 的代价是「重新组装」,丢了 Session 的代价是「永远回不来」。

约束 · 为什么功能清单不能用 Markdown

模型对 Markdown 的处理倾向是「顺手重写整段」,而对结构化格式(如 JSON)的倾向是「定点修改字段」。在长运行场景下,一次意外的整段重写就足以让清单失效。

推论:凡是 Agent 需要长期维护、且结构稳定性要求高的数据,优先选择结构化格式。

约束 · 测试会被悄悄放水

如果不显式禁止,Agent 在测试失败时会倾向于修改测试本身而非修复实现。这不是恶意,是目标函数的自然结果——「让测试通过」比「让功能正确」更容易达成。

推论:提示词中必须使用强措辞,明确「不允许删除或修改已有的测试内容」。

约束 · 安全不能只靠提示词

提示词属于模型层防线,依赖模型「想做对」。但外部攻击(特别是间接提示词注入)会直接作用于模型输入,绕过你的意图。

推论:环境层防线(沙箱、权限、审批、网络隔离)不可替代。模型层让它想做对,环境层让它做错也做不到。

约束 · MCP 是攻击面放大器

每接入一个 MCP Server,就新增一个数据注入入口。风险来自两个方向:不可信 Server 篡改工具描述;可信 Server 返回的内容中嵌入注入指令。

推论:接入策略应等同于第三方 SDK 审计——信任,但要验证。


五、实践提示

提示1 · 先解决交接,再优化模型能力

很多团队把长任务失败归因于「模型不够强」,于是等下一代模型。但从本集的失败模式看,一次做太多和过早宣布完成都与模型能力无关,纯粹是缺少交接机制。

正确顺序是:先搭好进度文件 + 功能清单 + 增量提交这三样最朴素的基建,再谈模型升级。这三样的实现成本极低,但没有它们,换任何模型都跑不完。

提示2 · 用「一次一个功能」强制制造上下文边界

「一次只做一个功能」表面上是效率约束,实质是上下文边界的强制划分。它同时带来四个收益:代码可合并、有回滚点、进度可查、窗口不溢出。

如果你正在设计自己的 Agent 循环,把这条写成硬约束(而非建议),收益最大。

提示3 · 让端到端测试成为唯一的完成判据

模型自述「已完成」在长运行场景下几乎没有信息量。必须把完成判定权交给外部执行结果——真正打开浏览器、点击、断言。

建议做法:把 E2E 测试结果写回功能清单的 passes 字段,形成「清单 → 实现 → 测试 → 更新清单」的闭环。

提示4 · 组件解耦的判据是「故障是否可独立恢复」

判断一个架构是否真的解耦,不要看部署图,看故障行为:

  • 沙箱挂了 → 是「工具调用返回错误,Agent 决定重试」还是「会话丢失,任务失败」?
  • Harness 挂了 → 能否无状态重启并从 Session 恢复?
  • Session 挂了 → 数据是否持久化?

如果任一组件的故障会导致任务整体失败,那它就不是解耦,只是拆了目录结构。

提示5 · 用内存与硬盘的类比做架构评审

Context Window 是内存(快、小、易失),Session 是硬盘(慢、大、持久)。评审时问一句:这个系统有没有把「本该存硬盘的东西塞进内存」?

典型的反模式:把所有历史事件都塞进上下文窗口,然后用压缩来救火。正确做法是按需加载,Session 存全量,Context 取子集。


六、进度文件该写什么

进度文件是整个交接机制的核心载体,内容质量直接决定下一轮能否无缝接续。建议至少包含三块:

第一块:已完成功能及其通过状态。 每个功能逐条记录,通过状态必须是布尔值(真 / 假),不允许出现「大概完成了」这类模糊表述。

第二块:当前代码状态与已知问题。 包括当前分支、最近一次提交的摘要,以及已经发现但尚未修复的坑。这一块能避免下一轮智能体重复踩同一个坑。

第三块:下一步建议及理由。 最容易被漏掉,但恰恰是交接的核心——前任的判断比代码本身更值钱。代码可以从提交历史里读出来,而「为什么先做这个而不是那个」的判断依据,只能靠显式记录。

配套的一条硬约束:提示词中必须明确禁止智能体删除或修改已有测试内容。否则它会为了让测试通过而降低标准,这是目标函数的自然结果,不是恶意行为。


七、可带走的设计原则(口播末段对应)

  1. 先解决交接再优化能力。
  2. 一次只做一个功能,每轮结束代码可合并。
  3. 功能清单用结构化格式,禁止 Agent 修改已有测试。
  4. 验证必须端到端。
  5. 思考与执行拆开,组件可独立失败、独立重建。
  6. 原始事件永久存 Session,Context 只是临时视图。
  7. 安全至少两层,每个外部集成按供应链风险审计。

八、常见误区与纠偏

误区一:把长任务失败归因于模型能力不足

最常见的误判。观察到「Agent 做不完」,第一反应是等更强的模型。但从失败模式看,一次做太多与过早宣布完成都跟模型能力无关,纯粹是缺少交接机制。

纠偏:先搭进度文件、功能清单、增量提交三样基建(实现成本极低),再谈模型升级。没有这三样,换任何模型都跑不完。

误区二:指望加大上下文窗口根治问题

窗口再大也有上限,而需求可以无限叠加。真正的分水岭不是「一次能装多少」,而是「装不下的那部分去了哪里」。若答案是「丢了」,窗口多大都是同一结局,只是晚一点崩。

纠偏:先建持久化 Session,再考虑扩容窗口。顺序反了,扩容只是延后崩溃时间。

误区三:把「模型自述完成」当作完成判据

模型自述「已完成」在长运行场景下信息量极低。它缺乏外部执行结果作为参照。

纠偏:把完成判定权交给外部执行——真正打开浏览器、点击、断言,并把结果写回清单字段。

误区四:认为部署图拆开了就是解耦

拆分目录结构不等于组件解耦。判断标准是故障行为:任一组件故障是否导致任务整体失败。

纠偏:做一次故障演练——主动 kill 沙箱容器,观察系统是「工具调用报错后重试」还是「会话丢失、任务终止」。前者才是真解耦。

误区五:用提示词承担全部安全职责

提示词属模型层防线,依赖模型「想做对」。但间接提示词注入直接作用于模型输入,会绕过你的意图。

纠偏:环境层防线(沙箱隔离、按任务粒度授权、高危操作审批、网络访问限制)不可替代。两层必须同时存在。


九、落地步骤建议

若你要从零搭一个长运行 Agent 循环,建议按以下顺序推进,每步都可独立验证:

  1. 第一步:建立进度文件与结构化功能清单,跑通「读文件 → 做一个功能 → 更新文件」的最小闭环。
  2. 第二步:引入增量提交,验证每轮结束代码可合并、可回滚。
  3. 第三步:接入浏览器自动化端到端测试,把测试结果写回清单的通过字段。
  4. 第四步:把 Session 持久化下来,与 Context Window 明确分离,提供范围查询接口。
  5. 第五步:拆分 Harness 与 Sandbox,做故障演练验证独立恢复能力。
  6. 第六步:补齐环境层安全防线(沙箱、最小权限、审批、网络隔离),并对每个外部集成做供应链审计。

前四步解决「能不能跑完」,第五步解决「会不会崩」,第六步解决「崩了损失多大」。任意一步未完成,后续步骤的收益都会大打折扣。


十、术语对照

术语本集中的含义
One-shotting一口气做太多,上下文在半途耗尽
Premature Completion过早宣布完成,实际只完成部分核心功能
Initializer Agent只跑第一轮,负责搭环境、定计划、首次提交
Coding Agent每轮都跑,负责单个功能的增量实现
Harness大脑,调用模型并路由工具调用的循环
Sandbox手,执行代码与编辑文件的容器环境
Session持久化、append-only 的事件流
Context Window模型当前可见的 token,临时工作记忆
TTFTTime To First Token,首 Token 响应时间
Containmentcontainment 策略,模型层 + 环境层双层防线

*来源:xueai.miyang.cn(小山学堂 · 洛小山《学 AI 产品,从入门到精通》)。本页为课程内容的解读整理与音频配套稿件,音频为二次演绎配音版。*