大模型Agent工具调用深度解析
大模型为何需要结合工具(Tool)?
LLM 在理解与推理层面确实表现强劲,但先天存在数个关键短板,直接影响落地效果。
一个典型场景足以说明问题:
- 实时数据无法获取。模型训练完成后参数固化,询问当前金价、上海天气、最新头条——它只能输出静态知识。
- 外部系统无法操作。模型知道如何发邮件、查询数据库、调用API,但缺乏实际通道与权限去执行这些操作。
简言之,LLM 能判断出应该做什么,但无法真正完成。这好比一位顶级军师,策略无懈可击,却没有亲自冲锋的能力。
业界因此提出一套自然解法:让 LLM 与具体工具协同工作——
- LLM 负责意图解析、问题推理与决策生成;
- 工具负责动作执行、外部系统对接与实时数据拉取。
二者配合,AI 才真正具备解决复杂任务的能力。这套模式正是本文要深入拆解的核心机制。
什么是 Tool Call?
Tool Call(工具调用) 是让大模型能够调用外部工具的标准化机制。核心逻辑:模型意识到自身知识不足以回答某个问题时,便会触发一套流程来寻求外部援助。
具体步骤包括:
- 判断是否需要用工具;
- 选择合适的工具;
- 准备工具所需的参数;
- 发出调用请求——通知系统执行该工具;
- 接收工具返回的数据;
- 基于结果进行推理并组织答案。
实际举例:
代码示例用户:今天上海天气怎么样?LLM:
发现需要实时天气数据
↓
调用 Weather Tool
↓
获取天气结果
↓
组织最终回答
这一整套动作,就是一次完整的 Tool Call 流程。
LLM 如何感知可用工具?
关键依赖于 Tool Schema(工具模式描述)。
可以把 Tool Schema 理解为一份给模型准备的“工具说明书”。例如我们写了一个查询天气的函数:
代码示例function getWeather(city) {
return weatherApi(city)
}
作为开发者,我们清楚:函数名为 getWeather,参数是 city,作用是获取天气。但 LLM 无法直接读取源代码——它并非编译器。
因此需要用 Tool Schema 将信息显式告知模型:
代码示例{
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
其中三个关键字段:
name:工具标识符description:工具功能描述parameters:工具所需的参数结构及约束
当用户提问“上海今天天气怎么样?”时,模型读取该 Schema,发现 get_weather 工具满足需求,且需要 city 参数,随即生成如下调用请求:
代码示例{
"name": "get_weather",
"arguments": {
"city": "上海"
}
}
需要明确:模型自身不执行函数,它仅根据 Schema 生成调用参数。真正的 API 请求与业务逻辑仍由开发者代码处理。Tool Schema 本质上是一份接口文档,模型负责解读并填写参数,实际执行交由业务程序完成。
一次完整的 Tool Call 流程
前面解析了概念与 Schema,现在看完整运行链路。
假设已注册一个天气工具,Schema 如下:
代码示例{
name: "get_weather",
description: "获取城市天气",
parameters: {
city: "string"
}
}
用户问:“上海今天天气怎么样?”
模型收到问题后,先分析:需要实时天气数据。然后扫描 Schema,命中 get_weather 工具,提取参数 city=“上海”,生成 Tool Call 请求:
代码示例{
"name": "get_weather",
"arguments": {
"city": "上海"
}
}
注意:模型在此处停止,不执行任何操作。后续由业务程序接手:根据请求中的工具名和参数,实际调用天气 API,获取结果后返回给模型。完整链路如下:
代码示例用户提问
↓
LLM分析问题
↓
生成 Tool Call
↓
程序执行工具
↓
获得执行结果
↓
结果返回给LLM
↓
生成最终答案
例如工具返回:
代码示例{
"temperature": 31,
"weather": "晴"
}
模型拿到这份数据,便可组织出最终回答:
代码示例上海今天晴天,气温31℃,适合外出,但注意防晒。
由此可见,Tool Call 的本质是:让模型学会“借力”——它负责推理与决策,工具负责执行与数据获取。两者协同,才能完成单靠模型自身无法胜任的任务。
