前语
就在前几天,OpenAI发布了6月重磅更新:
总结来说就是:
- 增加了函数调用功用
- 增加了对话上下文长度,增加了16k版别的
gpt-3.5-turbo
模型(之前是4k,做过连续对话的都知道,4k根本不够用啊!!) - 降低了API的调用价格(
gpt-3.5-turbo
普通版别输入token价格直接85折大甩卖)
这每一条都相当迸裂呀,真是又便宜又好用,简直越用越爽
当然最爽最迸裂的要数函数调用了,可操作性直接拉满。就这么说吧,之前的GPT假如是一匹千里马,现在更新之后就是一匹插上天使翅膀的千里马。
爽在哪?
咱们用过ChatGPT的都知道,GPT这种通用大言语模型,都是依据巨大知识库训练而来,这种方法也就意味着时效性不好,最新的GPT4模型,知识库版别也是2021年9月之前的,你想让它告诉你最新的一些信息,那是不阔能滴
比方咱们想知道实时气候
又比方咱们想知道实时新闻
这些ChatGPT都会告诉你它搞不定
巴特!有了函数功用,咱们的GPT就能够变成这样↓↓↓↓
甚至这样
这样是不是一下就有了很大的幻想空间了!
这样一来,咱们在使用它强大的自然言语才能交互的一同,又兼具了时效性,咱们能够将咱们的最新数据交由ChatGPT来生成新的成果,简直泰裤辣
怎样爽?
1.看文档
看到这儿,有些好奇的小伙伴就要问了,这东西这么凶猛,到底怎样用呢?官方是这样说的:
翻译过来就是这样的
我这儿也大约给小伙伴们画了一个图,协助咱们理解
到这儿,老铁们是否现已理解了函数调用的用法了呢?不理解也没关系,咱们接着往下看
2.上代码
多说无益,现在咱们就按照上面的过程来完成:
- 第一步:依据GPT函数界说规范界说一组咱们的应用将会用到的函数,一同完成函数代码。函数能够依据业务需求而定:
// 函数界说
const fns = [
{
// 函数称号,对应的咱们要去完成一个名字叫getHotNews的函数
name: 'getHotNews',
// 函数描绘,就是大约告诉GPT你这个函数是干什么用的
description: '获得给定用户一切的github库房信息',
// 函数参数,就是咱们完成的这个函数需求接纳的参数描绘,类型是一个json目标,调用的时分GPT会给咱们回来一个参数json字符串
parameters: {
// 类型
type: 'object',
// 参数界说,key是参数名,value是描绘,是一个规范的json schema
properties: {
// 一个叫user的参数
user: { type: 'string' },
},
// 必填参数
required: ['user'],
},
},
...more
];
// 完成函数,这儿是调用微博热搜接口实时热搜数据
export async function getHotNews() {
const {
data: {
data: { realtime },
},
} = await axios.get(`https://weibo.com/ajax/side/hotSearch`);
return realtime.map((item) => ({
text: item.word,
rank: item.raw_hot,
}));
}
- 第二步:将用户问题以及函数界说一同发送给模型:
// 接口服务函数,接纳用户问题msg作为参数,比方这儿接纳的问题是:今天有什么热门
public async chat_with_fns(msg: string) {
// 组装用户音讯
const messages: ChatCompletionRequestMessage[] = [
{ role: 'user', content: msg },
];
const {
data: { choices },
} = await openai.createChatCompletion({
model: 'gpt-3.5-turbo-0613',
messages,
// 这儿就是咱们第一步界说的函数描绘fns
functions: fns,
function_call: 'auto',
});
}
- 第三步:调用GPT给咱们回来的函数(假如命中了咱们的某个函数,则能够从choices中拿到函数界说),并将调用成果再次发送给GPT模型:
// 接口服务函数,接纳用户问题msg作为参数
public async chat_with_fns(msg: string) {
...
const message = choices[0].message;
if (message.function_call && functions[message.function_call.name]) {
// GPT会给咱们回来一个function_call参数,包含函数的称号和参数json字符串
const { name, arguments: argStr } = message.function_call;
// 将参数值解析出来
const args = Object.values(JSON.parse(argStr));
// 调用函数
const fnCallRes = await functions[name](...args);
// 奖函数调用成果转成字符串,以function的角色发给GPT
const {
data: { choices },
} = await openai.createChatCompletion({
// 这儿要注意,只要0613模型支持函数调用
model: 'gpt-3.5-turbo-0613',
messages: [
// 用户音讯
{ role: 'user', content: msg },
// 函数调用成果,role是function,称号是函数称号,content则是咱们函数调用的成果字符串
{ role: 'function', name, content: JSON.stringify(fnCallRes) },
],
});
}
}
- 第四步:将成果回来给用户
// 接口服务函数,接纳用户问题msg作为参数
public async chat_with_fns(msg: string) {
...
if (message.function_call && functions[message.function_call.name]) {
...
return choices[0].message.content;
}
// 用户问题没有匹配上咱们的函数则将第一次调用GPT的成果回来给用户
return message.content
}
到这儿,用户的问题假如命中了咱们的热搜函数,那么他就能够获取到实时热搜数据了
总结
相较于之前版别的GPT,0613版模型经过函数才能的加持,能够协助咱们愈加灵活的获取数据,也给咱们带来了更大的幻想空间。咱们能够利用这个功用,来构建更具有时效性的AI应用。
此外,咱们的应用鸿沟也将变得愈加容易确认,比方没有命中函数的问题,咱们则判定为业务无关问题,从而避免GPT侃侃而谈