前置知识

阅读本文前,建议先了解 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)
  • 可能是单轮或多轮调用

七、延伸阅读