AI 编程与智能体工程 · 第 1 期

同一个模型,为什么你的 Agent 越跑越笨?

上下文工程四成分与预算 · context engineering

你的 Agent 第 8 轮开始胡说、第 12 轮忘了你说过什么——不是模型变笨了,是你把窗口塞满了。同一个模型,窗口里装的东西不同,产出可以差出一个档位。决定上限的不是模型,是你喂了什么。
⏱ 约 12 分钟 🎯 写过带 prompt 的应用、用过 function calling 的开发者 📦 源:context-engineering 教程

01一个反共识:模型不是天花板,上下文才是

2025 年,"上下文工程"从"提示词工程"里分化成一个独立术语,到 2025~2026 年长成一门有框架、有工具、有评测的学科。它只回答一个问题:

什么信息、以什么顺序、什么形态进入模型窗口?

提示词工程关心"怎么把一句话说清楚",上下文工程关心"整个窗口里该有什么、不该有什么、装不下时先丢什么"。前者是写一句话,后者是装一辆车。

一个让很多人意外的实测结论(Liu et al.《Lost in the Middle》, TACL 2023):同一个模型、同一个任务,只改窗口里的内容组成与顺序,产出质量能差出一个档位。所以——

上下文工程不是把东西塞进去,
是决定不塞什么。
灏天文库 · AI 编程与智能体工程 P.01

02心智模型:四成分 + 预算恒等式

整门学科就一张图:模型窗口是固定预算,里面装四样东西,每一轮都必须装得下。记住这个恒等式,你已学会一半:

指令+记忆+工具+素材+输出预留 =窗口预算

四成分按"谁产生 / 多久有效 / 谁负责裁剪"分类。前三个常驻(每轮都在),素材按需(这一轮才进),输出预留是给模型回答留的位子——很多人忘了留,模型回答被截断就是这个原因。

指令 · 常驻

Instruction

系统提示、角色、规则、输出格式。你写的,每轮不变,占常驻税。

记忆 · 常驻

Memory

会话内历史、跨会话偏好、知识库召回。越滚越长,是最常超预算的成分。

工具 · 常驻

Tools

每个工具的 schema 都占 token。工具加到 20 个,模型选错率上升。

素材 · 按需

Retrieval

这一轮才检索进来的文档片段、代码、数据。just-in-time 供给。

下面这个计算器让你直观感受"窗口是预算"——拖动滑块分配四成分,看你的 Agent 是否超窗、超在哪一块。

🧮 上下文预算计算器
拖动滑块分配四成分 + 输出预留,实时看是否塞满窗口。默认值是一个真实客服 Agent 的典型配置。
单位:token
指令1,600 tok
记忆6,400 tok
工具3,200 tok
素材4,800 tok
输出预留3,200 tok
✅ 用了 19,200 / 32,000 tok(60%)— 健康,还有余量装素材
提示:记忆超过 60% 通常意味着该压缩了;工具超过 25% 说明工具太多该做路由。

03位置效应:开头和结尾记得清,中间会丢

就算窗口没塞满,放的位置不同,模型记不记得也不同。Liu et al. 用多个模型实测发现一条 U 型曲线:放在开头和结尾的信息,被准确召回的概率高;放在中间的,召回率显著下降——这就是"Lost in the Middle"。

这直接推翻一个直觉:"反正窗口还大,全塞进去就行"。塞是塞进去了,但模型"看不见"中间那段。点下面任意一句,看它在 U 型曲线上的召回率。

📍 U 型位置效应演示
假设给模型 10 句话,点任意一句看它落在 U 型曲线哪个位置、模型有多大概率记得它。
横轴 = 信息在窗口中的位置(开头→结尾),纵轴 = 召回准确率。中间塌陷就是"看不见"。
窗口大不等于记得住,
位置不对,中间就是盲区。
灏天文库 · AI 编程与智能体工程 P.02

工程上的三个推论:

04装不下时先丢什么:压缩与分层记忆

窗口总会满。问题不是"要不要丢",是"按什么顺序丢"。一个可用的驱逐优先级:

  1. 先丢冗余素材:上一轮检索进来、这一轮用不上的文档片段,最先丢。
  2. 再压缩历史:把多轮对话摘要成"用户目标 + 已确定结论 + 待办",原文丢、摘要留。
  3. 工具按需挂载:20 个工具常驻太贵,按任务路由只挂当前需要的 3~5 个。
  4. 指令和输出预留最后丢:这俩丢一个,Agent 直接失效。

更彻底的做法是分层记忆:会话内(短期,全量)→ 跨会话(中期,摘要)→ 知识库(长期,按需召回)。三层各管各的预算,互不挤占。

记忆不是越全越好,
是分层刚好。
灏天文库 · AI 编程与智能体工程 P.03

05带走这套清单

✅ 上下文工程 6 条可执行规则

  1. 每轮开工前默念预算恒等式:指令+记忆+工具+素材+输出预留=窗口,先算账再喂。
  2. 输出预留先留出来(一般 1~2K),剩下的再分给四成分——别让模型回答被截断。
  3. 关键指令放结尾,素材放前面,问题留最后一句——踩 U 型两端。
  4. 记忆超 60% 立刻压缩:多轮历史摘要成目标+结论+待办。
  5. 工具超过 10 个就做路由,按任务只挂当前需要的子集。
  6. 三层记忆分开:会话内全量、跨会话摘要、知识库按需召回,别让短期历史挤掉长期知识。
决定 Agent 上限的不是模型,
是你喂了什么、没喂什么。
灏天文库 · AI 编程与智能体工程 P.04