FuctionCalling详解

0 阅读6分钟

Function Calling 函数调用也叫 Tools 工具,它本质上就是在AI应用中自定义实现一些方法(函数),然后交给大模型,由大模型自行判断在合适的时机调用这些方法,从而实现原来大模型无法做到的一些扩展功能,比如操作本地数据库等等。其流程如下

image

  1. 当用户把问题发送给AI应用,在AI应用的内部需要组织提交给大模型的数据,而这些数据中需要描述清楚我们的AI应用中有哪些函数能够被大模型调用。每一个函数的描述都包含三个部分,方法名称、方法作用、方法入参
  2. 当AI应用把这些数据发送给大模型后,大模型会先根据用户的问题以及上下文拆解任务,从而判断是否需要调用函数,如果有函数需要调用,则把需要调用的函数的名称,以及调用时需要使用的参数准备好一并响应给AI应用
  3. AI应用接收到响应后需要执行对应的函数,得到对应的结果,接下来把得到的结果和之前信息一块组织好再发送给大模型

注意:

  • 大模型只做调用哪个函数的决策,实际调用函数的工作是由AI应用(比如langchain4j框架、cherry studio等)完成的
  • 由于在一次任务的处理过程中可能需要根据顺序调用多个函数,所以当大模型接收到AI应用发送的数据继续拆解任务,如果发现还需要调用其他的函数,则会重复4.1~4.4这几个步骤,直到无需调用函数,最终把生成的结果响应该AI应用,并由AI应用发送给用户

具体来说,Fuction Calling就是大模型提供商在模型内部与API层面做了支持的一种能力,它最早由 OpenAI 引入:

  • 在模型层面:模型提供商需对大模型进行特别优化,使其具备根据上下文正确选择合适函数、生成有效参数的能力(比如有监督微调、强化学习)
  • 在API层面:模型提供商需额外开放对Function Calling的支持,比如需要自定义标准来规定AI应用程序向大模型提供工具列表、大模型向AI应用程序响应需要调用哪个工具并携带调用参数、AI应用程序向大模型返回工具调用的结果时的具体消息格式

由此可见,Fuction calling是大模型本身的一种能力,需要大模型自身支持,并且各个大模型厂商实现的具体标准都不一样。实际开发时需要查找对应的支持情况:Comparison Table of all supported Language Models | LangChain4j

image

举一个具体的例子,用户提问天气,大模型利用Function Calling能力调用外部工具查询天气并返回结果

image

流程解释如下:

  1. 用户通过自然语言提出问题,例如:“广州今天天气如何?适合出门吗?”

  2. AI应用程序向大模型 API 传入用户原始输入、函数描述和其他上下文信息,获取调用指令。函数描述包括函数名称、用途说明、参数结构等。具体消息格式各个厂商会有区别,示例如下

    {
      "messages": [
        {
          "role": "system",
          "content": "你是一个助手,可以根据用户的请求调用工具来获取信息。"
        },
        {
          "role": "user",
          "content": "广州今天天气如何?适合出门吗?"
        }
      ],
      // 函数列表
      "functions": [
        {
          "name": "getWeather",
          "description": "获取指定城市的天气",
          "parameters": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "城市名称,比如北京"
              },
              "date": {
                "type": "string",
                "description": "日期,比如 2025-08-07"
              }
            },
            "required": ["location", "date"]
          }
        }
      ]
    }
    
  3. 模型会智能判断是否需要调用函数,选择合适的函数,并基于上下文自动生成结构化的调用指令(函数名 + 参数),例如:

    {
      "function_call": {
        "name": "getWeather",
        "arguments": {
          "location": "Guangzhou",
          "date": "2025-07-17"
        }
      }
    }
    
  4. AI应用程序接收到模型返回的调用指令后,解析调用指令,得到函数名称和参数,执行对应的方法(如调用天气查询函数),并获取结果

  5. AI应用将函数执行结果 + 其他上下文信息(包括用户原始输入)传给模型,模型判断此时已有足够的信息回答问题,不再需要调用函数了,于是直接生成最终结果,例如:“广州今天35度,暴雨,建议在室内活动”

注意:

  • 由于Fuction Calling能力依赖具体大模型厂商的实现,所以其缺陷是AI应用需要自己实现对各个厂商大模型的适配,开发量比较大

  • Fuction Calling也没有规定AI应用程序具体如何调用工具,所以需要每个AI应用自行实现对工具的调用

  • 没有Fuction Calling能力的大模型并非不能调用外部工具。我们可以自定义系统提示词,让大模型来调用外部工具,比如以下系统提示词

    # 你的角色
    你是一个函数调用助手,我将提供多个函数的定义信息,包括函数名称、作用、参数及参数类型。
    
    # 你的任务
    - 根据用户的输入,判断是否需要调用某个函数  
    - 如果需要,请**严格按照以下格式**输出函数调用指令:
    ```json
    { "name": "函数名", "arguments": { "参数名": "参数值" } }
    ```
    
    # 函数定义信息
    1. **get_weather**  
       - 作用:查询指定城市的天气情况  
       - 参数:  
         -`city`(string):城市名称
    2. **get_time**  
       - 作用:查询指定城市的当前时间  
       - 参数:  
         - `city`(string):城市名称
    
    

    这样当用户提问:广州的天气怎么样?,模型会根据系统提示词以指定格式返回要调用的工具及参数

    { "name": "get_weather", "arguments": { "city": "广州" } 
    

    只不过这种调用工具的实现方式有以下缺点:

    • 输出格式不稳定。如调用指令中存在多余自然语言
    • 容易出现幻觉。模型可能编造并不存在的函数名或参数
    • 对开发者依赖度高。函数描述、调用指令格式、提示词逻辑完全由开发者设计
    • 上下文冗长,Token 消耗大。为确保调用逻辑正确,往往需要在 system prompt 中加入大量说明与规则