考察点
这道题是上下文工程实践类问题,面试官抛出"Agent 跑长任务时计划和中途结果放哪"来看你有没有做过真正的长链路 Agent。只答"放对话历史里"会被立刻追问 token 成本和压缩丢信息。答好要讲清外置的收益、载体选择和"模型怎么记得去读"这个落地难点。
参考答案
scratchpad 是什么
scratchpad 指 Agent 工作过程中的中间产物:任务拆解出的计划、TODO 清单、已经试过的方案、中间计算结果、待验证的假设。ReAct 模式里它们天然混在对话轨迹里——每一步 Thought 都是一条消息。任务短时没问题,任务一长跑几十轮,这些中间产物就把窗口撑爆,而且其中九成内容后续步骤根本不再用。
外置的做法
核心思路一句话:对话历史里只留"指针",内容放外面。具体载体三种:
- TODO/计划对象:一个结构化的任务清单(每条有状态:pending/doing/done),通过工具读写。Claude Code 的 TodoWrite 就是这个设计——计划不进对话流,每条状态变化是一次工具调用。
- 笔记文件:中间分析、调研结论写到工作目录的 markdown 文件,对话里只留"详见 notes.md 第几节"。
- 状态对象:结构化 KV(当前进度、已确认事实、未决问题),存在外部存储,每轮把关键字段摘要注入上下文。
对话历史因此只剩"决策主线":做了什么决定、结果是什么。推理过程和原始中间数据都在窗口外,需要时按引用读回。
三个收益
第一,省 token。中间产物不再每轮重复计费——对话历史是每轮推理全量重传的,外置内容只在读的那一轮付费。长任务跑下来,成本能差好几倍。
第二,可断点续传。会话中断、上下文被 compact,只要 TODO 文件和笔记还在,新会话读回状态就能接着干。scratchpad 外置实际上给了 Agent "持久化进程状态"的能力,这和对长短期记忆的分工是呼应的:scratchpad 管"当前任务做到哪",长期记忆管"跨任务积累了什么"。
第三,可审计。计划变更历史、试过的失败方案都留在文件里,复盘 badcase 时能还原 Agent 当时的思路,比翻被压缩过的对话摘要可靠得多。
落地难点:模型忘了读
外置最大的坑是"写时记得,用时忘了"。三个对策:一是系统指令里声明工作协议——"开始子任务前先读 TODO,完成后更新状态",把它变成模型的固定动作;二是状态摘要每轮注入,当前 TODO 的前几条始终显示在上下文里,模型自然知道进度;三是文件引用标准化,统一用 详见 path:line 的格式,配合分页读取工具,降低模型回读的门槛。
可能的追问
- 外置和长期记忆什么区别?——scratchpad 是当前任务的工作状态,任务结束即归档;长期记忆是跨任务沉淀的知识。一个管"正在进行",一个管"历史积累"。
- 什么内容不该外置?——高频引用的核心约束(当前目标、用户的硬性要求)该留在上下文里,外置读回有遗漏风险;低频、量大、结构化的中间产物才适合外置。
- 多 Agent 协作时 scratchpad 能共享吗?——可以,文件系统天然是共享介质,主 Agent 派的子 Agent 读写同一份 TODO;但要约定写入协议避免互相覆盖,复杂场景上带锁的状态服务。