ChatGPT 支持函数调用示例

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_callauto.

{
    "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 的 systemuser 信息条目
  • 第二次调用, 不需要 functions 接口描述列表, 这个字段不能出现, 不能传入空数组, 否则会调用 ChatGPT 报错

官方文档

官方接口文档, 本次升级的部分, 传递函数描述信息 functions, 以及选择函数调用的模式.

同时, 消息体增加 namefunction_call 两个字段, 应用示例参见上一节内容. 注意, 这里有两个 function_call, 定义不一样哦

函数调用说明, 其中包含一个获取当前天气的示例, 使用 Python 代码实现的. 下面截取的是, 官方介绍的 function calling 可能得应用场景, 以及基本的使用步骤.

最后, 写得有些匆忙, 后续会持续完善~

相关推荐