1、前言
大致有两个月没有更新什么文章了,一方面在研究一点别的东西,另一方面在跟朋友一起合作一个有想法的小项目,目前来看效果还差点意思。但是其中也学习到了非常多的知识吧。
开始的一段时间,如果你想通过ChatGPT 的API来定制化一些工作,可能要反复的调整prompt,来使ChatGPT API接口能够返回json结构化的数据。但有时候可能又会存在一些问题。
或者通过直接对返回的长字符串进行正则匹配的模式来处理,但是这种方式也是非常的糟糕,而且有一些情况下也是正则无法处理的,而且我对正则的了解仅仅限于拿来就用。
盼星星,盼月亮,OpenAI 团队终于在6月14日左右的时候,通过函数调用的方式支持了结构化的输出JSON。这样有了结构化的数据,就可以很方便的与自定义函数和业务逻辑进行整合处理。
开发者现在可以描述函数给 gpt-4-0613 和 gpt-3.5-turbo-0613两个模型,并使模型智能地选择输出一个包含调用这些函数的参数的 JSON 对象。这样就可以将 GPT 的功能与外部工具和 API 很丝滑的就联结起来了。
我没记错的话可能就是6月14日左右,当时发布函数调用后,我就用golang语言写了一个版本的demo吧,由于最近也在项目中使用到了函数调用,所以在此使用nodejs 来做一个记录。
2、实例
通过官网的ChatGPT 先来查看效果。
ChatGPT PLUS GPT-4返回
这里我还是使用GPT-4 的模型返回的数据,但是在让他处理结构化的数据整个的返回确实是没什么问题的。但是返回给我的总包含一些无效的信息,不能直接使用,当然是可以通过正则匹配进行处理的。下面我用GPT-3.5再来试试看看效果。
ChatGPT GPT-3.5返回
效果上GPT-3.5的跟GPT-4的效果是类似的。
通过ChatGPT api 3.5普通接口返回的
效果上通过普通API GPT-3.5 跟使用官网 GPT-3.5 GPT-4的效果是类似的。
通过ChatGPT api 3.5 函数调用接口返回的
通过截图可以发现,我可以直接通过arguments中的参数获取到转换后的数据
movieTitle:"复仇者联盟:无限战争",
releaseDate: "2018年4月27日",
director: "安东尼·罗素,乔·罗素"
这样我就可以直接将这三个字段 跟我原有的系统进行对接就可以了,在ChatGPT 与其他系统的对接上方便性简直达到了逆天的地步。
3、函数调用实现过程
platform.openai.com/docs/api-re… 可以点击ChatGPT官网进行查看接口文档进行学习使用。
platform.openai.com/docs/guides… 关于函数调用的这里有一个官网的样例。
其实主要是下面两个参数的解析
function_call参数:
控制模型如何响应函数调用。“none”表示模型不调用函数,并响应最终用户。“auto”表示模型可以在最终用户或调用函数之间进行选择。如果通过指定functions中的 {"name": "my_function"}
特定函数会强制模型调用该函数。“none”是不存在函数时的默认值。如果存在函数,则“auto”是默认值。
所以通常情况下,function_call参数可以完全不进行设置,将控制权完全交给functions。
而functions参数中最重要的便是parameters的描述。其实也就是对ChatGPT 返回给我们的JSON结构的描述。
json-schema.org/understandi… 这里可以学习到如何去描述JSON架构。
以下便是我上面示例的JSON架构描述
parameters: {
type: "object",
properties: {
movieTitle: {
type: "string",
description: "Movie Title",
},
releaseDate: {
type: "string",
description: "Release Date",
},
director: {
type: "string",
description: "Director",
}
},
required: ["movieTitle", "releaseDate", "director"],
}
至于其他的使用细节可以查看我上面的链接去学习就好了。
4、demo全部代码
const configuration = new Configuration({
apiKey: process.env.OPENAIKEY,
basePath: process.env.OPENAI_BASE_URL
});
const { content } = req.body as {
content: string
}
let systemPrompt =`请帮我查找一部2018年到2020年之间 美国比较优秀的电影信息,包括电影名称、上市时间、导演,并使用中文来回复信息`
console.log(content , 'name -naem')
if(content) {
systemPrompt = content
}
const chatApi = new OpenAIApi(configuration);
const chatCompletion = await chatApi.createChatCompletion({
model: 'gpt-3.5-turbo-16k',
temperature: 0,
messages: [{ role: 'user', content: `${systemPrompt}` }],
functions: [
{
name: "write_moivesinfo_to_database",
description: "Write movies into the database.",
parameters: {
type: "object",
properties: {
movieTitle: {
type: "string",
description: "Movie Title",
},
releaseDate: {
type: "string",
description: "Release Date",
},
director: {
type: "string",
description: "Director",
}
},
required: ["movieTitle", "releaseDate", "director"],
}
}
],
});
console.log(chatCompletion.data.choices[0], 'chatCompletion')
执行结果如下图所示
再来看一个返回列表数据的
5、总结
- 就在今天,7月22日,我的PLUS限制策略官网终于调整了
- 今天一大早也看到OpenAI 官网发布了消息,很快android版的app也安排上了
ios的app大致是在2个月前发布的
- 然后就在昨天7月21日OpenAI 给PLUS用户也提供了类似设置Prompt的地方
效果还是非常棒的,希望能加一个列表功能,让我选,因为有一些是常用的设置,以前都是每次输入都找一个地方进行拷贝
- 再早几天,7月7日的时候,官网面向付费用户对GPT-4 API 全部开放
- 同时,7月7日左右 code interpreter 针对Plus用户执行
如何编写和执行python代码并且可以处理文件上传的ChatGPT版本。尝试寻求数据分析、图像转换或编辑代码文件的帮助。注意:文件不会保留超过单个会话。
这仅仅是我尝试的一个小功能
-
之前也发布了 联网插件,但是由于安全问题,目前已经下线了,后续可能还会上线
-
再早一点的时候终于针对 GPT-3.5和GPT-4的传输数据的大小,又做了很大的提升
- GPT-3.5的API可以达到16K的tokens
- GPT-4.0的API可以达到32K的tokens
最近两个月的更新大致就是这样的了,自己对自己做一个总结,方便回顾一下历史。当然这里还有一个问题也提一下,可能很多时候由于安全以及法律的限制,openai最近几个月的版本回复正确率可能明显或者很多人都有感觉质量下降,这应该不可避免吧,毕竟功能越强大,面临的利弊得失就会越多,相信openai会越来越好,也能平衡好质量的把控,当然最后还是更加期待多模态新功能的发布吧。
最近几个月百模大战也如火如荼,越来越多的公司加入了这个赛道,期待ai更高质量的发展,也期待国内大模型真正的提高效果和质量吧。