上下文工程 (Context Engineering)
上下文工程 (Context Engineering)
上下文工程是提示工程的自然演进:关注在每一次模型调用前,如何以可复用、可度量、可演进的方式拼装并优化输入上下文。
什么是上下文工程
提示工程关注"如何写好 prompt",而上下文工程关注的是:在每一次模型调用前,如何以可复用、可度量、可演进的方式,拼装并优化输入上下文,从而提升正确性、鲁棒性与效率。
| 对比维度 | 提示工程 | 上下文工程 |
|---|---|---|
| 核心问题 | 怎样写好 prompt | 怎样组织模型可见的全部信息 |
| 主要对象 | 系统提示、任务描述、示例 | 提示、工具、历史、记忆、RAG、文件、笔记、状态 |
| 时间尺度 | 单轮或短任务优化 | 多轮、长时程、跨会话任务 |
| 工程目标 | 让模型更容易按指令输出 | 让模型持续获得正确、相关、适量的信息 |
🔬 核心类比:LLM 如同 CPU,上下文窗口如同 RAM。上下文工程就像操作系统管理 RAM——决定在何时将什么内容填充到上下文窗口中。
上下文腐蚀 (Context Rot)
核心发现:随着上下文窗口中 token 数量增加,模型从上下文中准确回忆信息的能力反而下降。
三大原因:
- 注意力稀释:Transformer 的 O(n²) 注意力关系随上下文增长而分散
- 噪声累积:无关历史、重复工具输出、冗长日志稀释高价值信息
- 训练分布偏移:模型训练中短序列更常见,长序列依赖的稳定性天然更差
💡 结论:上下文是有限资源,具有边际收益递减。必须像"注意力预算"一样精打细算。
GSSC 流水线
hello-agents 的 ContextBuilder 实现了 Gather → Select → Structure → Compress 四阶段流水线:
(1) Gather(多源汇集)
从以下来源收集候选信息:
- 系统指令(system prompt)
- MemoryTool(长期记忆)
- RAGTool(外部知识库)
- 对话历史
- NoteTool(结构化笔记)
- 自定义信息包
具有容错机制:某源失败不影响其他源。
(2) Select(智能选择)⭐ 核心
- 系统指令优先保留(relevance_score = 1.0)
- 对普通信息计算综合分数:
score = relevance_weight × relevance_score + recency_weight × recency_score - 相关性:Jaccard 相似度(可升级为向量相似度)
- 新近性:指数衰减模型(24 小时内高分,之后衰减)
- 贪心算法:按分数从高到低填充,直到 token 预算用完
(3) Structure(结构化输出)
固定模板组织信息:
[Role & Policies] → 系统指令
[Task] → 当前任务
[Evidence] → RAG / 知识库证据
[Context] → 历史对话、记忆、笔记
[Output] → 输出格式要求(4) Compress(兜底压缩)
超限时按分区压缩,保持结构完整性,优先保留前面的关键分区。
长时程任务的三种策略
| 策略 | 做法 | 适用场景 |
|---|---|---|
| 压缩整合 (Compaction) | 高保真总结历史,重启新窗口 | 长对话连续性任务 |
| 结构化笔记 (Note-taking) | 关键信息写入外部存储,按需拉回 | 有里程碑的迭代开发 |
| 子代理架构 (Sub-agent) | 主代理规划,子代理独立探索后回传摘要 | 复杂研究/并行探索 |
💡 关键原则:上下文不是越多越好,而是越相关、越新、越结构化越好。长程任务必须有外部状态层,不能只依赖对话历史。