Function Calling是大模型连接外部世界的通道,目前出现的插件(Plugins )、OpenAI的Actions、各个大模型平台中出现的tools工具集,其实都是Function Calling的范畴。时下大火的OpenAI的GPTs,原理就是使用了Function Calling,例如联网检索、code interpreter。
本文带大家了解下Function calling,看它是如何让大模型能与外部世界连接的。
0. 接口形式
写过程序的人可能都懂接口是什么,这里再简述一下接口的形式。
-
目前常见的接口形式:
- 命令行(Command Line Interface),简称 CLI(DOS、Unix/Linux shell, Windows Power Shell)
- 图形界面(Graphical User Interface),简称 GUI(Windows、MacOS、iOS、Android)
-
AI时代的接口形式:用户通过自然语言与软件或系统交互,不用再点击按钮,按标准流程操作软件
- 语言界面(Conversational User Interface),简称 CUI,或 Natural-Language User Interface,简称 LUI
-
未来的接口形式:
- 脑机接口(Brain–Computer Interface),简称 BCI
以前的接口调用,我们需要给定明确的接口名称和精确的参数。大模型时代的接口调用,我们只需要给出自然语言任务,大模型自动解析出参数和调用哪个接口。
1. Function Calling在AI大模型应用中的位置 - 架构
没有Function Calling的架构:

加入Function calling之后的架构:

2. 大模型为什么需要连接外部世界
其实大模型也不是万能的,它有三大缺陷:
- 训练数据不可能涵盖所有信息。垂直、非公开数据必有欠缺。
- 不知道最新信息。大模型的训练周期很长,且更新一次耗资巨大。所以它不可能实时训练。GPT-3.5 的知识截至 2022 年 1 月,GPT-4 是 2023 年 4 月。
- 没有「真逻辑」。它表现出的逻辑、推理,是训练文本的统计规律,而不是真正的逻辑。也就是说,它的结果都是有一定不确定性的,这对于需要精确和确定结果的领域,如数学等,是灾难性的,基本是不可用的。
比如算加法:
- 把 100 以内所有加法算式都训练给大模型,它就能回答 100 以内的加法算式
- 如果问它更大数字的加法,就不一定对了 因为它并不懂「加法」,只是记住了 100 以内的加法算式的统计规律
所以:大模型需要连接真实世界,并对接真逻辑系统,以此来控制大模型输出的不确定性和幻觉,达到我们想要的结果。
3. 实战
3.1 调用本地函数
3.1.1 定义一个自定义的本地函数,也可以是现有的库中的函数
以Python内置的sum函数为例,假设我们想让大模型使用这个函数。
sum函数介绍,接收一个列表、元组或集合:

3.1.2 告诉大模型这个函数的存在
python
复制代码
def get_completion(messages, model="gpt-3.5-turbo-1106"):
response = openai.chat.completions.create(
model=model,
messages=messages,
temperature=0,
max_tokens=1024,
tools=[
{ # 用 JSON 描述函数。可以定义多个。由大模型决定调用谁
"type": "function",
"function": {
"name": "sum",
"description": "计算一组数的和",
"parameters": {
"type": "object",
"properties": {
"numbers": {
"type": "array",
"items": {
"type": "number"
}
}
}
}
}
},
]
)
return response.choices[0].message
代码解释:
- 还是我们熟悉的
openai.chat.completions.create接口,这次我们需要使用的是tools参数 - 将本地的函数用json描述,添加到
tools参数中
注意:Function Calling 中的函数与参数的描述
description也是一种 Prompt。这种 Prompt 也需要调优,否则会影响函数的召回、参数的准确性,甚至让 GPT 产生幻觉
3.1.3 给一个需要使用该函数的Prompt
我们用自然语言给一个做加法的需求:
python
复制代码
prompt = "桌上有 2 个苹果,四个桃子和 3 本书,一共有几个水果?"
messages = [
{"role": "system", "content": "你是一个数学家,你可以计算任何算式。"},
{"role":

最低0.47元/天 解锁文章
4422

被折叠的 条评论
为什么被折叠?



