2054 字
约 6 分钟
4
工具插件的定义和 Function Calling 是一回事吗?

工具插件的定义和 Function Calling 是一回事吗?

在做 AI Agent 或工作流系统时,经常会遇到一个问题:

我们平台里的“工具插件”,和大模型里的 Function Calling,是不是一回事?

答案是:

像,但不完全一样。

更准确地说:

Function Calling 更像是一种“模型调用工具的协议”;
工具插件更像是一套“工具注册、管理、鉴权、执行、返回结果”的完整工程封装。

一、Function Calling 解决什么问题?

大模型本身不会真正查数据库、调接口、发邮件、查订单。

它能做的是:根据用户意图,判断应该调用哪个函数,并生成这个函数需要的参数。

比如用户问:

帮我查一下订单 12345 的物流状态

模型可能不会直接回答,而是生成一次函数调用:

{
  "name": "query_order_status",
  "arguments": {
    "orderId": "12345"
  }
}

这里模型做了两件事:

1. 判断要调用 query_order_status
2. 把用户话里的订单号提取成参数

但注意,模型并不会真的执行这个函数

真正的函数调用,还是由我们的后端代码完成。

OpenAI 的工具调用机制里,开发者可以通过 tools 字段把工具提供给模型,模型再根据上下文选择是否调用工具;工具类型里既包括内置工具,也包括开发者自己定义的 Function Calling / custom tools。(OpenAI Developers )


二、Function Calling 的定义长什么样?

一个函数工具通常会定义这些东西:

工具名称:name
工具说明:description
参数结构:parameters
参数校验:strict / schema

例如:

{
  "type": "function",
  "function": {
    "name": "query_order_status",
    "description": "根据订单号查询物流状态",
    "parameters": {
      "type": "object",
      "properties": {
        "orderId": {
          "type": "string",
          "description": "订单号"
        }
      },
      "required": ["orderId"]
    }
  }
}

这段定义的作用不是给人看的,而是给模型看的。

模型会根据 namedescription 判断什么时候该用这个工具,再根据 parameters 生成符合结构的参数。OpenAI API 文档中,函数工具包含 namedescriptionparameters 等字段,参数通常用 JSON Schema 描述。(OpenAI Platform )


三、那工具插件又是什么?

工具插件可以理解成 Function Calling 的“工程化升级版”。

Function Calling 只描述:

这个函数叫什么?
它是干什么的?
它需要哪些参数?

而工具插件通常还要描述:

这个工具属于哪个插件?
插件怎么安装?
是否需要鉴权?
调用哪个 HTTP 接口?
参数怎么转换?
返回值怎么解析?
失败了怎么重试?
权限怎么控制?
日志怎么记录?

所以工具插件不是单纯的函数定义,而是一套完整的工具运行机制。

比如一个“订单插件”里,可能有多个工具:

query_order_status:查询订单状态
cancel_order:取消订单
refund_order:申请退款

这些工具都可以用类似 Function Calling 的方式暴露给模型,但插件本身还负责工具分组、配置、鉴权和执行。


四、两者哪里一致?

在“模型可理解的工具描述层”,它们是高度一致的。

不管你叫它工具插件,还是 Function Calling,最终都要告诉模型三件事:

1. 工具叫什么
2. 工具能干什么
3. 调用工具需要什么参数

也就是说,插件里的每个工具,最后通常都会被转换成类似 Function Calling 的结构。

例如平台内部可能有一个插件定义:

{
  "pluginName": "order_plugin",
  "tools": [
    {
      "name": "query_order_status",
      "description": "查询订单物流状态",
      "inputSchema": {
        "orderId": "string"
      }
    }
  ]
}

真正交给模型时,会适配成:

{
  "type": "function",
  "function": {
    "name": "query_order_status",
    "description": "查询订单物流状态",
    "parameters": {
      "type": "object",
      "properties": {
        "orderId": {
          "type": "string"
        }
      },
      "required": ["orderId"]
    }
  }
}

所以可以这样理解:

插件定义是平台内部的工具配置;
Function Calling 是模型侧能理解的工具调用格式。

五、两者哪里不一样?

最大的区别在于:Function Calling 偏协议,工具插件偏工程。

Function Calling 主要解决模型和函数之间的“调用格式”问题。

工具插件解决的是一个工具从注册到执行的完整生命周期问题。

比如 Function Calling 只会告诉你:

模型想调用 query_order_status,参数是 orderId=12345。

但工具插件系统还要继续处理:

这个工具是否启用?
当前用户有没有权限?
接口 token 有没有过期?
参数要不要转换?
调用失败要不要重试?
返回结果怎么标准化?
执行日志怎么落库?
结果怎么交还给模型?

所以,Function Calling 是工具调用链路中的一环,不是整个工具系统。


六、可以用一个比喻理解

Function Calling 像一张“点菜单”。

菜单上写着:

菜名:查询订单
说明:根据订单号查询物流
参数:订单号

模型看到菜单后,决定点哪道菜,并把参数写清楚。

但工具插件更像一个“餐厅后厨系统”。

它不仅有菜单,还包括:

厨师是谁
食材从哪里来
厨房怎么排队
做错了怎么补救
谁有权限点这道菜
做完之后怎么上菜

所以它们关系是:

Function Calling 是点菜格式;
工具插件是从点菜到上菜的完整系统。

七、在 Agent 系统里通常怎么落地?

一般会分成三层。

第一层:插件注册层。

负责加载插件配置,比如插件名称、工具列表、鉴权方式、接口地址。

第二层:工具适配层。

把插件里的工具定义转换成模型能理解的 Function Calling schema。

第三层:工具执行层。

当模型返回 tool call 后,系统根据工具名找到对应插件,再执行真实逻辑,把结果返回给模型。

整体流程是:

插件配置
   ↓
转换成 Function Calling schema
   ↓
传给大模型
   ↓
模型选择工具并生成参数
   ↓
后端执行真实工具
   ↓
工具结果写回上下文
   ↓
模型基于结果生成最终回答

OpenAI 文档也建议开发者通过 API 的 tools 字段传递工具定义,而不是把工具说明硬塞进 prompt 再自己解析,这样更稳定。(OpenAI Developers )


八、总结

工具插件的定义和 Function Calling 不是完全一样,但它们在工具描述层是相通的。

可以一句话总结:

Function Calling 定义的是“模型怎么调用一个函数”;
工具插件定义的是“平台怎么管理和执行一组工具”。

再进一步说:

Function Calling 是模型侧协议;
工具插件是工程侧封装;
插件里的每个工具,最终通常会被适配成 Function Calling schema 暴露给模型。

所以,当我们设计 AI Agent 的工具系统时,不应该只看 Function Calling。

Function Calling 只能解决“模型会不会正确生成调用参数”的问题。

真正要把工具用起来,还需要插件系统负责:

注册
鉴权
路由
执行
重试
日志
权限
结果标准化

最终,工具插件和 Function Calling 的关系可以概括成:

插件负责把工具管起来;
Function Calling 负责让模型会调用;
执行器负责把调用真正跑起来。

这就是 AI Agent 工具系统最核心的设计思路。

工具插件的定义和 Function Calling 是一回事吗?
http://clxhxhhr.top/posts/592/
作者
clxstart
发布于
2026-09-13
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。