智能体的工具使用(Tool Use)
工具使用是智能体区别于纯对话 AI 的核心能力。通过调用外部工具,Agent 可以访问实时数据、执行计算、操作系统、调用 API——从"能说"变成"能做"。本章从 Agent 视角深入讲解工具使用的设计模式、最佳实践和安全考量。
工具使用是智能体区别于纯对话 AI 的核心能力。通过调用外部工具,Agent 可以访问实时数据、执行计算、操作系统、调用 API——从"能说"变成"能做"。本章从 Agent 视角深入讲解工具使用的设计模式、最佳实践和安全考量。
理解提示工程与工具调用
Agent 可用的工具类型、工具选择策略、工具执行的错误处理
行动系统 · 智能体深度解析
文章导航
点击图中节点可定位到对应正文。
引言
工具使用是智能体区别于纯对话 AI 的核心能力。通过调用外部工具,Agent 可以访问实时数据、执行计算、操作系统、调用 API——从"能说"变成"能做"。本章从 Agent 视角深入讲解工具使用的设计模式、最佳实践和安全考量。
注:工具调用的底层技术原理见 工具调用(Function Calling),本章聚焦 Agent 层面的工具设计和使用策略。
1. Agent 可用的工具类型
1.1 工具分类
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 信息获取工具 ─────────────────────────────────────┐
│ 搜索引擎、数据库查询、API 调用、文件读取 │
└────────────────────────────────────────────────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 计算与分析工具 ───────────────────────────────────┐
│ 计算器、代码执行器、数据分析工具 │
└────────────────────────────────────────────────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 通信与协作工具 ───────────────────────────────────┐
│ 邮件发送、消息推送、日历管理、任务创建 │
└────────────────────────────────────────────────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 操作与执行工具 ───────────────────────────────────┐
│ 文件操作、系统命令、浏览器操作、UI 自动化 │
└────────────────────────────────────────────────────┘根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
┌─ 生成与创作工具 ───────────────────────────────────┐
│ 图像生成、文档生成、代码生成、PPT 生成 │
└────────────────────────────────────────────────────┘1.2 工具描述模板
每个工具需要清晰的描述,让 LLM 知道何时以及如何使用(业界也在通过 MCP 协议 推动工具描述的标准化):
{
"name": "query_database",
"description": "执行 SQL 查询并返回结果。当需要从数据库获取数据时使用此工具。支持 SELECT 查询,不支持修改操作。",
"parameters": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "要执行的 SQL 查询语句"
},
"database": {
"type": "string",
"enum": ["production", "analytics", "test"],
"description": "目标数据库"
}
},
"required": ["sql", "database"]
},
"returns": {
"type": "array",
"description": "查询结果的行列表"
}
}2. 工具选择策略
2.1 自动工具选择
LLM 根据用户请求和工具描述自动选择工具:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
LLM 的决策过程:
1. 用户需要"查数据" → 需要信息获取工具
2. "销售数据" → 可能在数据库中
3. 选择工具: query_database
4. 生成参数: sql="SELECT * FROM sales WHERE month='上月'", database="analytics"2.2 工具路由
当工具很多时,先用一个路由步骤筛选相关工具:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
用户请求 → 工具路由器(可以是另一个 LLM 调用或分类器)
↓
筛选出 3-5 个相关工具
↓
主 Agent 在筛选后的工具中选择2.3 工具链编排
复杂任务需要多个工具按特定顺序协作:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
工具链:
query_database(sql="...") → 获取数据
↓
analyze_data(data) → 分析趋势
↓
generate_chart(analysis) → 生成图表
↓
create_report(analysis, charts) → 生成报告
↓
send_email(to="boss@company.com", body=report) → 发送3. 工具执行的错误处理
3.1 常见错误类型
把公式、变量和含义拆开呈现,便于对照阅读。
1. 工具调用失败- API 超时、返回错误码、参数错误2. 工具返回意外结果- 数据为空、格式不对、数据量过大3. 工具返回矛盾信息- 两个工具返回相互矛盾的结果4. 工具不可用- 服务宕机、权限不足3.2 错误处理策略
def execute_tool_with_retry(tool_name, params, max_retries=3):
for attempt in range(max_retries):
try:
result = execute_tool(tool_name, params)
# 验证结果合理性
if is_valid(result):
return result
# 结果异常,尝试修正参数
llm_reflection = llm.generate(f"""
工具 {tool_name} 返回了异常结果: {result}
参数是: {params}
可能是什么问题?如何修正参数?
""")
params = adjust_params(llm_reflection)
except ToolError as e:
if attempt < max_retries - 1:
# 等待后重试
time.sleep(2 ** attempt)
else:
# 最终失败,让 LLM 决定如何处理
return llm.generate(f"""
工具 {tool_name} 连续失败 {max_retries} 次
错误信息: {e}
请决定:1) 换一种方法完成任务
2) 告知用户无法完成
3) 请求用户帮助
""")3.3 降级策略
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
数据库查询失败 → 尝试从缓存获取最近数据
API 调用超时 → 使用本地缓存 + 提示用户数据可能不是最新
代码执行失败 → 让 LLM 手动计算(不精确但可用)
搜索无结果 → 扩大搜索范围或换关键词4. 工具安全
4.1 权限控制
不同角色的 Agent 有不同的工具权限:
管理员 Agent:
✓ 所有查询工具
✓ 数据修改工具
✓ 系统管理工具
✓ 用户管理工具
普通用户 Agent:
✓ 只读查询工具
✓ 个人数据修改工具
✗ 系统管理工具
✗ 其他用户数据工具
访客 Agent:
✓ 公开信息查询
✗ 任何修改操作
✗ 敏感数据查询4.2 沙箱执行
# 代码执行必须在沙箱中
class CodeSandbox:
def __init__(self):
self.allowed_modules = ["math", "json", "datetime", "pandas", "numpy"]
self.blocked_modules = ["os", "sys", "subprocess", "shutil", "socket"]
self.max_execution_time = 30 # 秒
self.max_memory = "512MB"
def execute(self, code):
# 1. 检查代码是否包含被禁模块
for module in self.blocked_modules:
if f"import {module}" in code:
raise SecurityError(f"不允许使用 {module} 模块")
# 2. 在隔离环境中执行
result = run_in_container(
code,
timeout=self.max_execution_time,
memory_limit=self.max_memory,
network=False # 禁止网络访问
)
return result4.3 Human-in-the-Loop
对于高风险操作,需要人类确认:
Agent: "我需要执行以下操作来完成任务:
1. 删除旧数据库备份(释放 500GB 空间)
2. 运行数据迁移脚本
3. 重启生产服务器
这些操作不可逆,是否继续?[Y/n]"
用户: "1 可以,2 可以,但 3 等到凌晨再执行"
Agent: 调整计划,按用户指示执行5. Computer Use:操作桌面应用
5.1 工作原理
Agent 操作桌面应用的循环:
1. 截取屏幕截图
2. VLM(视觉语言模型)理解屏幕内容
3. 决定下一步操作(点击、输入、滚动等)
4. 执行操作
5. 再次截图,检查结果
6. 循环直到完成
支持的操作:
- 鼠标:点击、双击、拖拽、滚动
- 键盘:输入文本、按键、快捷键
- 窗口:切换、最大化、最小化5.2 应用场景
| 场景 | 说明 |
|---|---|
| 操作旧系统 | 没有 API 的旧版软件 |
| 跨应用流程 | 需要在多个应用间切换 |
| 测试自动化 | UI 测试和用户流程测试 |
| 数据采集 | 从网页或应用中提取信息 |
6. 本章小结
| 维度 | 最佳实践 |
|---|---|
| 工具设计 | 单一职责、清晰命名、详尽描述 |
| 工具选择 | 让 LLM 自动选择 + 路由过滤 |
| 错误处理 | 重试 + 参数修正 + 降级策略 |
| 安全 | 权限控制 + 沙箱 + 人类确认 |
| 工具链 | 明确依赖关系,支持顺序/并行/条件执行 |
相关章节
- 工具调用(Function Calling) — 工具使用的底层能力
- MCP 协议详解 — 工具接入的标准化协议
- 什么是智能体 — 工具使用在智能体整体中的位置
延伸阅读
- Schick, T. et al. (2023). "Toolformer: Language Models Can Teach Themselves to Use Tools". NeurIPS
- Qin, Y. et al. (2023). "ToolLLM: Facilitating Large Language Models to Master 16000+ Real-world APIs". arXiv
- Anthropic (2024). "Computer Use". anthropic.com/news