上下文工程实践¶
🎯 本节目标¶
掌握实用的上下文工程技巧和最佳实践。
📖 阅读材料¶
核心技术文章¶
- Manus 内部的 Context 工程经验 - 知乎
- Context Engineering GitHub项目 - 实践案例
📝 Manus Context工程实战经验¶
背景与选择¶
Manus团队在构建Agent时选择了上下文工程而非端到端模型训练的路径,原因: - 快速迭代:改进发布周期从数周缩短到几小时 - 与底层模型发展保持"正交"关系:模型进步如水涨船高,Manus成为潮头上的船
六大核心实践经验¶
1. 围绕KV缓存进行设计¶
KV缓存命中率是生产环境中AI智能体最关键的单一指标,直接影响延迟和成本。
Agent工作原理: - 每次迭代中,模型根据当前上下文选择动作 - 动作执行后产生观测结果,追加到上下文中 - 上下文持续增长,输入与输出token比例通常达到100:1
提升缓存命中率的关键实践: - 保持提示词前缀稳定性:避免在系统提示词开头包含时间戳 - 只对上下文进行追加(append-only):避免修改之前的动作或观测结果 - 确保序列化过程是确定性的:JSON对象序列化时保证键的顺序固定 - 明确标记缓存断点:考虑缓存过期时间,至少在系统提示词末尾设置断点
成本影响:以Claude Sonnet为例,命中缓存的输入token成本为0.30美元/百万token,未命中缓存成本为3美元/百万token——相差十倍。
2. 遮蔽(Mask),而非移除¶
问题:随着Agent能力增加,工具数量爆炸式增长,模型容易选错行动或采取低效路径。
错误方案:动态增删工具会导致: 1. 工具定义位于上下文前部,任何更改都会导致后续所有KV缓存失效 2. 当动作引用不再存在的工具时,模型会困惑并产生幻觉
Manus解决方案:使用上下文感知的状态机来管理工具可用性: - 不移除工具,而是在解码阶段遮蔽token logits - 根据当前上下文阻止或强制模型选择某些动作 - 设计具有一致性前缀的动作名称(如browser_、shell_开头)
函数调用三种模式(以Hermes format为例):
- 自动(Auto):<|im_start|>assistant
- 必需(Required):<|im_start|>assistant<tool_call>
- 指定(Specified):<|im_start|>assistant<tool_call>{"name": "browser_"
3. 将文件系统作为上下文¶
挑战:即使有128K+上下文窗口,在真实智能体场景中仍面临: 1. 观测结果可能极其庞大(网页、PDF等) 2. 模型性能在超过一定上下文长度后下降 3. 长输入非常昂贵
Manus方案:将文件系统视为终极上下文 - 容量无限、天然持久、智能体可直接操作 - 模型学习按需读写文件,将文件系统当作结构化的外部记忆体
可恢复的压缩策略: - 保留网页URL,内容可从上下文中丢弃 - 保留文档路径,内容可被省略 - 在不永久丢失信息的前提下缩减上下文长度
未来展望:具备智能体能力的状态空间模型(SSM)或许是Neural Turing Machines真正的继承者。
4. 通过"复述"来操控注意力¶
现象:Manus处理复杂任务时会创建todo.md文件,随着任务进展逐步更新。
设计目的:精心设计的注意力操控机制 - 典型任务平均需要50次工具调用 - 通过不断重写待办事项列表,将任务目标"复述"到上下文末尾 - 将全局计划注入到模型的近期注意力范围 - 避免"中间遗忘"(lost-in-the-middle)问题,减少目标偏离
本质:用自然语言引导自身注意力,聚焦于任务目标。
5. 保留出错记录¶
核心观点:Agent会犯错,这不是bug,而是现实。
常见错误做法:隐藏错误、清理痕迹、重试动作或重置模型状态 代价:消除失败记录,也就消除了过往的行动证据,模型无法适应
最佳实践:将失败的尝试保留在上下文中 - 当模型看到失败的动作和堆栈跟踪时,会隐式更新内部认知 - 改变对相似动作的先验判断,减少重复犯错 - 错误恢复能力是真正智能体行为最明确的标志
6. 不要陷入Few-Shot陷阱¶
问题:Few-shot Prompting在Agent系统中可能适得其反 - 语言模型是出色的模仿者,会模仿上下文中的行为模式 - 如果上下文中充满相似的"动作-观测结果"对,模型倾向于遵循这种模式 - 在重复性决策任务中可能导致行为漂移、过度泛化甚至幻觉
解决方法:增加多样性 - 在动作和观测结果中引入少量结构化的变动 - 使用不同的序列化模板、变换措辞 - 在顺序或格式上引入微小的噪音 - 这种受控的随机性有助于打破模式,调整模型注意力
核心原则:上下文的模式越单一,智能体的行为就越脆弱。
📝 知识总结¶
Context工程核心原则¶
- 性能优先: 围绕KV缓存设计,最大化缓存命中率
- 状态管理: 使用遮蔽而非移除,保持上下文一致性
- 记忆外化: 将文件系统作为扩展上下文,实现可恢复的压缩
- 注意力引导: 通过复述机制将关键信息置于注意力焦点
- 错误学习: 保留失败记录,让Agent从错误中学习
- 多样性保持: 避免过度模式化,增加输出多样性
传统提示词设计原则¶
- 明确性: 清晰表达任务要求
- 结构化: 使用一致的格式
- 示例引导: 提供Few-shot示例(注意避免陷阱)
- 角色设定: 明确AI的角色定位
常用技巧¶
- 链式思维(CoT): 引导逐步推理
- 模板化: 标准化提示词结构
- 上下文压缩: 优化信息密度
- 状态机控制: 动态管理工具可用性
💬 面试问题解答¶
Q1: 什么是上下文工程?¶
核心定义: 上下文工程是通过精心设计输入提示词来引导大语言模型产生期望输出的技术。
关键要素: - 任务描述清晰 - 提供相关示例 - 设置合适的约束条件
✅ 学习检验¶
- [ ] 理解提示词设计的核心原则
- [ ] 能设计针对特定任务的提示词模板