Tool Use 与工具工程
工具既是 Agent 的能力,也是上下文负担和安全边界。Tool Use 不是 ReAct 的同义词:一次 function calling、Plan executor、Supervisor、Graph 节点都可以使用工具。
工具横跨三个设计面
模型只提出 tool_call,Harness 才拥有执行权。
好工具的契约
工具应围绕 Agent 的任务边界设计,不要把底层 API 一比一暴露。与其提供 run_sql(sql: str),不如提供 search_orders(customer_id, status, date_from, limit, cursor)。
可运行的受控工具注册表
下面示例使用 Python 标准库和 Pydantic 2。它展示参数验证、权限、超时、结构化错误与调用审计;工具数据是明确标注的本地模拟数据。
线程超时不能强制终止已经运行的函数。生产中应让 HTTP/数据库客户端自身支持 timeout 与 cancellation,并限制后台任务资源。
错误要帮助 Agent 修正
不要把所有失败都变成 Exception: request failed。稳定错误码可指导下一步:
区分:参数错误、权限拒绝、未找到、限流、上游超时、冲突、部分成功和内部错误。只对明确的瞬时错误做有界重试。
副作用与幂等
写操作使用业务幂等键,而不是让模型“记住不要重复”:
控制返回大小
工具结果会进入 Context。搜索、日志、数据库工具应支持:
limit与cursor,而不是一次返回全部;fields选择字段;- 时间、状态、租户等服务端过滤;
- 摘要与原始结果 ID;
- 明确
truncated=true; - 二次读取单条详情的工具。
MCP 解决什么,不解决什么
Model Context Protocol(MCP)统一客户端与外部服务器之间的能力发现和调用,核心 primitive 包括 tools、resources 与 prompts。它解决接口协议与连接问题,但不会自动解决:
- 工具是否应该暴露给当前用户;
- 模型能否正确选工具;
- 业务写入是否幂等;
- 工具结果是否可信;
- token 预算、审批、审计和回滚。
工具评测
至少分别统计:
- tool selection accuracy:该用时是否调用、不该用时是否克制;
- argument accuracy:字段、单位、ID、时间范围是否正确;
- execution success:上游是否成功;
- task success:工具成功后任务是否真正完成;
- recovery rate:超时、空结果、权限拒绝后是否正确处理;
- side-effect safety:是否产生重复或越权写入;
- token/latency:定义和结果给系统增加多少成本。
HTTP 200 只代表接口调用完成,不代表 Agent 选对了工具或解决了任务。