ChatGPT 函数调用说明及完整示例

3,280 阅读3分钟

原文链接: zhiyuanbiji.cn/notes/5bc6e…

GPT-3.5 和 GPT-4, 6 月 13 日的版本 (目前最新版), 支持函数调用啦 (function calling). 也就是说, 可以非常方便地通过调用外部接口, 将补充信息传递给 ChatGPT, 再借助 ChatGPT 强大的内容理解能力, 输出更加符合预期的结果. 更进一步, 实现类似于 ChatGPT 官方的插件系统.

功能演示

利用周末, 给希羽实现了一个天气预报功能, 将 function calling 基本链路跑通, 后续将持续扩展功能. 先来看看效果吧~

首先是没有接入 function calling, 就是直接问 ChatGPT, 自然回答不了

使用 function calling 接入第三方天气接口之后, 一切就变得不一样啦^^

还可以问接下来几天的天气预报

也可以限定天数, 是不是感觉有点意思呢

你也可以只问关于天气的部分信息, 比如温度

上图还演示了, 询问股价信息, 这方面还有接入相应的接口支持, 所以回答不了; 此外, 对于 ChatGPT 自身就能回答的问题, 那就直接回答了. 也可以问温度走势, 这样只会罗列接下来几天的温度信息. 这种情况, 如果能直接输出折线走势图, 会不会更直观呢^^

该功能已在希羽上线, 体验方式查看原文获取.

实现方案

首先将 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"
}

:::danger 注意

  • assistant 信息条目, 此时 content 为空字符串, 但不能省略该字段, 否则会调用 ChatGPT 报错
  • function 信息条目, 多了一个 name 字段, 就是 function name; content 字段传入函数调用结果
  • messages 数组要保留上次请求 ChatGPT 的 systemuser 信息条目
  • 第二次调用, 不需要 functions 接口描述列表, 这个字段不能出现, 不能传入空数组, 否则会调用 ChatGPT 报错 :::

官方文档

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

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

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

最后, 写得有些匆忙, 后续会持续完善~ 查看原文