Tool Use / Function Calling
学完 Prompt Engineering、Context Engineering 和 RAG 之后,下一步非常自然的主题就是 Tool Use / Function Calling。
因为从这一层开始,模型不再只是“会回答”,而是开始具备“会做事”的能力。
比如它可以:
- 查天气
- 查数据库
- 调接口
- 搜索网页
- 读取文档
- 执行代码
- 调用内部业务函数
这也是很多 AI Agent、自动化助手、企业 AI 应用的基础能力。
1. Tool Use 是什么
Tool Use 可以理解为:让模型在需要时调用外部工具,而不是只依赖自身参数里的知识直接回答。
这里的“工具”可以很广,比如:
- 搜索工具
- 数据库查询工具
- 计算器
- 地图服务
- 邮件发送接口
- 日历接口
- 本地代码执行器
- 企业内部 API
一句话理解:
Tool Use = 模型在回答过程中,能主动借助外部能力完成任务
2. Function Calling 是什么
Function Calling 是 Tool Use 最常见、最工程化的一种实现方式。
它的核心思路是:
- 开发者先定义一组函数
- 每个函数有名字、作用、参数结构
- 模型根据用户意图判断是否要调用某个函数
- 如果要调用,就输出结构化参数
- 系统执行该函数
- 再把函数结果返回给模型
- 模型结合结果给出最终回答
所以:
Tool Use更偏概念Function Calling更偏实现机制
3. 为什么它重要
如果没有工具调用,模型通常只能:
- 靠记忆回答
- 靠上下文回答
- 做一些文本层面的推理
但很多真实任务必须访问外部世界,比如:
- “帮我查今天上海天气”
- “帮我查这个订单状态”
- “把这个会议安排到明天下午”
- “读取这份知识库文档并总结”
- “帮我运行一段代码看看结果”
这些都不是单靠语言模型参数本身能可靠完成的。
所以 Tool Use 的意义在于:
- 获取实时信息
- 获取私有数据
- 执行真实动作
- 把模型从“回答器”变成“执行器”
4. 一个最直观的例子
假设用户问:
帮我查一下今天北京天气,并告诉我是否适合出门跑步。
如果没有 Tool Use,模型只能凭记忆猜。
如果有 Tool Use,流程可能是:
- 模型判断:这个问题需要实时天气数据
- 调用
get_weather(location="Beijing") - 系统返回天气结果
- 模型根据温度、降雨、空气质量给出建议
这时候模型的价值就不是“背出天气”,而是:
- 知道什么时候该查
- 知道该查哪个工具
- 知道怎么用查到的结果组织回答
5. Tool Use 的基本流程
一个最常见的工具调用流程是:
用户提出请求模型判断是否需要调用工具模型选择工具模型生成工具参数系统执行工具系统返回执行结果模型结合结果继续回答
如果任务更复杂,这个流程可能会多轮循环:
Thought -> Tool Call -> Tool Result -> Thought -> Tool Call -> Final Answer
这和 ReAct 的思想是非常接近的。
6. Tool Use 和 RAG 的区别
这两个概念经常放在一起,但它们并不一样。
6.1 RAG 更关注什么
RAG 更关注:
- 从 知识库里检索相关资料
- 把资料放进上下文
- 让模型基于资料回答
它主要解决的是“知识从哪里来”。
6.2 Tool Use 更关注什么
Tool Use 更关注:
- 调用外部能力
- 获取实时信息
- 执行动作
- 和系统、服务、数据库交互
它主要解决的是“模型怎么和外部世界互动”。
简单说:
RAG:先找资料再回答Tool Use:先调用能力再回答,甚至直接完成动作
7. Function Calling 的核心组成
一个典型的函数调用机制,通常有下面几部分。
7.1 Tool Definition
先定义工具或函数,包括:
- 函数名
- 函数用途
- 参数字段
- 参数类型
- 必填项
- 字段说明
比如:
{
"name": "get_weather",
"description": "Get current weather by city name",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "City name"
}
},
"required": ["city"]
}
}
7.2 Tool Selection
模型要判断:
- 需不需要调工具
- 该调哪个工具
- 是调一个还是多个
7.3 Argument Extraction
也就是参数提取。
模型要从用户语言里抽出结构化参数,比如:
“帮我查一下明天下午上海的天气”
可能提取成:
{
"city": "Shanghai",
"date": "tomorrow",
"time_period": "afternoon"
}
7.4 Tool Execution
系统真正去执行函数,比如:
- 调 API
- 查数据库
- 跑脚本
- 访问文件系统
7.5 Result Injection
执行结果不能就此结束,还要重新喂回模型,让模型理解结果并生成最终答案。
这个步骤就是:
把工具结果重新注入上下文
它本质上也是 Context Engineering 的一部分。
8. 设计函数时最重要的原则
很多 Tool Use 效果差,不是模型不会用,而是函数定义本身设计得不好。
8.1 函数职责要单一
一个函数最好只做一类事,不要同时承担太多责任。
比如优先这样设计:
search_docsget_weatherquery_order_statuscreate_calendar_event
而不是设计一个万能函数:
do_everything
8.2 名字要清晰
函数名 最好让模型一看就知道用途。
好的名字通常是:
- 动词 + 对象
例如:
get_order_statussearch_knowledge_basesend_emailcreate_meeting
8.3 参数字段要明确
参数命名和描述一定要清楚,不然模型容易误用。
比如:
location比where更清楚start_time比time更清楚order_id比id更清楚
8.4 参数不要过多
函数参数太多会显著增加调用错误率。
能拆就拆,能默认就默认。
8.5 描述要写清边界
函数描述里最好说明:
- 它做什么
- 不做什么
- 适合什么场景调用
这样模型更容易在多个工具里选对。