前置知识
阅读本文前,建议先了解 01-Function_Call 的定义与作用 - 了解基本概念
一、Tool调用的完整流程(Function Call)
Function Call的工作流程可以分为以下几个步骤:
┌─────────────────────────────────────────────────────────┐
│ Function Call 完整流程 │
├─────────────────────────────────────────────────────────┤
│ │
│ 1. 用户提问 │
│ "今天北京天气怎么样?" │
│ │
│ 2. LLM判断是否需要调用函数 │
│ → 是,需要调用天气API │
│ │
│ 3. LLM生成函数调用参数 │
│ → {"function": "get_weather", "args": {"city": │
│ "北京"}} │
│ │
│ 4. 执行函数(外部环境) │
│ → 调用天气API,返回:{"temperature": 25, │
│ "weather": "晴"} │
│ │
│ 5. 将结果返回给LLM │
│ → LLM整合结果,生成最终回答 │
│ │
│ 6. 输出最终回答 │
│ "北京今天天气晴,气温25度..." │
│ │
└─────────────────────────────────────────────────────────┘
二、核心原理:LLM如何”决定”调用函数?
这是最关键的问题:LLM是怎么知道要调用哪个函数的?
2.1 关键:Function Calling是训练出来的!
LLM并不是“天生”会Function Call,而是通过微调训练学会的。
训练阶段:
┌─────────────────────────────────────┐
│ 输入:用户问题 + 函数定义 │
│ "今天天气怎么样?" + [天气API说明] │
│ ↓ │
│ 输出:应该调用哪个函数 │
│ get_weather(city="北京") │
└─────────────────────────────────────┘
2.2 函数定义(Function Schema)
在使用Function Call时,我们需要向LLM提供函数定义,告诉它有哪些函数可用:
{
"name": "get_weather",
"description": "获取指定城市的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称,如北京、上海"
}
},
"required": ["city"]
}
}这个定义就像给LLM的“工具说明书”。
三、LLM判断调用函数的逻辑
3.1 理解用户意图
LLM分析用户的问题,判断是否需要调用函数:
用户:北京今天天气怎么样?
LLM:这个问题需要知道实时天气,应该调用天气函数
3.2 选择合适的函数
当有多个函数时,LLM需要选择最合适的一个:
可用函数:
- get_weather(获取天气)
- get_time(获取时间)
- search_news(搜索新闻)
用户:今天几号?
LLM:这个问题需要获取时间,选择 get_time 函数
3.3 提取参数
LLM从用户问题中提取调用函数所需的参数:
用户:北京今天天气怎么样?
LLM:需要调用 get_weather,参数 city="北京"
四、两种调用模式
4.1 单轮调用(Single Call)
一次调用完成所有操作:
用户:北京天气怎么样?
LLM:调用 get_weather(city="北京")
→ 返回结果
→ 直接回答
4.2 多轮调用(Multi-turn Call)
需要多次调用才能完成:
用户:帮我查一下北京和上海的天气
LLM:第一次调用 get_weather(city="北京")
→ 返回北京天气
LLM:第二次调用 get_weather(city="上海")
→ 返回上海天气
→ 整合两个结果,回答用户
五、注意事项
5.1 LLM可能判断错误
LLM可能该调用函数时不调用,或者不该调用时调用。
❌ 用户:你好
LLM:错误地调用了天气API → 返回错误
解决:在系统提示中明确指导何时调用。
5.2 参数提取可能出错
用户:帮我查一下北京今天的天气
LLM:可能提取为 city="今天" 而不是 city="北京"
解决:在函数定义中提供更详细的参数说明。
5.3 函数执行失败怎么办
LLM:调用天气API
→ API返回错误
LLM:需要告诉用户"抱歉,无法获取天气信息"
六、总结
- Tool/Function Call流程:判断 → 选择工具 → 提取参数 → 执行 → 整合结果
- LLM通过微调训练学会调用Tool
- 需要提供工具定义(Tool Schema / Function Schema)
- 可能是单轮或多轮调用
七、延伸阅读
- 01-Function_Call 的定义与作用 - 了解LLM如何决定调用工具
- 03-Function_Call 的实现与应用 - 实际应用与实现方式