Skip to main content

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 的"注意力管理"。