OpenAI近期发布了一项重大更新,这次的更新内容不禁让人瞠目结舌,具体更新内容可以看昨天的文章:OpenAI凌晨大更新,价格最高降75%、API函数调用上线、上下文长度提高4倍!今天主要详细讲一下聊天API中新增的函数调用功能,为应用层应用的开发所带来的巨大的影响。
1
基本概念流程
首先,我们要理解函数调用功能的基本概念。简单来说,这是一种让AI调用并执行特定任务的接口,类似于插件,可以为AI增加各种各样的功能。例如,你可以让AI通过函数调用查询数据库,或者从其他在线API获取信息。
这个功能的实现流程大致是这样的:
1. 用户提供一个问题和一组函数给ChatGPT,函数的名称、作用和参数必须明确。
2. ChatGPT判断是否需要调用提供的函数来解答问题,如果需要,会把问题转换成设置好参数的函数调用。
3. 用户根据ChatGPT给出的函数,自行运行函数,然后把函数运行的结果返回给ChatGPT。
4. ChatGPT根据前面的对话信息和函数的执行结果,生成最终的回答。
流程图如下:
看到这里你就会发现整个流程其实非常像一个only-one-job的HuggingGPT,只不过HuggingGPT是调用模型,这里是调用函数。
如果你自己搞一个函数的pipeline,其实就是langchain了。只不过langchain的结构是在函数里与ChatGPT对话来完成任务,而function call是在对话里调用函数,从体感上来说,还是function call更加丝滑一些,langchain哭晕在厕所。
如果再稍微设计一下prompt,让ChatGPT来自己决策完成任务需要使用哪些函数,其实就跟AutoGPT的原理差不多,用GPT驱动GPT。对此有兴趣的可以加入我的星球看AutoGPT的具体原理。
2
代码示例
我们知道普通的聊天机器人无法直接获取真实世界的信息,比如天气和当前时间。但如果使用了函数调用功能,ChatGPT就能通过函数获取这些信息。
说了这么多,我们直接上代码看看!!我们可以定义两个函数,一个用于获取天气,一个用于获取当前时间,示例代码如下。
这两个函数需要将描述和参数定义清楚,以方便ChatGPT理解。
help_functions = [
{
"name": "get_current_weather",
"description": """获取天气情况""",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": f"""获取天气情况的城市或者国家,比如北京、东京、新加坡""",
},
},
"required": ["location"],
}
},
{
"name": "get_local_time",
"description": """获取当地的时间""",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": f"""获取当地时间的城市或者国家,比如北京、东京、新加坡""",
},
},
"required": ["location"],
}
},
]
然后设置ChatGPT的角色,还有提问问题。
messages = []
messages.append({"role": "system", "content": "如果不知道函数中的具体参数,不要假设。如果知道或者参数为空,请询问用户具体的内容."})
messages.append({"role": "user", "content": "东京天气怎么样?"})
chat_response = chat_completion_request(
messages, functions=help_functions
)
assistant_message = chat_response.json()["choices"][0]["message"]
messages.append(assistant_message)
print(assistant_message)
此时,ChatGPT输出为:
{
'role': 'assistant',
'content': None,
'function_call': {
'name': 'get_current_weather',
'arguments': '{\n "location": "东京"\n}'
}
}
这个告诉我们,需要调用get_current_weather函数,参数为 "location": "东京"
我们定义如下的函数,调用并且返回结果。真实情况其实可以调用某个天气的API,也就是说ChatGPT分析出来了我们要调那个api达到来回答我们的问题。
def get_current_weather(location):
if location == '东京':
return 'misty'
return 'sunny'
results = get_current_weather('东京')
print(results)
messages.append({"role": "function", "name": assistant_message["function_call"]["name"], "content": results})
chat_response = chat_completion_request(
messages, functions=help_functions
)
assistant_message = chat_response.json()["choices"][0]["message"]
messages.append(assistant_message)
print(assistant_message)
此时ChatGPT返回结果:
{
'role': 'assistant',
'content': '东京目前天气状况是雾霾。'
}
然后我们再追问当地时间
messages.append({"role": "user", "content": "当地时间是几点?"})
chat_response = chat_completion_request(
messages, functions=help_functions
)
assistant_message = chat_response.json()["choices"][0]["message"]
messages.append(assistant_message)
print(assistant_message)
模型输出
{
'role': 'assistant',
'content': None,
'function_call': {
'name': 'get_local_time',
'arguments': '{\n "location": "东京"\n}'
}
}
这个告诉我们,需要调用get_local_time函数,参数为 "location": "东京"
def get_local_time(location):
if location == '东京':
return '21:03 2023年6月15日(星期四) (GMT+9)'
return '20:03 2023年6月15日(星期四) (GMT+8)'
results = get_current_weather('东京')
messages.append({"role": "function", "name": assistant_message["function_call"]["name"], "content": results})
chat_response = chat_completion_request(
messages, functions=help_functions
)
assistant_message = chat_response.json()["choices"][0]["message"]
messages.append(assistant_message)
print(assistant_message)
ChatGPT输出
{
'role': 'assistant',
'content': '当前东京的时间是21:03,日期是2023年6月15日(星期四),时区为GMT+9。'
}
3
应用开发工程师将被淘汰
如果大家当过技术开发,都知道。应用层程序员大多时间都在忙着接入api,根据需求写业务端代码。而ChatGPT插件的出现,意味了业务端代码甚至都不用写了~ 让ChatGPT读api文档,生成功能性函数。然后再通过上述的方法进行输入,它可以分析出在什么时候用什么函数,根本就不需要人去写业务逻辑啦。随着算力成本的降低,可调用函数的能力越来越强,我相信有一天应用开发工程师终将不复存在,这个时间会很快。AI应用层出不穷,太依赖人工智能大模型赋能,Openai每升级一轮,创业公司就要迭代升级一轮。完全被动,所以我想现在创业公司应该是越来越难了~