Skip to content
YK Blog
Go back

生成式 AI (2):上下文工程

整理自李宏毅 2025「生成式 AI 导论」第 2 讲。前置知识:一堂课搞懂生成式 AI 原理


1. 什么是上下文工程

LLM 本质是函数 f(X) → Y,输入 X(Context),输出 Y。

输出不对?两条路:

Context Engineering = 自动化管理 LLM 输入 X 的系统方法。

和 Prompt Engineering 的关系:本质相同,但关注点不同——

Prompt Engineering(早期)Context Engineering(当代)
关注特定格式、“神奇咒语”自动化管理输入,特别是 Agent 场景
背景模型弱,需要 trick模型强,需要系统化工程

”神奇咒语”为什么失效了

早期的 trick:


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

选择的维度:

负面记忆的陷阱:实验显示,把”过去答错的记录”放进 Context,模型表现反而暴跌。只给正确记忆效果最好。

4.2 压缩(Compression)— 把长历史变短

递归式压缩:

[完整历史 100 轮] → 摘要 LM → [关键信息 5 轮] → 放回 Context

如果怕丢信息:压缩前全量存硬盘,需要时再 RAG 读取。

4.3 多代理人(Multi-Agent)— 分而治之

        总招 Agent
       /    |    \
      /     |     \
  订餐厅  订旅馆  订机票
  Agent   Agent   Agent

每个 Agent 只知道自己任务的细节,总招 Agent 只收结果。

好处:

简单任务:Single Agent 可能更好(通信开销不划算) 复杂任务:Multi-Agent 优势巨大


5. 对开发者的启示

场景该做什么
写 System Prompt别贪多,只放当前任务真正需要的指令和工具
用 RAG搜到的文档做 Reranking,宁少勿多
长对话定期压缩历史,保留关键结论
复杂 Agent拆成多个子 Agent,各自维护短 Context
记忆系统三维评分(最近/重要/相关),别无脑全放

一句话总结:Context Engineering 的核心 = 让 LLM 在有限窗口里看到最有价值的信息。


参考



Previous Post
生成式 AI (3):解剖大型语言模型
Next Post
生成式 AI (1):一堂课搞懂原理