← agent lab
// agent lab · deep dive 02

CONTEXT ENG

上下文工程深入 —— 窗口是 Agent 的全部世界,这个世界要精打细算地装
01 / TOKEN BUDGET

先建立直觉:窗口是怎么被花掉的

"200k token 的窗口"听起来很大,但 Agent 跑起来它消耗得飞快。把窗口当成一笔预算:系统提示是房租(固定支出),工具定义是水电(接得越多越贵),对话历史是伙食(每天都涨),真正留给"思考"的余量比想象的小。点击色块看每一项的开销特征👇

budget · 一个跑了 15 轮的编码 Agent 的窗口(示意比例)
为什么不是越满越好

研究和工程实践都指向同一件事:有效注意力不随窗口长度等比增长。上下文越长,模型越容易忽略中间部分的信息("lost in the middle"),且每个 token 都要花钱、加延迟。好的 Agent 不追求"装得多",追求每一轮窗口里都是当前决策需要的最小充分信息集——这就是"上下文工程"这个词的含义。

02 / GROWTH

跑一个任务,看窗口怎么涨

上下文不是匀速增长的——一次读大文件、一次网页抓取就能吃掉几万 token,而模型的思考本身很便宜。点击"执行下一轮",模拟一个修 bug 的 Agent,体会增长节奏,以及窗口逼近上限时压缩(compaction)怎么救场👇

simulator · 任务:『修复登录页报错』· 窗口上限按 32k 示意
2.0k / 32k
观察两件事

① 增长极不均匀:读文件、抓网页这类"观察"步骤才是大头,控制上下文先控制工具输出(截断、分页、只返回相关片段);② 压缩有损:compaction 之后窗口空出来了,但被摘要掉的细节永远回不来——所以重要结论要在压缩前写进外部记忆(下一节)。

03 / COMPACTION

窗口满了:三种腾地方的姿势

同一段 12k token 的对话历史,三种策略处理后长什么样、丢了什么?点击卡片切换对比👇

interactive · 点击切换策略
实战里怎么组合

成熟的 Agent 通常三招齐用:工具输出先截断(单条结果设上限,旧的 tool_result 可以只留摘要)、历史定期摘要(保最近几轮原文 + 早期摘要)、关键状态外置(todo 清单、已确认的结论写进文件,每轮带回窗口的只有一小段)。Claude Code 的 auto-compact 就是这套组合拳。

04 / MEMORY TIERS

记忆分层:窗口之外的世界

压缩只能省,记忆才能存。把人类记忆的分层搬过来:窗口内是转瞬即逝的短期记忆,scratchpad 是干活用的工作记忆,外部存储才是长期记忆。三层的读写时机完全不同👇

tiers · 由快到慢,由易失到持久

短期 · 窗口内

in-context · 本轮全量可见
  • 是什么:当前对话历史 + 工具结果,模型"现在脑子里"的一切
  • 读写:零成本读取,自动写入(每条消息都进来)
  • 命门:会话结束即消失;满了会被压缩有损

工作 · Scratchpad

todo.md / plan / 笔记文件
  • 是什么:Agent 自己维护的任务清单、中间结论、踩坑记录
  • 读写:模型用文件工具主动写、按需读;压缩时它不丢
  • 价值:长任务的"进度条"——重启会话也能从清单接着干

长期 · 外部存储

向量库 / 数据库 / 用户档案
  • 是什么:跨会话持久的知识:用户偏好、历史决定、领域文档
  • 读写:写入要"值得记"(蒸馏后存),读取靠检索(RAG)
  • 命门:检索不准 = 记了等于没记;记错的东西会反复污染未来会话
什么时候写长期记忆

两种触发:显式——用户说"记住我用 pnpm 不用 npm",立刻写;隐式——会话结束/压缩前,让模型自问"这次有什么值得下次记住的",蒸馏成几行再存。原文全存是反模式:存得越糙,将来检索回来的噪音越多。

深入 → 记忆与检索子教程分层讲完了,去看管线:三种记忆类型、写入蒸馏与冲突处理、RAG 检索全流程与记忆维护
05 / FAILURE MODES

上下文也会坏掉:四种典型病

窗口不只是"满不满"的问题——内容本身会出毛病。社区把常见失效归纳为四类,点击查看症状和处方👇

pathology · 点击切换病例
共同的根因

四种病的根因是同一个:模型不会区分上下文里信息的"质量"与"时效"——错的、旧的、无关的 token 和对的 token 在注意力面前一律平等。所以上下文工程的本职就是当好"守门员":错的修剪掉,旧的标记清,无关的别放进来。

06 / QUIZ

随堂测验:检验一下

5 道题。答错没关系,解析比答案重要。

quiz · 点击选项作答
→ / KEEP GOING

继续深入