Skip to content

Function Call:让大模型调用外部函数 ​

一、什么是 Function Call ​

Function Call(函数调用,也常称 Tool Calling)是一种让大模型以结构化形式提出“请调用某个函数”的能力。

开发者会向模型提供函数的名称、用途说明和参数定义。模型理解用户意图后,不直接执行代码,而是返回一个结构化调用请求:

json
{
  "name": "get_weather",
  "arguments": {
    "city": "Shanghai"
  }
}

应用程序收到请求后,找到真实函数并传入参数执行,再把执行结果返回给模型。模型根据结果生成最终回答,或者继续请求另一个函数。

因此,Function Call 的核心边界是:模型负责理解意图和提出调用请求,应用程序负责真正执行函数。

它不是让模型直接运行 Java 方法、Shell 命令或数据库操作,也不是简单地让模型输出一段看起来像 JSON 的文本,而是模型与应用程序之间约定好的结构化交互协议。

二、Function Call 的作用 ​

普通大模型主要生成文本,它不知道实时天气、订单状态、库存数量,也不能直接访问应用内部的数据库和服务。Function Call 为模型提供了一条受控的“外部能力入口”。

它主要用于:

  1. 获取外部信息:查询天气、订单、库存、知识库或其他业务数据。
  2. 执行明确动作:创建日程、发送通知、提交工单等由应用程序提供的业务操作。
  3. 连接多个步骤:模型先调用查询函数,再根据结果决定下一步调用,形成 Agent 的任务执行过程。

需要区分三个相近概念:

概念主要目的结果
普通文本生成生成自然语言回答文本
结构化输出让回答符合 JSON 或某种数据结构结构化数据
Function Call请求应用程序调用一个外部函数函数名与参数

结构化输出关注“模型返回什么格式”;Function Call 关注“模型希望应用程序做什么”。

三、Function Call 的基本原理 ​

一次典型的 Function Call 包含用户、模型、工具定义、应用程序和工具结果五个部分。完整过程如下:

text
用户问题
  -> 应用程序把问题和函数定义发送给模型
  -> 模型返回普通回答,或返回 Function Call 请求
  -> 应用程序执行对应函数
  -> 应用程序把函数结果发送回模型
  -> 模型生成最终回答

用伪代码表示:

text
response = model.chat(userMessage, functionDefinitions)

if response.containsFunctionCall():
    call = response.functionCall()
    result = application.execute(call.name, call.arguments)
    finalResponse = model.chat(userMessage, call, result)
else:
    finalResponse = response

第二次模型调用很关键:模型需要看到函数执行结果,才能把机器数据转换成自然语言,或者判断是否还需要继续调用其他函数。

四、如何定义一个好的 Function Call ​

1. 函数名称表达清楚的动作 ​

名称应简短、稳定、具有明确语义,例如 get_order_status、search_documents、create_calendar_event。不建议使用 handle_data、do_action 这类无法体现用途的名称,也不建议把多个无关动作包装成一个万能函数。

2. 函数描述说明使用场景 ​

描述应回答“这个函数能做什么”和“什么情况下应该使用它”。例如:

根据订单号查询订单当前状态。当用户询问订单进度时使用;不能用于修改或取消订单。

清晰的描述有助于模型在多个函数之间做出正确选择。

3. 参数定义具体明确 ​

每个参数都应写明名称、类型、用途以及是否必填。能使用枚举、数字范围或固定格式时,应明确写出来。

json
{
  "name": "get_weather",
  "description": "查询指定城市当前天气",
  "parameters": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": "城市名称,例如 Shanghai"
      },
      "unit": {
        "type": "string",
        "enum": ["celsius", "fahrenheit"],
        "description": "温度单位"
      }
    },
    "required": ["city"]
  }
}

4. 返回结果适合模型继续处理 ​

函数返回值应包含完成回答所需的信息,并尽量保持稳定、简洁和结构化。模型需要的是“当前天气、温度和天气描述”,而不是底层接口返回的大量无关字段。

五、总结 ​

Function Call 是 Agent 连接大模型与外部世界的基础机制。它把一次任务拆成两个边界清晰的部分:模型负责理解需求和选择函数,应用程序负责执行函数并返回结果。

可以把 Function Call 看作三件事的组合:一组供模型理解的函数定义;一次结构化的函数调用请求;一轮带函数结果的后续模型对话。函数名称、描述和参数定义越清晰,模型就越容易正确选择工具,Agent 也就具备了从“生成答案”走向“完成任务”的基础。

六、参考资料 ​

  • OpenAI Platform Documentation:Function Calling / Tools
  • Anthropic Documentation:Tool Use
  • Spring AI Reference:Tool Calling
  • LangChain4j Documentation:Tools