首页 > 教程攻略 > ai资讯 >大语言模型能力的放大器:Function Call

大语言模型能力的放大器:Function Call

来源:互联网 时间:2026-08-01 14:11:20

一、什么是Function Call

大语言模型能力的放大器:Function Call

我们可以提前设置好并描述清楚函数。当用户和大模型对话时,如果用户的意图和函数的描述对得上,大模型就会智能地选择一个包含参数的JSON对象作为输出,用来调用一个或多个函数。需要特别说明的是:大模型本身不会主动去调用函数,它只是生成一个带参数的JSON对象,我们可以在合适的时机,用这个对象在代码里真正去调用函数。

二、Function Call的作用

大模型的训练数据是有时间期限的,它没法联网,也不知道最近发生了什么事。所以当用户问到它不了解的数据信息时,就可以通过后台的函数调用,拿到后台返回的结果,再交给大模型来回复。

三、Function Call的流程

具体流程可以用下面这个例子来理解:

  1. 用户问大语言模型:斯德哥尔摩今天在下雨吗?

  2. 大模型检测到用户的意图,和后台API库中提供的某个功能函数服务匹配上了,于是通知后台:你可以用这个功能函数(比如我们叫它“天气函数”)去查询,同时把这个函数需要的参数,以JSON格式给到后台。

  3. 后台调用天气函数,把函数返回的结果再交给大模型。

  4. 大模型根据用户的提问和函数返回的结果,给出最终回复。

四、大模型如何知道何时使用函数?

来看这个函数例子:

这个函数的名字叫 get_current_weather。除了名字字段,下面还有一个描述字段:“给定一个地点,拿到目前的天气情况”。这个描述非常关键——大模型在和用户对话时,就是通过这个描述去匹配用户的意图,从而选出对应的函数。如果函数的描述写得不清楚,大模型就没法准确匹配到用户的意图。所以逻辑就很清晰了:大模型通过函数的描述,来判断是否匹配用户的意图。

这个函数最底部还有一个 function_call 字段。当它的值是 auto 时,遵循的就是上面说的调用逻辑。除此之外,还有两个可选值:

  • insert-function-name:当判断用户意图符合函数描述时,不管大模型自己有没有能力回答,都调用这个函数(这里需要填入具体的函数名称)。

  • none:无论什么情况,都不调用这个函数。

五、如何知道使用函数需要哪些信息

还是看这个代码示例。里面有一个 parameters 字段,这个字段下面又有一个 properties 字段,里面就是函数需要的参数信息。这个例子里只有一个参数,叫 location(地点)。这个参数下面还有两个子字段,其中一个是 description,描述的就是 location 这个参数具体是什么意思。

这样一来就很清楚了:大模型通过函数里参数的描述,来判断调用这个函数需要什么信息。所以当它告诉后台该用哪个函数时,也会把用户提供的信息,转化成函数需要的参数值,以JSON格式返回给后台。后台拿着这些参数,直接调用函数就能拿到结果。

另外,还有一个 required 字段,这个字段告诉大模型哪些参数是必填的。如果用户提供的信息,加上大模型自己掌握的信息,填不满必填字段——那大模型就不会去调用这个函数。

六、连续Function Call的场景

假设用户问:“斯德哥尔摩比巴黎的天气更阳光吗?”

这时候你会发现,只查询一次函数,是得不到最终结果的。那怎么处理呢?实际需要建立一个和大语言模型对话的循环:先调用天气函数查询斯德哥尔摩的天气,把结果告诉大模型;再调用天气函数查询巴黎的天气,再把结果告诉大模型。最终大模型结合这些信息,给出完整的回答。

那么问题来了:遇到这种需要多次调用函数的情况,我们怎么知道什么时候不需要再调用了?

OpenAI的官方文档里有明确的说明:GPT的每个回复都会带一个 finish_reason 字段。当这个字段的值是 stop 时,就意味着最终结果已经生成完毕了。

再延伸一点:如果可以多次调用函数,能做更多事情。比如:“帮我把今天北京的天气编成一首七言绝句诗,同时把这首诗转成text格式,保存到本地我的文档里。”这是连续Function Call的另一种场景——同一个任务下调用不同的函数。只要函数功能是现成的,和多次重复调用同一个函数的逻辑没什么区别。顺着这个思路想下去,是不是可以发散出很多应用场景?

七、Function Call的更多应用

如果要求大模型“列举出欧洲最大的三个城市主要说什么语言,同时让大模型以JSON格式输出”,一般会怎么处理?当然可以直接用Prompt让大模型给结果,但有时候它会输出这样的内容:

这显然不是我们想要的。换个思路:如果我们可以定义一个想要的输出结果的函数,利用Function Call的能力,最终输出我们想要的结果,是不是更好?函数可以这样定义:

最终生成的结果如下:

这个例子很好地达到了预期,也给我们更多启发。对于更多的任务,利用Function Call的能力来实现,确实充满想象空间。