4.1 Context Engineering:上下文工程
Agent 运行中需要提供给 LLM 的一切相关信息(对话历史、用户输入、背景知识、工具结果等)都是上下文。上下文工程关注如何高质量筛选、压缩和组织上下文,从而最大化模型决策与推理能力。
为什么上下文工程重要?
LLM 的"工作记忆"
LLM 的上下文窗口 = 人类的工作记忆
容量有限,但决定了能同时思考多少信息。
上下文的质量直接决定 Agent 的表现:
- 信息太少 → 决策依据不足,容易出错
- 信息太多 → 噪声干扰,模型"分心"
- 信息组织混乱 → 模型理解困难,逻辑混乱
- 关键信息丢失 → 完全无法完成任务
遗忘曲线
LLM 也有"位置偏见":
开头位置 ✓ 模型记得很清楚
中间位置 ✗ 最容易被忽略
结尾位置 ✓ 模型记得很清楚
→ 重要信息要放在开头或结尾,不要塞在中间。
上下文的构成与管理
典型上下文组成
【系统提示词】 占比 ~10%
- 角色设定
- 行为准则
- 输出格式要求
【对话历史】 占比 ~30%
- 用户之前的提问
- Agent 之前的回答
- 工具调用历史
【当前任务】 占比 ~10%
- 用户当前的具体需求
- 当前目标
【背景知识】 占比 ~40%
- RAG 检索到的文档
- 工具返回的结果
- 相关配置和数据
→ 这部分最需要精心管理
上下文管理的核心问题
| 问题 | 后果 |
|---|---|
| 超长工具输出 | 上下文爆炸,关键信息被淹没 |
| 历史对话太多 | 久远的对话干扰当前判断 |
| 重复信息 | 浪费 token,增加模型负担 |
| 信息顺序不对 | 重要信息被模型忽略 |
上下文压缩技术
1. 摘要(Summarization)
适用场景:长对话历史、大段工具输出
原始长文本 → LLM 摘要 → 保留核心信息
示例:
原始(1000 tokens):
第 1 步:我检查了文件系统...
第 2 步:我运行了测试...
第 3 步:我发现了一个问题...
...(大量细节)
摘要后(100 tokens):
【历史摘要】
已完成:文件检查、测试运行
发现问题:登录模块有 3 个测试失败
当前进度:正在定位问题原因
2. 过滤(Filtering)
适用场景:结果列表、日志输出、调试信息
原始信息 → 按相关性/重要性过滤 → 只保留最相关的
过滤策略:
- 按时间:只保留最近 N 轮对话
- 按相关性:语义相似度排序,取 Top-K
- 按类型:排除无关的日志级别
- 去重:移除重复的信息
3. 结构化(Structuring)
适用场景:几乎所有场景
无格式文本 → 结构化组织 → 模型更容易理解
对比:
❌ 未结构化:
张三 25岁 北京 工程师
李四 30岁 上海 设计师
王五 28岁 广州 产品经理
...
✅ 结构化:
【团队成员】
| 姓名 | 年龄 | 城市 | 职业 |
|------|------|------|------|
| 张三 | 25 | 北京 | 工程师 |
| 李四 | 30 | 上海 | 设计师 |
| 王五 | 28 | 广州 | 产品经理 |
上下文窗口管理策略
策略 1:滑动窗口(Sliding Window)
最新的 N 轮对话保留,更早的丢弃
✅ 优点:简单可靠,总是有最新信息 ❌ 缺点:重要的早期信息可能丢失
策略 2:滚动摘要(Rolling Summary)
对话历史 → 定期生成摘要 → 摘要 + 最近几轮完整对话
示例:
【对话摘要(前 50 轮)】
用户想要搭建一个博客网站,已完成项目初始化...
【最近 10 轮完整对话】
...(完整保留)
✅ 优点:兼顾历史背景和细节 ❌ 缺点:摘要可能丢失关键细节
策略 3:记忆分层(Hierarchical Memory)
🟢 工作记忆:当前任务相关的所有信息(完整保留)
↓ 超出窗口时降级
🟡 短期记忆:最近完成的任务(摘要保留)
↓ 定期归档
🔴 长期记忆:历史经验和知识(检索取用)
✅ 优点:兼顾完整性和效率 ❌ 缺点:实现复杂
上下文优化的最佳实践
1. 重要信息置顶/置底
🚨 【最重要的规则】(放在最开头)
...
📝 【当前任务】(放在最末尾,紧邻模型生成位置)
2. 使用标记分隔不同信息块
═══ 系统规则 ═══
...
═══ 历史摘要 ═══
...
═══ 相关文档 ═══
...
═══ 当前任务 ═══
...
→ 清晰的边界帮助模型理解信息结构。
3. 编号和引用
【参考资料】
[1] 文档 A 的相关内容...
[2] 文档 B 的相关内容...
[3] 工具调用的结果...
→ 模型可以精确引用来源,也更容易定位信息。
4. 主动"遗忘"
不是所有信息都值得保留:
✅ 保留:用户明确的要求、关键决策、最终结果
❌ 可以丢弃:
- 尝试过但失败的路径(除非有学习价值)
- 中间调试输出
- 无关的闲聊
- 非常早期且已过时的信息
上下文质量评估
好的上下文应该满足
| 维度 | 标准 |
|---|---|
| 相关性 | 所有信息都与当前任务相关 |
| 完整性 | 完成任务所需的关键信息都在 |
| 简洁性 | 没有冗余和噪声 |
| 结构性 | 信息组织清晰,易于理解 |
| 有序性 | 重要信息在正确的位置 |
常见反模式
❌ "倾倒式"上下文:把所有东西一股脑塞进去
- "这里有 10 个文件,你自己看吧"
- 结果:模型看不过来,漏掉关键信息
❌ "混乱式"上下文:信息顺序混乱,没有结构
- 想到什么加什么,毫无条理
- 结果:模型理解困难,逻辑混乱
❌ "超载式"上下文:超过模型窗口限制
- 前面的 信息被截断
- 结果:关键信息丢失,任务失败
上下文工程不是"尽量多给信息",而是"给对的信息,在对的位置,以对的方式"。它是 Agent 的"注意力管理"。