GPT-3.5 和 GPT-4, 6 月 13 日的版本 (目前最新版), 支持函数调用啦 (function calling). 也就是说, 可以非常方便地通过调用外部接口, 将补充信息传递给 ChatGPT, 再借助 ChatGPT 强大的内容理解能力, 输出更加符合预期的结果. 更进一步, 实现类似于 ChatGPT 官方的插件系统.
利用周末, 给希羽实现了一个天气预报功能, 将 function calling 基本链路跑通, 后续将持续扩展功能. 先来看看效果吧~
首先是没有接入 function calling, 就是直接问 ChatGPT, 自然回答不了
使用 function calling 接入第三方天气接口之后, 一切就变得不一样啦^^
还可以问接下来几天的天气预报
也可以限定天数, 是不是感觉有点意思呢
你也可以只问关于天气的部分信息, 比如温度
上图还演示了, 询问股价信息, 这方面还有接入相应的接口支持, 所以回答不了; 此外, 对于 ChatGPT 自身就能回答的问题, 那就直接回答了. 也可以问温度走势, 这样只会罗列接下来几天的温度信息. 这种情况, 如果能直接输出折线走势图, 会不会更直观呢^^
该功能已在希羽上线
关注如下「知源笔记」公众号, 输入”chat“, 即可体验~ 更多功能持续研发中, 欢迎持续关注我们, 第一时间获取更新信息
首先将 function 描述信息, 按 API 要求传给 ChatGPT, 并设定 function_call
为 auto
.
{
"function_call": "auto",
"functions": [{
"description": "获取指定城市当前的天气",
"name": "getCurrentWeather",
"parameters": {
"type": "object",
"properties": {
"city": {
"description": "城市",
"type": "string"
},
"forecast": {
"description": "是否预报接下来几天的天气",
"type": "boolean"
}
},
"required": ["city"]
}
}],
"messages": [{
"content": "AI 助手",
"role": "system"
}, {
"content": "上海市的天气",
"role": "user"
}],
"model": "gpt-3.5-turbo-0613"
}
ChatGPT 会返回如下结果
{
"index": 0,
"message": {
"role": "assistant",
"content": null,
"function_call": {
"name": "getCurrentWeather",
"arguments": "{\n \"city\": \"上海市\"\n}"
}
},
"finish_reason": "function_call"
}
接下来, 通过调用 getCurrentWeather
方法, 传入城市字段, 获取到实时信息
{
"success": true,
"city": "上海市",
"info": {
"date": "2023-06-19",
"week": "星期一",
"type": "大雨",
"low": "23°C",
"high": "26°C",
"fengxiang": "东南风",
"fengli": "3 级",
"night": {
"type": "中雨",
"fengxiang": "西风",
"fengli": "3 级"
},
"air": {
"aqi": 19,
"aqi_level": 1,
"aqi_name": "优",
"co": "1",
"no2": "30",
"o3": "40",
"pm10": "16",
"pm2.5": "13",
"so2": "6"
},
"tip": "下雨了,出门记得带伞~ 现在的温度比较舒适~"
}
}
可以看到, 接口是返回了很多字段信息的, 接下来, 再次组装 message 数组, 传给 ChatGPT, 这样就得到了上述演示的结果啦~
{
"messages": [{
"content": "AI 助手",
"role": "system"
}, {
"content": "上海市的天气",
"role": "user"
}, {
"content": "",
"function_call": {
"name": "getCurrentWeather",
"arguments": "{\n \"city\": \"上海市\"\n}"
},
"role": "assistant"
}, {
"content": <函数调用结果> ,
"name": "getCurrentWeather",
"role": "function"
}],
"model": "gpt-3.5-turbo-0613"
}
assistant
信息条目, 此时 content
为空字符串, 但不能省略该字段, 否则会调用 ChatGPT 报错function
信息条目, 多了一个 name
字段, 就是 function name; content
字段传入函数调用结果messages
数组要保留上次请求 ChatGPT 的 system
和 user
信息条目functions
接口描述列表, 这个字段不能出现, 不能传入空数组, 否则会调用 ChatGPT 报错官方接口文档, 本次升级的部分, 传递函数描述信息 functions
, 以及选择函数调用的模式.
同时, 消息体增加 name
和 function_call
两个字段, 应用示例参见上一节内容. 注意, 这里有两个 function_call
, 定义不一样哦
函数调用说明, 其中包含一个获取当前天气的示例, 使用 Python 代码实现的. 下面截取的是, 官方介绍的 function calling 可能得应用场景, 以及基本的使用步骤.
最后, 写得有些匆忙, 后续会持续完善~