为 AI Agent 编写高效工具:Anthropic 工程指南
Anthropic 推出了一套用于构建和优化 AI Agent 工具的全面方法论,将软件开发范式从确定性契约(系统对系统)转向非确定性契约(Agent 对系统)。核心要点是,工具的设计必须专门针对 LLM 的“可负担性”(affordances)——优先考虑上下文效率和语义清晰度,而非传统的 API 灵活性。
以 Agent 为中心的工具化范式
传统的软件构建在确定性契约之上,即特定的输入总是产生相同的输出。相比之下,AI Agent 是非确定性的;它们可能会根据相同的提示词选择调用工具、依赖内部知识或请求澄清。
为了最大限度地提高 Agent 的效能,开发者必须摆脱将工具编写为标准 API 的思维,转而设计能够增加 Agent 成功执行策略的“表面积”的工具。对 Agent 而言具有人体工程学特征的工具通常与直观的人类工作流保持一致。
工具开发的系统化工作流
Anthropic 建议通过原型设计、评估和 Agent 主导的优化这一迭代循环来精细化工具性能。
1. 原型设计与本地测试
开发者应从快速原型开始,利用 Claude Code 等工具生成初始实现。为了提高单次生成的质量,Anthropic 建议为相关的 SDK 或 API 提供对 LLM 友好的文档(例如 llms.txt 文件)。工具可以通过以下方式进行本地测试:
- Local MCP Servers: 通过
claude mcp add连接到 Claude Code。 - Desktop Extensions (DXT): 集成到 Claude Desktop 应用中。
- Direct API Calls: 使用 Anthropic API 进行程序化测试。
2. 评估驱动的优化
需要进行系统化的测量以避免过拟合并确保现实世界的有效性。这包括:
- 生成复杂任务: 避免简单的“沙盒”提示词,转而采用多步骤、现实世界的场景(例如,通过分析日志并识别受影响的用户来解决客户账单纠纷)。
- 可验证的结果: 将提示词与标准答案(ground-truth)配对,或使用基于 LLM 的裁判进行验证。
- 程序化执行: 在
while-loops 中运行评估 Agent,在 LLM API 调用和工具执行之间交替进行。 - 交错思维: 在工具调用之前利用“交错思维”或思维链(CoT)块,以诊断 Agent 为何未能使用工具或选择了低效路径。
3. Agent 主导的精细化
Anthropic 发现,Agent 在分析自身的失败记录时非常高效。通过将评估记录反馈给 Claude Code,开发者可以自动重构工具实现和描述,以确保自洽性和性能。
高性能工具的核心原则
策略性工具选择
工具并非越多越好。与传统软件丰富的内存相比,Agent 的上下文窗口是有限的。
- 避免暴力工具: 与其使用返回所有数据的
list_contacts工具(迫使 Agent 逐个 token 阅读),不如实现一个search_contacts工具。 - 整合功能: 将多个离散的 API 调用合并为一个单一的高层级工具。例如,与其使用独立的
list_users和create_event工具,不如创建一个schedule_event工具,在一个调用中处理可用性和调度问题。
命名空间与边界定义
为了防止 Agent 在访问跨多个 MCP 服务器的数百个工具时产生混淆,开发者应使用命名空间(将相关工具归类在共同的前缀下)。
- 示例: 使用
asana_projects_search和jira_projects_search有助于 Agent 划定不同服务之间的边界。
优化上下文与信号
工具响应应优先考虑高信号信息,并尽量减少 token 浪费。
- 语义标识符: 使用自然语言名称或从 0 开始的 ID 来替换晦涩的 UUID,以减少幻觉。
- 响应格式: 实现一个
response_format枚举(例如,nCONCISE与DETAILED)。简洁的响应可以节省 token,而详细的响应则为下游工具调用提供必要的 ID。 - Token 效率: 使用分页、范围选择和截断来管理上下文。Anthropic 将 Claude Code 的工具响应默认设置为 25,000 tokens。
为工具规范编写提示词工程
工具描述在 Agent 的上下文中起到了引导机制的作用。Anthropic 指出,对工具描述进行精确的精细化对于 Claude Sonnet 3.5 在 SWE-bench Verified 评估中达到顶尖性能至关重要。
- 显式上下文: 描述工具时就像向新员工解释一样,包括小众术语和专门的查询格式。
- 无歧义的命名: 使用具体的参数名称(例如,
user_id而不是user)以强制执行严格的数据模型。
Sources
相关
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch