6月13日OpenAI在Chat Completions API中添加了新的函数调用(Function Calling)能力,帮助开发者通过API方式实现类似于ChatGPT插件的数据交互能力。
本文在作者上一篇文章《私有框架代码生成实践》的基础上,依旧使用自然语言低代码搭建场景作为案例,将嵌入向量搜索(Embedding)获取私有知识库的方式,替换为函数调用方式,以我们更熟悉的结构化数据结构、关系型数据库的方式进行知识库管理。同时函数调用能力的灵活性和可扩展性,也可以帮助用户使用自然语言搭建更加复杂的页面内容、进行更丰富的交互操作。
一、 什么是函数调用
函数调用(Function Calling)是OpenAI在6月13日发布的新能力。根据官方博客描述,函数调用能力可以让模型输出一个请求调用函数的消息,其中包含所需调用的函数信息、以及调用函数时所携带的参数信息。这是一种将GPT能力与外部工具/API连接起来的新方式。
支持函数调用的新模型,可以根据用户的输入自行判断何时需要调用哪些函数,并且可以根据目标函数的描述生成符合要求的请求参数。
开发人员可以使用函数调用能力,通过GPT实现:
- 在进行自然语言交流时,通过调用外部工具回答问题(类似于ChatGPT插件);
- 将自然语言转换为调用API时使用的参数,或者查询数据库时使用的条件;
- 从文本中提取结构化数据。等
二、 如何使用函数调用
函数调用能力可以通过聊天API(Chat Completion)使用。为了实现函数调用能力,OpenAI对聊天API进行了修改,增加了新的请求参数、响应类型以及消息角色,应用开发者需要:
- 在请求参数中向聊天API传递信息,描述应用所提供的可调用函数的信息。
- 解析聊天API响应的消息类型,若模型决定需要调用函数,则根据模型返回的函数信息和函数传参调用函数,并获得返回结果。
- 将函数返回的结果添加到消息列表中,并再次调用聊天API。
1. 添加请求参数, 描述所支持的函数信息
聊天API中新增了两个请求体参数:
functions
当前应用可调用的函数的列表。函数信息中包含了函数的名称、自然语言描述、以及函数所支持传入的参数信息。
functions
参数的格式如下:
openai.createChatCompletion({
model: "gpt-3.5-turbo-0613",
messages: [
// ...
],
functions: [
{
name: 'function_name',
description: '该函数所具备能力的自然语言描述',
parameters: {
type: 'object',
properties: {
argument_name: {
type: 'string',
description: '该参数的自然语言描述'
},
// ...
},
required: ['argument_name']
}
},
// ...
]
})
functions
参数支持以数组形式录入多组函数信息,其中:
-
name
:函数名称。后续模型会在需要调用函数时返回此名称。 -
description
:函数功能描述。模型通过该描述理解函数能力,并判断是否需要调用该函数。 -
parameters.properties
:函数所需的参数。以对象的形式描述函数所需的参数,其中对象的key即为参数名。type
:参数类型。支持JSON Schema协议。description
:参数描述。
-
required
:必填参数的参数名列表。
function_call
控制模型应该如何响应函数调换。支持几种输入:
"none"
:模型不调用函数,直接返回内容。没有提供可调用函数时的默认值。"auto"
:模型根据用户输入自行决定是否调用函数以及调用哪个函数。提供可调用函数时的默认值。{"name": "function_name"}
:强制模型调用指定的函数。
2. 识别响应参数, 描述需要调用的函数信息
聊天API在响应内容的可选项(choices
)中提供了两个响应参数:
finish_reason
响应内容结束的原因。
可能的原因包括:
stop
:已返回完整消息。length
:已达到令牌限制或由max_tokens
参数设置的上限。functi