整理自李宏毅 2025「生成式 AI 导论」第 2 讲。前置知识:一堂课搞懂生成式 AI 原理。
1. 什么是上下文工程
LLM 本质是函数 f(X) → Y,输入 X(Context),输出 Y。
输出不对?两条路:
- 改 f(训练/学习)→ 机器学习领域
- 改 X(上下文工程)→ 给 f 准备更好的输入
Context Engineering = 自动化管理 LLM 输入 X 的系统方法。
和 Prompt Engineering 的关系:本质相同,但关注点不同——
| Prompt Engineering(早期) | Context Engineering(当代) | |
|---|---|---|
| 关注 | 特定格式、“神奇咒语” | 自动化管理输入,特别是 Agent 场景 |
| 背景 | 模型弱,需要 trick | 模型强,需要系统化工程 |
”神奇咒语”为什么失效了
早期的 trick:
- “Let’s think step by step” → 正确率提升(Chain of Thought)
- “请确保答案正确” / “答对给你小费” → 早期有效
- 随着模型变强,这些效果递减——模型本来就应该尽全力
2. Context 里应该放什么
一个完整的 Context 包含六层:
┌─────────────────────────────────────┐
│ System Prompt(身份、限制、工具说明) │
├─────────────────────────────────────┤
│ User Prompt(任务 + 条件 + 前提) │
├─────────────────────────────────────┤
│ 对话历史(短期记忆) │
├─────────────────────────────────────┤
│ 长期记忆(跨 session 持久化) │
├─────────────────────────────────────┤
│ 外部信息(RAG / 搜索结果) │
├─────────────────────────────────────┤
│ 工具调用记录 + 模型自我推理 │
└─────────────────────────────────────┘
2.1 User Prompt — 不只是”问题”
好的 User Prompt 包含:
- 任务说明:你要它做什么
- 详细条件:格式、长度、风格约束
- 前提信息:让模型理解背景
例子:问”载具是什么意思?“——不给情境,模型回答”交通工具”;加上”超商结账时店员问的”,模型精准回答”电子发票储存工具”。
2.2 System Prompt — 比你想象的长
Claude 的 System Prompt 超过 2500 字,包含:身份定义、时间信息、禁止事项、风格设定、知识截止日期、错误处理策略等。
2.3 对话历史 = 短期记忆
LLM 靠延续 Context 中的历史来”记住”之前的话。开新对话 = 记忆清零。
2.4 长期记忆
ChatGPT 2024 年 9 月后加入。运作方式:记忆被植入 Context 前端(用户看不到),LM 据此调整回答。
2.5 RAG — 给模型”查资料”的能力
模型知识有限且过时 → 先搜索,把结果塞进 Context。
RAG 不是万能药:Google AI Overview 曾因搜到 Reddit 恶搞帖,建议用户”在披萨上涂胶水”。
2.6 工具调用(Function Calling)
核心流程:
1. Context 中写好工具说明
2. LLM 输出 "调用指令"(只是文本!)
3. 外部程序解析并执行工具
4. 工具结果写回 Context
5. LLM 继续接龙,给出最终回答
LLM 自己不能执行任何工具,它只是输出一段”想用工具”的文本,由外部程序驱动。
3. 为什么 Agent 时代必须做上下文工程
Context Window ≠ 理解能力
| 现象 | 说明 |
|---|---|
| Context 饱和 | 没到上限就已经困惑。RAG 资料太多 → 正确率先升后降 |
| Lost in the Middle | 模型对开头和结尾记忆好,中间部分容易丢 |
| Context Rot | 输入越长,基础任务(如复述)正确率快速下降 |
| 挤牙膏效应 | 拆成多轮小问题,表现反而不如一次给完整输入 |
即使 Gemini 号称支持 200 万 Token,也不意味着放 200 万 Token 进去效果好。
结论:必须主动管理 Context——只放需要的,清掉不需要的。
4. 三大策略
4.1 选择(Selection)— 只放有用的
用户问题
│
▼
┌──────────┐ ┌──────────┐
│ 转关键词 │────▶│ 搜索 │
│ (LM辅助) │ │(Google等)│
└──────────┘ └──────────┘
│
▼
┌──────────┐
│ Reranking│ ← 小模型筛选相关性
└──────────┘
│
▼
只取 Top-N 放入 Context
选择的维度:
- 文档选择:RAG + Reranking + 句级筛选
- 工具选择:工具说明也做 RAG,只加载相关工具(给太多工具模型会崩)
- 记忆选择:按三维打分——最近性 × 重要性 × 相关性
负面记忆的陷阱:实验显示,把”过去答错的记录”放进 Context,模型表现反而暴跌。只给正确记忆效果最好。
4.2 压缩(Compression)— 把长历史变短
递归式压缩:
[完整历史 100 轮] → 摘要 LM → [关键信息 5 轮] → 放回 Context
- 每 N 轮或 Context 达 90% 时触发压缩
- 越久远的记忆越模糊(类似人类遗忘曲线)
- Computer Use 场景特别需要:大量鼠标/键盘操作细节 → 压缩为”订位成功,9/19 下午 6 点 10 人”
如果怕丢信息:压缩前全量存硬盘,需要时再 RAG 读取。
4.3 多代理人(Multi-Agent)— 分而治之
总招 Agent
/ | \
/ | \
订餐厅 订旅馆 订机票
Agent Agent Agent
每个 Agent 只知道自己任务的细节,总招 Agent 只收结果。
好处:
- 每个 Agent 的 Context 短且专注
- 不会因为订餐厅的细节污染订机票的决策
- 任务越复杂,Multi-Agent 优势越明显
简单任务:Single Agent 可能更好(通信开销不划算) 复杂任务:Multi-Agent 优势巨大
5. 对开发者的启示
| 场景 | 该做什么 |
|---|---|
| 写 System Prompt | 别贪多,只放当前任务真正需要的指令和工具 |
| 用 RAG | 搜到的文档做 Reranking,宁少勿多 |
| 长对话 | 定期压缩历史,保留关键结论 |
| 复杂 Agent | 拆成多个子 Agent,各自维护短 Context |
| 记忆系统 | 三维评分(最近/重要/相关),别无脑全放 |
一句话总结:Context Engineering 的核心 = 让 LLM 在有限窗口里看到最有价值的信息。
参考
- 李宏毅 2025「生成式 AI 与 ML 导论」第 2 讲:YouTube
- 课程网页:NTU Speech Lab
- Colab 范例(工具使用):Google Colab