上下文工程(Context Engineering)
Context Engineering 是指精心设计”喂给模型的那段上下文”——决定放哪些内容、怎么组织排列、怎么压缩取舍,让模型在有限的上下文窗口里拿到最相关、最干净的信息,从而输出得更准、更稳、更省钱。
本质:模型每次推理只能看到上下文窗口里的东西,看不到窗口外的一切。所以”给它看什么、怎么给”直接决定它的表现。Context Engineering 就是管理这个”视野”的工程。
一句话定位:Prompt Engineering 是”把一句话问好”,Context Engineering 是”把整个上下文这盘菜配好”。 前者调的是措辞,后者管的是——检索来的资料、历史对话、工具返回、系统指令等所有内容如何取舍编排。
类比:模型像一个只能看到面前这张办公桌的专家。桌子(上下文窗口)大小固定,你把什么资料摆上桌、怎么摆、旧的什么时候撤掉,决定了他能不能把活干好。桌上堆满无关文件,他反而找不到重点。
为什么它是 Agent 的核心问题
普通聊天一问一答,上下文压力不大。但 Agent 要多轮循环(见 agent.md、loop_engineering.md),每一轮都往上下文里堆新东西:工具返回、观察结果、中间推理……很快就会:
- 撑爆窗口:超过上下文长度限制,早期信息被挤掉(token 概念见
token.md)。 - 注意力稀释:内容越多,模型越容易”迷失在中间”(lost in the middle,中间的信息最易被忽略)。
- 成本飙升:按 token 计费,上下文越长每一轮越贵。
- 被污染/干扰:无关或错误信息混进来,把模型带偏(也是提示词注入的温床,见
agent_security.md)。
关键认知:上下文窗口是稀缺资源,不是”越满越好”而是”越准越好”。 Context Engineering 的目标不是塞满,而是在有限预算里最大化”有用信息的密度”。
上下文里通常有哪些成分
| 成分 | 是什么 | 特点 |
|---|---|---|
| 系统提示 (System Prompt) | 角色、规则、总体指令 | 常驻,最高优先级 |
| 用户输入 | 当前的问题/任务 | 必须保留 |
| 对话历史 | 之前的往返记录 | 会越积越长,需裁剪/摘要 |
| 检索内容 (RAG) | 从知识库/文档检索来的片段 | 要选最相关的,见 embedding_model.md |
| 工具返回 (Observation) | 工具调用的结果 | 可能很长很杂,需精简 |
| Skill / 记忆 | 按需加载的方法论、长期记忆 | 渐进式加载,见 skills.md |
核心手段
把有限的上下文用在刀刃上,常见几类操作:
| 手段 | 做什么 | 解决什么 |
|---|---|---|
| 选择 (Select / Retrieve) | 只挑最相关的内容放进来(RAG、检索) | 避免无关信息占位 |
| 压缩 (Compress) | 摘要、去冗余、只留结论 | 省 token、提信息密度 |
| 裁剪 (Trim) | 丢弃过时的历史轮次 | 防止撑爆窗口 |
| 摘要 (Summarize) | 把长历史滚动总结成短摘要 | 长对话保持连续性又不爆 |
| 排序 (Order) | 把最重要的放开头或结尾 | 对抗”lost in the middle” |
| 隔离 (Isolate) | 把不可信的外部内容明确分区标注 | 防注入、防污染 |
| 结构化 (Structure) | 用标签/分节/格式清晰组织 | 让模型更容易定位信息 |
| 外置 (Offload) | 把大内容存到外部,用时再取(记忆、文件) | 突破窗口物理限制 |
渐进式披露(progressive disclosure)是贯穿始终的思想:平时只放”摘要/索引”,需要细节时才展开。 Skill 的三层加载(见
skills.md)就是它的典型应用。
上下文压缩:Agent 长任务的关键
Agent 跑长任务时,上下文会持续增长直到接近上限。常见应对:
- 滚动摘要 (Rolling Summary):把早期的对话/操作压成一段摘要,替换掉原始的冗长记录。
- 分段处理:把大任务切成小段,每段用独立、精简的上下文。
- 外部记忆 (Memory):把需要长期记住的东西写到外部存储(文件/向量库),用时检索回来,而不是一直塞在窗口里。
- 观察结果精简:工具返回一大段时,只保留关键字段再入上下文,而非原样塞入。
这正是很多 coding agent”上下文快满时自动压缩、然后接着干”的机制。呼应
loop_engineering.md:循环能不能持续跑下去,很大程度取决于上下文管理得好不好。
Context Engineering vs Prompt Engineering
| 维度 | Prompt Engineering | Context Engineering |
|---|---|---|
| 关注点 | 单条提示的措辞、结构 | 整个上下文的内容取舍与编排 |
| 粒度 | 一句话/一段提示 | 系统提示 + 历史 + 检索 + 工具返回的总和 |
| 场景 | 单轮问答为主 | 多轮 Agent、长任务、RAG |
| 目标 | 问得更清楚 | 让模型每一轮都看到”对的信息” |
不是取代关系:Prompt Engineering 是 Context Engineering 的一个子集。写好系统提示是其中一环,但 Context Engineering 还要管历史、检索、压缩等更大的盘子。
常见坑 / 误区
- ❌ “上下文塞得越多模型越聪明” → 恰恰相反,无关信息会稀释注意力、增加成本、还可能带偏
- ❌ “把所有资料一次性喂进去最省事” → 会撑爆窗口、贵、且触发”lost in the middle”;应检索 + 按需加载
- ❌ “对话历史一直留着就行” → 长对话必须裁剪/摘要,否则很快超限
- ❌ “外部检索来的内容可以直接信任” → 要做相关性筛选,且外部内容要隔离标注防注入(见
agent_security.md) - ❌ “上下文顺序无所谓” → 有所谓,重要信息放头尾更不易被忽略
- ❌ “Context Engineering 就是写好 Prompt” → 只是其中一部分,它还管历史、检索、压缩、记忆
延伸阅读 / 关联概念
- Token — 上下文窗口按 token 计量,理解成本与限制的基础;见
token.md - Skill — 渐进式加载,控制上下文成本的典型手段;见
skills.md - Loop Engineering — 长循环里上下文如何持续管理;见
loop_engineering.md - Agent 运行机制 — 每轮循环都在往上下文堆东西;见
agent.md - Embedding / RAG — “选择”相关内容的检索基础;见
embedding_model.md - AI 可预测性 — 干净稳定的上下文是可复现输出的前提;见
ai_predictability.md - Agent 安全 — 上下文是提示词注入的入口,需隔离外部内容;见
agent_security.md - Prompt Engineering — “怎么下令”(指令强度层级:软规则 < 强声明 < few-shot 正反例);见
prompt_engineering.md - Agent 记忆 — 短期/长期记忆、落库判据、冲突与过期、遗忘指令处理;见
memory.md