AI 代理的上下文工程
上下文工程可以理解为:围绕下一步决策所需的信息,系统性地构建、选择、压缩、隔离并更新输入上下文的实践。它关注的是一套可重复、可度量、可持续运行的流程,让代理在每次调用大模型时都能拿到恰当且可信的信息集合,而不是把所有希望都押在一次性的提示文本上。换句话说,提示工程更像制定静态规则,强调怎么说;上下文工程更像治理动态信息环境,强调该给什么、何时给、给到什么粒度、如何保持一致。
代理的表现,不仅由模型能力决定,也由你为它构建的信息供应链决定。
1、上下文的组成
1.1 五类典型上下文及其作用边界
Agent 常见需要管理的上下文至少覆盖五类来源。
第一类是指令,包括系统消息、提示、少样本示例以及工具使用规则,它们定义了代理的边界与行为准则;
第二类是知识,包含事实性信息、数据库检索结果或长期记忆,很多场景会通过 RAG 把外部知识动态注入到上下文;
第三类是工具,既包括可调用的外部函数/API/MCP 服务器定义,也包括工具调用后返回的结果与反馈;
第四类是对话历史,它帮助代理保持连续性,但也是最容易膨胀并挤占窗口空间的部分;
第五类是用户偏好,例如预算、品牌偏好、出行习惯等,适合沉淀为可复用的长期信息,在关键决策点被再次调用。
1.2 把所有内容都塞进上下文并不是好策略
上下文并非越多越好。输入过多会增加噪声并放大模型的注意力分配问题:
代理可能被无关历史牵引而忽略当前任务;
另一方面,当工具描述和候选工具数量变得庞大时,模型会出现选择困难甚至误调用。
上下文工程的目标不是堆料,而是通过结构化与分层,让代理在每个子任务上只看到完成这一步最需要的那部分信息,其余信息要么压缩为摘要,要么转移到上下文窗口之外的存储与运行时状态里。
2、规划阶段与运行期治理如何配合
2.1 规划阶段
先把结果定义清楚,明确代理完成任务后用户能获得什么变化或产出;再绘制上下文地图,回答代理为了达成结果需要哪些信息、这些信息可能存放在哪里;最后建立上下文管道,设计代理如何通过 RAG 、 MCP 服务器或其他工具去获取这些信息,并在何时注入到模型调用里。
这样做的价值在于把信息来源显式化、可追踪化,避免代理在运行时临时拼凑,导致流程不可控、难复现。
2.2 运行期治理
当信息开始持续流入上下文窗口,运行期治理比单次提示更关键,因为要保证历史信息的连贯,也要维护现有重点信息,同时还要保证上下文窗口的限定。
用 Agent Scratchpad(草稿本)记录会话内关键事实但把它放在窗口外,以便按需检索;
用 Memories(记忆)跨会话保存摘要、偏好与反馈;
当窗口接近上限时进行压缩,通过摘要与修剪保留最相关信息;
用多代理系统把复杂任务拆分给不同代理,让它们各自维护更小的上下文;
用沙箱环境在外部执行代码或处理大文档,只把必要结果回填;
用运行时状态对象保存分阶段产出,让主上下文始终聚焦当前子任务。
3、实践案例与失败模式
3.1 案例
如果只有提示工程,代理通常会停留在单轮问答,例如先问你什么时候去巴黎,后续再逐步询问预算、偏好与住宿需求。这种模式并非错误,但它把信息获取完全交给用户对话,效率低且容易遗漏关键约束。
引入上下文工程后,代理在回复前会主动拉取与决策相关的信息:比如检查日历确认可用日期、从长期记忆里回忆过往偏好(常用航司、预算、是否偏好直飞)、识别可用的订票与酒店工具,然后再给出更贴近目标的建议性方案。关键不在于更会聊天,而在于它拥有可重复的信息获取与注入流程。
3.2 四类常见上下文失败
上下文工程的另一面是失败治理。
第一类是上下文中毒:幻觉或错误信息进入上下文并被反复引用,代理会围绕不存在的事实制定计划。应对方式是上下文验证与隔离,例如把关键航班信息在写入记忆前用实时 API 校验,发现异常就开启新的上下文线程防止传播。
第二类是上下文分心:上下文过大时模型过度关注历史,出现重复或无用行为。应通过定期摘要把长对话压缩为与当前目标相关的短摘要。
第三类是上下文混淆:当不必要的上下文(尤其是过多工具)导致误调用。建议用 RAG 做工具载入管理,把工具描述放入向量库并按任务检索,只给模型最相关的一小组工具(研究表明把工具选择限制在 30 个以内是有效的)。
第四类是上下文冲突:上下文里同时存在相互矛盾的信息(例如先说经济舱、后改商务舱),导致推理不一致。可通过上下文修剪移除过时指令,或把冲突调和过程外卸到草稿区,确保主上下文只保留最终一致的约束。
结论可以概括为:上下文工程既是供给侧建设(信息管道),也是质量控制(验证、压缩、隔离与一致性维护)。
- 感谢你赐予我前进的力量