AI Agent 的有效上下文工程
本文翻译自 Anthropic 官方博客:Effective context engineering for AI agents
译者注:本文介绍了如何为 AI Agent 设计有效的上下文,这是构建高性能 Agent 的关键技能。
当使用 Claude 等 AI 模型时,你传递给模型的信息——它的上下文——决定了它的性能。上下文包括系统提示、对话历史、工具定义、工具结果和你添加的任何文档。
上下文工程是设计此上下文以引导模型推理的艺术。在本文中,我们描述了为 AI Agent 设计上下文的原则和模式。
背景:Agent 的关键信息
Agent 具有与传统聊天机器人不同的上下文要求。
聊天机器人通常具有:
- 有限数量的工具或没有工具
- 较短的对话
- 预定义的流程或任务
Agent 通常具有:
- 许多工具
- 长时间的会话
- 不可预测的任务序列
这些差异意味着 Agent 通常从精心设计的上下文中比聊天机器人获益更多。然而,聊天机器人的技术同样适用于 Agent——只是需要扩展规模。
上下文的组成部分
AI 模型的上下文通常由几个不同的部分组成。这些通常按以下顺序组织:
- 系统提示:设定角色的指令和背景
- 工具定义:可用的工具
- 工具结果:工具的输出
- 对话历史:用户和模型之间的先前消息
- 用户消息:当前请求
- 检索到的文档:与当前任务相关的文档
让我们更详细地了解每个部分。
系统提示
系统提示告诉模型:
- 它是什么(例如,"你是一个有用的助手")
- 如何行动(例如,"要简洁")
- 什么约束适用(例如,"绝不要产生幻觉")
系统提示通常是上下文的第一部分。它们对于设定基调至关重要。
工具定义
工具定义告诉模型什么工具可用以及如何使用它们。
工具定义通常包括:
- 工具的名称
- 工具的描述
- 工具的参数
- 参数的模式(如果适用)
工具定义使模型能够采取行动。没有工具,模型只能通过对话进行交互。
工具结果
工具结果是工具调用的输出。它们向模型提供有关世界的信息。
工具结果可能包括:
- 数据库查询的结果
- API 调用的结果
- 文件的内容
- 命令的输出
工具结果是模型的主要感知输入。它们使模型能够与外部世界交互。
对话历史
对话历史是用户和模型之间的先前消息。它为对话提供上下文。
对话历史使模型能够:
- 记住先前的请求
- 保持对话连续性
- 从先前的错误中学习
对话历史对于长时间运行的 Agent 至关重要。
用户消息
用户消息是当前的请求。它告诉模型现在要做什么。
检索到的文档
检索到的文档是与当前任务相关的文档。它们为模型提供额外的上下文。
检索到的文档可能包括:
- 知识库文章
- 文档
- 以前的对话
- 代码
检索到的文档对于 RAG(检索增强生成)系统至关重要。
设计原则
现在让我们谈谈设计有效上下文的原则。
1. 清晰度和具体性
上下文应该清晰和具体。含糊的上下文会导致含糊的行为。
坏的:
你是一个助手。帮助用户。
好的:
你是一个客户服务助手。你的工作是帮助客户解决他们的问题。
要简洁和专业。如果你不知道答案,就说你不知道。
具体性减少了歧义,并使模型更有可能做你想要的。
2. 结构和层次结构
上下文应该有结构和层次结构。相关概念应该组合在一起。
坏的:
工具 A 做这个。工具 B 做那个。约束 1 是 X。约束 2 是 Y。
你应该有礼貌。不要产生幻觉。工具 A 需要 Z。
好的:
## 角色
你是一个客户服务助手。
## 可用工具
- 工具 A:[描述]
- 工具 B:[描述]
## 约束
- 不要产生幻觉
- 要有礼貌
## 工具特定约束
- 工具 A 需要 Z
结构和层次结构使上下文更易于模型理解和导航。
3. 渐进式披露
不要一次性显示所有内容。首先显示摘要,然后允许模型深入挖掘细节。
这对于:
- 大型工具集
- 大型文档集合
- 复杂策略
渐进式披露示例:
首先,只显示工具摘要:
可用工具:
- 用户管理:创建、更新、删除用户
- 订单管理:创建、更新、取消订单
- 支付:处理退款
然后,如果模型需要详细信息,让它读取工具的完整文档。
4. 冗余和强调
关键信息应该重复。模型可能会错过上下文中的某些内容。
坏的:
在开始时提到一次:绝不要产生幻觉
好的:
在系统提示中:
- 绝不要产生幻觉
在工具描述中:
- 此工具绝不应该用于 X(产生幻觉风险)
在用户消息中:
- 记住:绝不要产生幻觉
冗余确保关键信息被注意到。
5. 示例和少样本学习
示例是教导模型如何行动的最有效方式之一。
坏的:
正确格式化用户的姓名。
好的:
正确格式化用户的姓名。
示例:
输入:john doe
输出:John Doe
输入:JANE SMITH
输出:Jane Smith
示例减少了歧义,并使模型更有可能遵循预期的模式。
高级模式
现在让我们讨论一些高级模式。
模式 1:引导推理
引导推理使模型在采取行动之前显式思考。
示例:
在回答之前,请按以下步骤操作:
1. 理解用户的请求
2. 确定可用的相关工具
3. 规划如何使用这些工具
4. 执行你的计划
5. 总结结果
引导推理提高了复杂任务的性能。
模式 2:角色分离
角色分离使模型能够考虑不同的观点。
示例:
你是一个团队:
- 研究员:收集信息
- 分析师:分析信息
- 作家:撰写响应
每个团队成员应该提供他们的输入。
角色分离提高了复杂任务的性能。
模式 3:检查清单
检查清单确保模型遵循所有必要的步骤。
示例:
在完成任务之前,请确保:
- [ ] 你理解了用户的请求
- [ ] 你收集了所有必要的信息
- [ ] 你验证了你的结果
- [ ] 你总结了你的发现
检查清单减少了错误。
模式 4:约束
约束限制模型的行为。
示例:
约束:
- 绝不要产生幻觉
- 绝不要透露敏感信息
- 绝不要执行未经授权的操作
约束提高了安全性和可靠性。
管理会话
长时间运行的 Agent 需要小心管理会话历史。如果会话历史太大,可能会:
- 超出上下文窗口限制
- 减慢推理速度
- 使模型困惑
以下是管理会话的一些技术:
技术 1:摘要
摘要压缩先前的对话。
坏的:
保留完整对话历史...
好的:
保留以下内容的摘要:
- 用户的原始请求
- 采取的行动
- 最终结果
摘要减少了上下文使用,同时保留了关键信息。
技术 2:相关片段选择
相关片段选择只保留最相关的消息。
坏的:
保留所有消息...
好的:
保留与当前任务相关的消息。
相关片段选择减少了上下文使用,同时提高了相关性。
技术 3:窗口
窗口只保留最近的 N 条消息。
坏的:
保留所有消息...
好的:
保留最近的 50 条消息。
窗口减少了上下文使用,同时确保了连续性。
常见错误
以下是人们在设计上下文时常犯的一些错误:
错误 1:过度约束
过度约束使模型难以行动。
坏的:
约束:
- 要有礼貌
- 要简洁
- 要详细
- 要友好
- 要专业
- 要正式
- 要非正式
...
好的:
约束:
- 要有礼貌和专业
- 要简洁,但提供足够的细节
专注于最重要的约束。
错误 2:不足的上下文
不足的上下文使模型难以理解任务。
坏的:
帮助用户。
好的:
你是一个客户服务助手。
你的工作是帮助客户解决他们的问题。
可用工具:[列表]
约束:[列表]
提供足够的上下文以明确任务。
错误 3:缺乏示例
缺乏示例使模型难以理解预期。
坏的:
格式化用户的姓名。
好的:
格式化用户的姓名。
示例:
输入:john doe
输出:John Doe
提供示例以阐明预期。
评估上下文
最后,重要的是评估你的上下文是否有效。
指标 1:任务成功率
模型是否成功完成了任务?
指标 2:效率
模型是否高效地完成了任务(例如,不必要的工具调用)?
指标 3:准确性
模型的输出是否准确?
指标 4:安全性
模型是否遵守了所有安全约束?
结论
上下文工程是构建高性能 Agent 的关键技能。通过遵循本文中描述的原则和模式,你可以设计引导模型推理的有效上下文。
要记住的关键点:
- 清晰度和具体性很重要
- 结构和层次结构有帮助
- 渐进式披露减少了认知负荷
- 冗余确保关键信息被注意到
- 示例是强大的教学工具
- 引导推理提高了复杂任务的性能
- 角色分离提供了不同的观点
- 检查清单减少了错误
- 约束提高了安全性和可靠性
- 管理会话对于长时间运行的 Agent 至关重要
- 避免过度约束、不足的上下文和缺乏示例
- 评估你的上下文是否有效
我们很高兴看到你使用这些技术构建什么。