Function Calling 函数调用也叫 Tools 工具,它本质上就是在AI应用中自定义实现一些方法(函数),然后交给大模型,由大模型自行判断在合适的时机调用这些方法,从而实现原来大模型无法做到的一些扩展功能,比如操作本地数据库等等。其流程如下
- 当用户把问题发送给AI应用,在AI应用的内部需要组织提交给大模型的数据,而这些数据中需要描述清楚我们的AI应用中有哪些函数能够被大模型调用。每一个函数的描述都包含三个部分,方法名称、方法作用、方法入参
- 当AI应用把这些数据发送给大模型后,大模型会先根据用户的问题以及上下文拆解任务,从而判断是否需要调用函数,如果有函数需要调用,则把需要调用的函数的名称,以及调用时需要使用的参数准备好一并响应给AI应用
- 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
举一个具体的例子,用户提问天气,大模型利用Function Calling能力调用外部工具查询天气并返回结果
流程解释如下:
-
用户通过自然语言提出问题,例如:“广州今天天气如何?适合出门吗?”
-
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"] } } ] } -
模型会智能判断是否需要调用函数,选择合适的函数,并基于上下文自动生成结构化的调用指令(函数名 + 参数),例如:
{ "function_call": { "name": "getWeather", "arguments": { "location": "Guangzhou", "date": "2025-07-17" } } } -
AI应用程序接收到模型返回的调用指令后,解析调用指令,得到函数名称和参数,执行对应的方法(如调用天气查询函数),并获取结果
-
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 中加入大量说明与规则