前语

就在前几天,OpenAI发布了6月重磅更新:

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新
总结来说就是:

  • 增加了函数调用功用
  • 增加了对话上下文长度,增加了16k版别的gpt-3.5-turbo模型(之前是4k,做过连续对话的都知道,4k根本不够用啊!!)
  • 降低了API的调用价格(gpt-3.5-turbo普通版别输入token价格直接85折大甩卖)

这每一条都相当迸裂呀,真是又便宜又好用,简直越用越爽

当然最爽最迸裂的要数函数调用了,可操作性直接拉满。就这么说吧,之前的GPT假如是一匹千里马,现在更新之后就是一匹插上天使翅膀的千里马。

爽在哪?

咱们用过ChatGPT的都知道,GPT这种通用大言语模型,都是依据巨大知识库训练而来,这种方法也就意味着时效性不好,最新的GPT4模型,知识库版别也是2021年9月之前的,你想让它告诉你最新的一些信息,那是不阔能滴

比方咱们想知道实时气候

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新
又比方咱们想知道实时新闻

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新
这些ChatGPT都会告诉你它搞不定

巴特!有了函数功用,咱们的GPT就能够变成这样↓↓↓↓

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新

甚至这样

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新

这样是不是一下就有了很大的幻想空间了!

这样一来,咱们在使用它强大的自然言语才能交互的一同,又兼具了时效性,咱们能够将咱们的最新数据交由ChatGPT来生成新的成果,简直泰裤辣

怎样爽?

1.看文档

看到这儿,有些好奇的小伙伴就要问了,这东西这么凶猛,到底怎样用呢?官方是这样说的:

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新
翻译过来就是这样的

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新
我这儿也大约给小伙伴们画了一个图,协助咱们理解

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新
到这儿,老铁们是否现已理解了函数调用的用法了呢?不理解也没关系,咱们接着往下看

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
}

到这儿,用户的问题假如命中了咱们的热搜函数,那么他就能够获取到实时热搜数据了

什么?ChatGPT通网了?ChatGPT带来function_calling等重磅更新

总结

相较于之前版别的GPT,0613版模型经过函数才能的加持,能够协助咱们愈加灵活的获取数据,也给咱们带来了更大的幻想空间。咱们能够利用这个功用,来构建更具有时效性的AI应用。

此外,咱们的应用鸿沟也将变得愈加容易确认,比方没有命中函数的问题,咱们则判定为业务无关问题,从而避免GPT侃侃而谈