AI Agent 的有效上下文工程

本文翻译自 Anthropic 官方博客:Effective context engineering for AI agents

译者注:本文介绍了如何为 AI Agent 设计有效的上下文,这是构建高性能 Agent 的关键技能。

当使用 Claude 等 AI 模型时,你传递给模型的信息——它的上下文——决定了它的性能。上下文包括系统提示、对话历史、工具定义、工具结果和你添加的任何文档。

上下文工程是设计此上下文以引导模型推理的艺术。在本文中,我们描述了为 AI Agent 设计上下文的原则和模式。

背景:Agent 的关键信息

Agent 具有与传统聊天机器人不同的上下文要求。

聊天机器人通常具有:

  • 有限数量的工具或没有工具
  • 较短的对话
  • 预定义的流程或任务

Agent 通常具有:

  • 许多工具
  • 长时间的会话
  • 不可预测的任务序列

这些差异意味着 Agent 通常从精心设计的上下文中比聊天机器人获益更多。然而,聊天机器人的技术同样适用于 Agent——只是需要扩展规模。

上下文的组成部分

AI 模型的上下文通常由几个不同的部分组成。这些通常按以下顺序组织:

  1. 系统提示:设定角色的指令和背景
  2. 工具定义:可用的工具
  3. 工具结果:工具的输出
  4. 对话历史:用户和模型之间的先前消息
  5. 用户消息:当前请求
  6. 检索到的文档:与当前任务相关的文档

让我们更详细地了解每个部分。

系统提示

系统提示告诉模型:

  • 它是什么(例如,"你是一个有用的助手")
  • 如何行动(例如,"要简洁")
  • 什么约束适用(例如,"绝不要产生幻觉")

系统提示通常是上下文的第一部分。它们对于设定基调至关重要。

工具定义

工具定义告诉模型什么工具可用以及如何使用它们。

工具定义通常包括:

  • 工具的名称
  • 工具的描述
  • 工具的参数
  • 参数的模式(如果适用)

工具定义使模型能够采取行动。没有工具,模型只能通过对话进行交互。

工具结果

工具结果是工具调用的输出。它们向模型提供有关世界的信息。

工具结果可能包括:

  • 数据库查询的结果
  • API 调用的结果
  • 文件的内容
  • 命令的输出

工具结果是模型的主要感知输入。它们使模型能够与外部世界交互。

对话历史

对话历史是用户和模型之间的先前消息。它为对话提供上下文。

对话历史使模型能够:

  • 记住先前的请求
  • 保持对话连续性
  • 从先前的错误中学习

对话历史对于长时间运行的 Agent 至关重要。

用户消息

用户消息是当前的请求。它告诉模型现在要做什么。

检索到的文档

检索到的文档是与当前任务相关的文档。它们为模型提供额外的上下文。

检索到的文档可能包括:

  • 知识库文章
  • 文档
  • 以前的对话
  • 代码

检索到的文档对于 RAG(检索增强生成)系统至关重要。

设计原则

现在让我们谈谈设计有效上下文的原则。

1. 清晰度和具体性

上下文应该清晰和具体。含糊的上下文会导致含糊的行为。

坏的:

你是一个助手。帮助用户。

好的:

你是一个客户服务助手。你的工作是帮助客户解决他们的问题。
要简洁和专业。如果你不知道答案,就说你不知道。

具体性减少了歧义,并使模型更有可能做你想要的。

2. 结构和层次结构

上下文应该有结构和层次结构。相关概念应该组合在一起。

坏的:

工具 A 做这个。工具 B 做那个。约束 1X。约束 2Y你应该有礼貌。不要产生幻觉。工具 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 至关重要
  • 避免过度约束、不足的上下文和缺乏示例
  • 评估你的上下文是否有效

我们很高兴看到你使用这些技术构建什么。