上下文工程
🎯 学习目标
- 把 Context 当作动态系统而非一次性 Prompt 字符串
- 设计 System / RAG / Tools / History 的拼装顺序与优先级
- 识别 Context Rot 与 Context Collapse
- 模块化、版本化 System Prompt
引言
Context Engineering(上下文工程)是 2024–2026 Agent 实践里上升最快的 discipline:不是写更长的 Prompt,而是管理什么信息在何时进入窗口。本节讲拼装、退化与治理。
章节正文
第 1 步:Context 的组成块
典型拼装顺序(从稳定到易变,利于 KV Cache,见 5.5):
- System 核心指令(稳定、短)
- 工具定义(较稳定,或 Deferred)
- RAG 检索片段(每 query 变)
- Memory 摘要(慢变)
- 近期对话历史(快变)
- 当前用户输入
每块应有最大 Token 预算,超限则截断或摘要,而非整体 silent truncate。
第 2 步:模块化 System Prompt
const modules = {
safety: loadVersioned('system/safety-v3.txt'),
persona: loadVersioned('system/persona-support-v2.txt'),
tools_policy: loadVersioned('system/tools-v1.txt'),
}
const system = [modules.safety, modules.persona, modules.tools_policy].join('\n\n')Git 管理、PR review、A/B 标签 prompt_version 写入 trace,便于回归「哪版 Prompt 导致拒答率上升」。
第 3 步:Context Rot 与 Collapse
Context Rot:窗口很长时,模型对中间消息「注意力下降」,早期关键约束被违背。
Context Collapse:为省 Token 过度摘要,丢失否定条件(「除 XX 外均可」摘要成「均可」)。
缓解:
- 关键约束重复出现在 system 与最终 user 前(recency + stability)
- 结构化 fact list 而非散文摘要
- 分 Agent 隔离域(5.7),单窗口不塞所有工具结果
第 4 步:工具结果与 RAG 的裁剪
def shrink_tool_result(raw: dict, max_chars=4000) -> dict:
if len(json.dumps(raw)) <= max_chars:
return raw
return {
"summary": llm_summarize(raw, keep=["ids", "dates", "amounts"]),
"_truncated": True,
}RAG 片段 similarly:只注入 rerank 后 Top-5,每段 header 带 source id。
第 5 步:评测 Context 策略
指标:
- 指令遵循率(是否违反 system)
- 长对话第 N 轮 fact 召回率
- Token 成本 per successful task
实验:固定模型,只改 Context 策略,比换模型便宜得多。
动手练习
- 为你当前项目画 Context 六块饼图,估 Token 占比。
- 写 safety 模块三条规则,设计 persona 模块如何不与之冲突。
- 模拟 Context Collapse:长摘要丢失「不」字,写修复策略。
- 实现 shrink_tool_result 规则版(无 LLM),保留指定 key。
- 设计 prompt_version 如何进入 trace JSON。
常见问题
Q:Context Engineering 和 Prompt Engineering 区别?
Prompt Engineering 偏单次文案;Context Engineering 偏运行时拼装、预算、版本、多源数据与长会话治理,是系统问题。
Q:把 RAG 放 system 还是 user?
常见放 user 或 pseudo-system「参考资料」块,便于每轮替换且不打乱 system 前缀 cache。关键约束仍在 system。
Q:窗口 128K 还要压缩吗?
要。更长窗口 ≠ 更高注意力质量;成本与 Rot 仍在。应用预算与 selective context。
本节小结
Context Engineering 管理六块信息的顺序、预算与版本,对抗 Rot/Collapse。稳定前缀 + 模块化 system + 结构化裁剪,比堆长 Prompt 更有效。