今天 OpenAI 的更新,再聊下技术细节,这些细节绝对值得你给我送个赞赏。
1、chat 接口的 messages 数组有个 role 参数,在原先 system、user、assisant的基础上新增了 function 角色。
2、模型返回的 message 中新增了 function_call 参数,这个只在 role 为 assisant 时会有返回,用途是告诉开发者,当前的模型返回要调用哪个函数,参数有哪些。
我们调用接口时,需要在 messages 中原样放进去。这里不太理解没关系,继续看完3和4你就明白了。
3、chat 接口新增 functions 参数,是数组格式,允许你传入一组函数定义,由模型来智能选择该用哪个函数。
注意,即使用 16k 版本,上下文长度也是有限的,你不可能把所有的函数定义都传进来。
所以需要在调用这个接口之前,先分析意图,找出最可能符合本次用户问题需求的函数。
这里就很考验大家的处理思路了,我建议用上嵌入,毕竟嵌入是最懂语义化的。
4、每一个 function 支持三个参数,name 指定函数名称,description 指定函数功能说明,parameters 指定函数想要模型输出的格式化数据格式。
5、请注意,chat 接口本身也新增了 function_call 参数,默认值为 none ,可以设置为 auto 。
回看第2点,messages 数组里也有一个 function_call ,message 中也有一个 function_call ,请注意区分这三个。
6、chat 接口中与 messages 平级的 function_call 用于指定模型是否启用函数式回答,如果传入的是 none 那么,就不需要传入 functions 参数,也就是跟今天之前的调用是一样的。
如果传入的是 auto ,那么你需要传入 functions 参数,给出一些函数,让模型去智能选择该用哪个函数。
而只有当 function_call 传入 auto 且 functions 传入了函数数组,且模型觉得需要用函数返回时,返回的message中才会有 function_call,我们就需要在自己的程序中去根据模型指示,调用合适的函数处理。
7、我们自己的函数处理完成后,需要把函数的输出再次传给模型,让模型用自然语言回复。
这个时候,请求时的 messages 中 role 为 assisant 中那条message 就需要增加 function_call,其实就是把模型上一次返回的数据原样放进去。
然后在 messages 中还需要增加一条 role 为 function 的数据,把我们本地函数执行完的结果告诉模型。
注意,此时因为你已经很明确的知道调用了哪个本地函数,所以 functions 数组,就必要把所有可能函数定义放进去了,只需要放当前使用到的那个函数定义,也就是 functions 数组长度为 1,这样可以节省 token 。
好了,请点击本条动态,给我送个赞赏吧。
如有不懂的请加我微信 qiayue 交流。