沉默了一段时间,最近都在研究AI大模型的产品落地应用,我觉得这个function calling出来后,对目前辅助办公有革命性的改变,可以它来做什么呢?我们先来调试看看,chatgpt和文心大模型的ERNIE Bot支持这个,chatgpt申请有一定门槛,先以文心的为例,账号的access_token申请我就不说了,直接去飞桨飞桨AI Studio星河社区-人工智能学习与实训注册申请。安装那些自己直接看官方文档,上代码:
#coding:utf-8
import erniebot,json
#记载模型
models = erniebot.Model.list()
#参数
erniebot.api_type = "aistudio"
erniebot.access_token = "你的token码"
messages = [
{
'role': 'user',
'content': "搜索用户李大锤的信息",
},
]
functions = [
{
'name': 'get_current_temperature',
'description': "获取指定城市的气温",
'parameters': {
'type': 'object',
'properties': {
'location': {
'type': 'string',
'description': "城市名称",
},
'time': {
'type': 'string',
'description': "时间",
},
'unit': {
'type': 'string',
'enum': [
'摄氏度',
'华氏度',
],
},
},
'required': [
'location',
'time',
'unit',
],
},
'responses': {
'type': 'object',
'properties': {
'temperature': {
'type': 'integer',
'description': "城市气温",
},
'time': {
'type': 'string',
'description': "时间",
},
'unit': {
'type': 'string',
'enum': [
'摄氏度',
'华氏度',
],
},
},
},
},
{
'name': 'get_user_info',
'description': "获取用户信息",
'parameters': {
'type': 'object',
'properties': {
'username': {
'type': 'string',
'description': "用户名",
},
},
'required': [
'username',
],
},
'responses': {
'type': 'object',
'properties': {
'username': {
'type': 'string',
'description': "用户名",
},
'birthday': {
'type': 'string',
'description': "用户生日",
},
'hobby': {
'type': 'string',
'description': "用户爱好",
},
},
},
},
]
response = erniebot.ChatCompletion.create(
model='ernie-bot',
messages=messages,
functions=functions,
)
print("one:",response.get_result())
funcitons是一个数组,里面可以定义多组方法类的数据,上面我设置了2个方法,一个是查询天气的,一个是查询用户信息的,我们截取一个片段看看:
{
'name': 'get_user_info', #我们自己定义的函数名称
'description': "获取用户信息", #描述
'parameters': {
'type': 'object',
'properties': {
'username': {
'type': 'string',
'description': "用户名",
},
},
'required': [
'username',
],
},
'responses': {
'type': 'object',
'properties': {
'username': {
'type': 'string',
'description': "用户名",
},
'birthday': {
'type': 'string',
'description': "用户生日",
},
'hobby': {
'type': 'string',
'description': "用户爱好",
},
},
},
},
这格式是固定的,parameters就是设置的参数,可定义参数的名称,类型,描述,responses就是返回的结果参数,这里主要就是定义好方法类及参数,这是执行的调用写法:
response = erniebot.ChatCompletion.create(
model='ernie-bot',
messages=messages, #消息
functions=functions, #匹配函数
)
执行上面的代码会返回:
大模型会根据你的问题智能匹配是否符合函数的关键词(我估计可能也会存在一定的误差,整体测试还行),匹配上后会返回以上信息,get_user_info是你方法类的名称,arguments里面就是你定义的参数,它智能匹配到了用户名叫李大锤的。
接下来就可以根据返回的信息去调用本地对应的方法函数:
#获取天气
def get_current_temperature(location,time,unit):
#这里可以自定义执行方法,下面是演示返回结果
return {"location":location,"temperature": 36, "time": time, "unit": "℃"}
#获取用户信息
def get_user_info(username):
#这里可以自定义执行方法,下面是演示返回结果
return {"username": username, "birthday": "1998-08-08", "hobby": "踢球,打游戏,吃火锅"}
#如果匹配成功则执行下面代码
if response.is_function_response:
function_call = response.get_result()
name2function = {'get_current_temperature': get_current_temperature,'get_user_info': get_user_info}
func = name2function[function_call['name']]
func_name=function_call['name']
args = json.loads(function_call['arguments'])
res=""
#根据name判断调用本地那个方法类
if func_name=='get_current_temperature':
res = func(location=args['location'],time=args['time'],unit=args['unit'])
elif func_name=='get_user_info':
res = func(username=args['username'])
print("res:", res)
上面执行一下,看看结果
到这里基本上都走通了,开始的问题:搜索用户李大锤的信息,匹配后就执行了你的get_user_info的方法返回了结果。
通过以上思考,这样的话是不是可以在自己的公司产品或者项目开发一个辅助工具,更有效便捷的帮助用户摆脱一些繁琐复杂的操作流程,这个想象空间我感觉很大。
得到json后我们可以再次通过模型美化一下:
#再次通过Ai执行
messages.append(
{
"role": "assistant",
"content": None,
"function_call": function_call,
}
)
messages.append(
{
"role": "function",
"name": function_call["name"],
"content": json.dumps(res, ensure_ascii=False),
}
)
secendresponse = erniebot.ChatCompletion.create(
model='ernie-bot',
messages=messages,
functions=functions,
)
print(secendresponse.result)
来执行看看:
这功能还是挺强大的,它的原理简单的可以理解为关键词匹配,有点类似小爱,小度智能控制的赶脚,然后在加上模型本身的文案编写,图片生成等功能,真的可以让自己的产品得到一个飞一般的提升,然后在想象一下,把它结合到软件工具中,是不是可以智能化的执行系统的命令,智能回复及应答,搜索等等,我目前第一步就是先集成到公司的产品中去,好了,记录就先到这里。
如果有需要的源代码的同学,请关注“小白一起学编程”公众号回复:functioncalling 下载源码