ChatGPT 函数调用到底怎么玩?

6月14日ChatGPT刚刚更新了Function Call函数调用功能,用户可以通过自定义函数代码来扩展ChatGPT的能力,让ChatGPT可以做到除了问答以外的扩展能力,比如官方举例说可以调第三方API查询天气,还可以通过生成SQL语句帮你查数据库等等。这篇文章我们通过官方的几个例子以及我自己的一些尝试介绍一下函数调用到底怎么玩。

函数调用

根据官方文档的描述,14日新发布的两个算法版本gpt-3.5-turbo-0613gpt-4-0613支持该项功能,要主要的是,自定义的函数是在你本地执行的,而不是在ChatGPT的服务器上,ChatGPT能做是理解你的问题,并且帮你决策要调用哪个函数,以及帮你生成入参,理解了后面的例子这一点就明白了。

根据官方的描述,函数调用提供了一种从ChatGPT模型获取格式化数据的能力,比如:

  • 创建一个对话机器人,通过调用外部API进行问答。e.g. 定义一个函数send_email(to: string, body: string)或者get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
  • 把自然语言转换成API调用,e.g. 把"Who are my top customers?"转换为get_customers(min_revenue: int, created_before: string, limit: int) 然后调用外部API
  • 抽取结构化数据,e.g. 定义一个函数extract_data(name: string, birthday: string)或者 sql_query(query: string)

函数调用的整体流程如下:

  1. 使用user query调用模型,并且模型的入参中指定一个或一组"functions"调用。
  2. 模型会自己选择调用哪个Function,这样的话返回内容将是一个符合自定义模式的字符串化的JSON对象(注意:模型可能生成无效的JSON或虚构参数)。
  3. 在您的代码中将字符串解析为JSON,并根据提供的参数调用您的函数(如果存在)。
  4. 通过将函数响应作为新消息附加,并让模型将结果总结给用户,再次调用模型。

示例:查询IP信誉

这个例子我们先定义一个简单的函数调用微步在线API,然后把这个函数传给ChatGPT,最后向它花式提问让它帮我们查这个IP的信誉,相当于一个智能助手(有点大炮打蚊子的赶脚=.=)

下面这段代码传入IP参数,调用微步API查询IP信誉

import requests

def query_ip_reputation(ip):
  # 获取一个微步APIkey,不会玩的去问ChatGPT
  api_key = "<apikey>"
  url = f"https://api.threatbook.cn/v3/scene/ip_reputation?apikey={api_key}&resource={ip}"
  resp = requests.get(url)

  if resp.status_code == 200:
    print(resp.text)
    return resp.text
  else:
    raise Exception(resp.text)


#ip_address = "8.8.8.8"

输出

{"data":{"8.8.8.8":{"severity":"info","judgments":["IDC","Whitelist","CDN"],"tags_classes":[{"tags":["GoogleCloud"],"tags_type":"public_info"}],"basic":{"carrier":"Google LLC","location":{"country":"United States","province":"","city":"","lng":"-101.407912","lat":"39.765054","country_code":"US"}},"asn":{"rank":4,"info":"GOOGLE, US","number":15169},"scene":"Cloud Provider","confidence_level":"high","is_malicious":false,"update_time":"2023-06-01 08:29:11"}},"response_code":0,"verbose_msg":"OK"}

接下来我们看看如何调用ChatGPT,当然你可以用request调用openai的url,但是这里我们选择使用它的SDK,先安装:

pip install openai

下面这段代码可以用来测试你的ChatGPT api_key是否有效(没有的自己想办法吧)

import openai

openai.api_key = "sk-<apikey>"

# confirm authentication was successful
openai.Engine.list()['data'][0]

下面这段相当于是我们前面定义python函数的一个Schema,这个格式基本是固定的,包含函数名、描述、参数以及参数类型和描述,这里的描述一定要尽可能准确,因为这段描述是ChatGPT做决策的依据,ChatGPT会根据它理解的语义选择调用或不调用这个函数,总之决策权在它不在你。

query_ip_reputation_func = {
    "name": "ip_reputation",
    "description": "Query the reputation of IP address",
    "parameters": {
        "type": "object",
        "properties": {
            "ip": {
                "type": "string",
                "description": "The target IP address that you need to query for the reputation"
            }
        },
        "required": ["ip"]
    }
}

最后,我们调用对话接口用自然语言让他查某个IP的信誉,效果如下

import json

prompt = "给我查询这个IP 8.8.8.8的信誉"

res = openai.ChatCompletion.create(
    model='gpt-3.5-turbo-0613',  # swap for gpt-3.5-turbo-0613 if needed
    messages=[{"role": "user", "content": prompt}],
    functions=[query_ip_reputation_func]
)

if res['choices'][0]["finish_reason"] == "function_call":
    print("We should call a function!")

name = res['choices'][0]['message']['function_call']['name']
params = json.loads(res['choices'][0]['message']['function_call']['arguments'])
name, params

print(query_ip_reputation(**params))

输出

We should call a function!
{"data":{"8.8.8.8":{"severity":"info","judgments":["IDC","Whitelist","CDN"],"tags_classes":[{"tags":["GoogleCloud"],"tags_type":"public_info"}],"basic":{"carrier":"Google LLC","location":{"country":"United States","province":"","city":"","lng":"-101.407912","lat":"39.765054","country_code":"US"}},"asn":{"rank":4,"info":"GOOGLE, US","number":15169},"scene":"Cloud Provider","confidence_level":"high","is_malicious":false,"update_time":"2023-06-01 08:29:11"}},"response_code":0,"verbose_msg":"OK"}

可以看到ChatGPT理解了我们的问题,也理解了这个函数的作用,并最终选择调用我们定义的函数。当然,我们可以定义一系列Function用来完成不同的工作,然后在调用对话接口的时候把所有的Function都绑定进去,让ChatGPT自己决定

总结

官方还提供了一个让CHatGPT生成SQL并借助函数查询本地数据库的一个例子传送门。总的来讲还是蛮有创意的,通过本地执行函数即保证了数据安全性又能方便的使用线上的生成式大语言模型,只是如果函数全都自己写还是感觉有点费劲,毕竟来使用AI的都是想偷懒的人,不过据说Langchain在openai发布新版本后十分钟你内就立即宣布支持Function Call,相信有了专业人士的加持,Function call会孵化出很多千奇百怪的玩法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容