工具使用(Tool Use)机制是连接大语言模型与外部代码逻辑的桥梁。本节将深入剖析其工作原理、实现机制以及如何通过它来构建强大的智能体应用。
在早期对话式大模型刚被广泛使用时,常见批评之一是“它无法获知最新信息”和“它不能完成实际任务”。这是因为模型本身无法联网,也无法直接操作文件系统。
工具使用(Tool Use)(也常被称为函数调用/工具调用机制),彻底打破了这堵墙。它赋予了智能体“手”和“脚”,使其能够执行 API 调用、运行代码、控制浏览器,从而真正地干涉物理和数字世界。
工具调用并不是魔法,它本质上是一种 结构化输出协议。模型并没有真的去运行 Python 函数,它只是生成了一段 请求运行工具 的文本。
为了让智能体使用工具,必须先用精确的语言定义工具。通常使用 JSON Schema 或 Pydantic 模型。
好的工具定义示例:
tools = [
{
"name": "search_web",
"description": "搜索互联网获取信息。适用于查询新闻、事实、最新数据等。不适用于需要推理或创作的任务。",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "搜索查询词,应该简洁明确"
},
"num_results": {
"type": "integer",
"description": "返回结果数量,默认 5",
"default": 5
}
},
"required": ["query"]
},
"examples": [
{"query": "某年度诺贝尔物理学奖获得者"},
{"query": "Python 3.12 新特性", "num_results": 3}
]
}
]
工具定义要素:
详细说明用途和限制。LLM 依靠这段描述来判断何时调用该工具。
当用户说“查询北京明天的天气”时:
思考 (Thinking): LLM 分析语义,发现需要外部数据。
选择 (Selection): LLM 扫描工具列表,发现 get_weather 最相关。
生成 (Generation): LLM 输出一个特殊的 JSON 结构:
执行 (Execution): Python 脚本(运行时 Runtime)解析这个 JSON,在本地真正调用 get_weather("Beijing", "tomorrow") 函数,获取返回值 "Sunny, 25C".
反馈 (Feedback): Runtime 构建一条 ToolMessage,包含返回值,追加到对话历史中,再次喂给 LLM。
响应 (Response): LLM 看到最新的 ToolMessage,终于可以说:“北京明天晴朗,气温 25 度。”
一个全能的智能体通常通过 Toolkit 的形式加载一组工具,常见的工具类型包括信息获取、计算与逻辑、生产力与协作等。
Web Search:解决 LLM 知识截止和时效性问题。
RAG Retriever: 搜索私有的企业知识库。
LLM 是文科生,算数(Arithmetic)很差,经常一本正经地算错。
Python Interpreter: 终极武器。当需要解方程、数据分析、画图时,让智能体写一段 Python 代码并在沙箱中运行,是准确率最高的方法(代码解释器模式)。
代码解释器的核心是让 LLM 从"说话者"变成"行动者"。它通常作为一个 **工具(Tool)**暴露给 LLM,当用户提出需要计算或数据处理的请求时,LLM 生成代码并通过工具调用将代码发送给解释器执行。核心价值:
运行 print(248 * 1923) 得到确定性正确结果
沙箱技术方案:
代码解释器必须运行在严格隔离的沙箱中,防止 rm -rf / 等危险操作:
以下示例展示了如何使用 E2B 沙箱运行代码并获取生成的图表:
File System: 读写本地文件(需严格限制路径)。
赋予智能体操作外部世界的能力,必须设置严格的安全护栏。
[!NOTE] 关于安全主题的分工
本节 (4.2) 侧重于 单次工具调用的沙箱机制(如何防止 rm -rf /)。
参数幻觉(Hallucinated Args):LLM 可能会编造不存在的参数名。代码层必须做 Schema 校验(Pydantic),如果校验失败,将 校验错误(Validation Error)直接返给 LLM,让它自我修正。
工具报错:如果 API 超时或报错,智能体不应崩溃,而应捕获异常,并尝试重试或换一个工具。
示例:健壮的执行器实现
Code Execution Risks: 永远不要在主进程中直接 exec() 智能体生成的代码。它可能包含 os.system("rm -rf /")。
解决方案:使用 Docker 容器、E2B 沙箱或 WebAssembly 环境来隔离运行不可信代码。
人类介入(Human-in-the-loop):对于敏感操作(转账、发邮件、删文件),必须设置 人工确认环节。智能体生成操作请求,人类点击“批准”后,系统才真正执行。示例:安全增强的执行器
结构化输出(Structured Outputs) 是工具使用能力的增强版本,能够保证API 响应严格匹配预定义的 JSON Schema。
传统的工具使用方式存在格式不稳定问题:
结构化输出通过 约束解码 尽可能保证输出符合 Schema:
消除解析错误:无需 try-catch 和重试逻辑
[!TIP] 何时使用这些机制:
批处理、多步编排:优先做“编程式编排 + 沙箱”。
下一节: 4.3 工具连接协议:模型上下文与工具服务