OpenAI在6月13号晋级了ChatGPT,推出了相似其网页版插件的功用——函数调用(Function calling),13号当天我在很多微信大众号就看到了这个音讯,甚至有人将函数调用称为杀手级特性,正好周末有空,就写个Demo试用下,验证下它是平平无奇仍是真的能让人眼前一亮。
官网给出的函数调用示例是接入查询气候的才能,我看到榜首反应 就这……。但当我写了一个简略抓取网页文本的函数,并将其接入到ChatGPT中后,我忽然认识到这确实是一个十分强壮的功用。之前的ChatGPT只能用文本交互,文本有个特点便是其规范性十分十分弱,同样的语义两个不同的人表述出来或许便是彻底不同的两句话,导致咱们很难用自然语言区操控一般的程序。而这次的函数调用才能,让其具有了输出强规范的内容,能够用来调起其他程序。这也意味着ChatGPT具有了和一般程序交互的才能,可幻想的空间十分大。
接下来我就用我完成的ChatGPT网页剖析才能作为示例,演示下怎么让ChatGPT接入一般的python函数,最终我再总结下函数调用的才能和限制,顺便也想象下函数调用究竟还能够完成什么样的强壮功用。
Step1:完成一般函数
首先便是要定义好一般的python函数,我这儿写了一个简略的网页爬取的功用,给定url就能够抓取到网页上面的文本内容。这儿仅仅一个简略完成,或许部分网页无法正常抓取。
import requests
from bs4 import BeautifulSoup
def is_target_tag(tag):
target_tags = ['p', 'code', 'h1', 'h2', 'h2', 'h3', 'h4', 'h5']
return tag.name in target_tags
def get_text_from_url(url):
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
extracted_tags = soup.find_all(is_target_tag)
res_text = ''
for tag in extracted_tags:
res_text = res_text + tag.get_text(strip=True) + '\n'
return res_text
这儿运用的是request包发起恳求,运用bs4的BeautifulSoup来解析html标签,代码将html中所有的段落、代码、标题内容都抓取出来。
Step2: 用json-schema格局将函数描绘出来
这一步的作用便是把能够调用的一般函数信息用ChatGPT能够辨认的格局描绘出来,这儿OpenAI直接采用了JSON-Schema。也比较简略,便是描绘出来有哪些函数能够用、函数别离完成了什么样的功用、每个函数有哪些参数、哪些是必填参数、哪些是选填参数…… 这儿我用来抓取url对应文本的函数描绘如下:
functions = [
{
"name": "getText",
"description": "抓取url对应的网页里的文本内容",
"parameters": {
"type": "object",
"properties": {
"url": {
"type": "string",
"description": "网址url",
}
},
"required": ["url"],
},
}
]
留意,这儿functions能够有不止一个,只需你能准确将函数功用及入参格局用json-schema描绘出来,ChatGPT就能给你调起。 别的这儿为了方便调起,咱们还需求保存一个办法名到实际办法的映射关系,详细如下:
available_functions = {
"get_text_from_url": get_text_from_url,
}
Step3: 调用ChatGPT的时候带上函数信息
接下来咱们只需求在原有Api的参数中增加functions,让ChatGPT知晓有哪些函数能够调用,然后让他决定要不要调。完好的代码及注释如下:
import os
import openai
import json
openai.api_key = os.getenv("OPENAI_API_KEY")
def chat(content):
messages = [
{"role": "user", "content": content}
]
response1 = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
functions=functions,
function_call="auto"
)
response_message = response1["choices"][0]["message"]
rtn_message = response1["choices"][0]["message"]
# 假如ChatGPT回来成果会告诉你,是否需求调用函数,咱们只需求根据它回来的函数名、参数调起对应的函数
# 然后将函数的回来成果再给到ChatGPT,让他进行下一步的操作
if response_message.get("function_call"):
# 找到需求调用的函数,并将ChatGPT给的参数传进去
function_name = response_message["function_call"]["name"]
fuction_to_call = available_functions[function_name]
function_args = json.loads(response_message["function_call"]["arguments"])
# 用这种方法能够调起恣意python函数,不用像官网那样还要指定参数名
function_response = fuction_to_call(**function_args)
# 获取到函数调用成果后,需求将成果拼接到对话记载里,并再次调用ChatGPT
messages.append(response_message)
messages.append(
{
"role": "function",
"name": function_name,
"content": function_response,
}
)
# 二次调用的回来成果里便是咱们预期的成果了
response2 = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=messages,
)
rtn_message = response2["choices"][0]["message"]
return rtn_message['content']
咱们简略验证下效果:
chat('总结下这篇文章,将其间的要点提炼出来 https://zxs.io/article/1924')
回来成果如下:
这篇文章总结了运用ChatGPT提高程序员编程才能的办法和场景。作者经过两个月的运用发现,尽管ChatGPT现在还无法彻底代替程序员在一些强上下文的编程场景下的才能,但在一些通用化的编程场景下,它的表现仍然可行。作者提炼出以下利用ChatGPT的场景:
1. 代码评定:ChatGPT能够检测代码的语法错误、代码风格问题、潜在的bug和性能问题,但需求留意辅助东西的限制性,主张与其他代码检查东西和人工检查相结合运用。
2. 代码优化:除了代码评定,ChatGPT还能够帮助优化并重写代码,但同样需求结合其他专业人士的主张进行综合优化。
3. 代码释义:运用ChatGPT生成代码释义,以减轻维护老代码的担负。
4. 供给解决方案:描绘遇到的问题,让ChatGPT给出主张和解决方案。
5. 代码生成:ChatGPT能够直接生成相关代码,如分布式锁注解的代码,在实际运用中需求自行鉴别和辨认生成的代码。
6. 规划形式和架构主张:ChatGPT能够供给在代码规划和架构规划上的主张。
7. 学习新知识:在不熟悉的范畴运用ChatGPT帮助学习。
文章提到了一些运用ChatGPT的实例,并强调了在运用过程中需求留意鉴别数据的时效性和准确性。最终,作者以为尽管ChatGPT无法代替程序员的大部分技术,但能够作为一个东西来提高工作效率。
能够看到关于我博客的网址仍是十分好用的,我也测试了CSDN、等技术网站,也能够正常运用。但有些网站拿不到成果,不是ChatGPT不行,而是我get_text_from_url办法写的太low了,有些情况下确实没法抓取到内容。
补白:运用函数调用时需求晋级最新的openai包,别的现在也只有gpt-3.5-turbo-0613和gpt-4-0613两个模型才支撑函数调用,其他模型还不支撑。
总结
不管是从官网查询气候的示例,仍是从我这个抓取网页的示例来看,接入函数调用的才能并不杂乱。别的需求留意到的一点,尽管这个功用叫函数调用,但ChatGPT并不会帮你去调这些函数,而是帮你判断何时去调用这些函数,给你调用函数所需求的参数,最终必定得是由你自己去调用函数的。从它的回来数据格局能够看出,当时版别的函数调用还有个限制点,便是当时版别只能在一次对话中调起一个函数,假如遇到那种需求多次调用的操作,就只能通过多轮对话的方法完成了。
尽管函数调用这个功用看似简略,但我觉得这个功用让ChatGPT拥有了和现有程序打通的才能,曾经它只能帮你做决议计划、给主张,但现在它还能够去帮你执行。举个很实际的比如,现在ChatGPT用的最多的当地便是客服之类的问答场景,现在的系统只能做一些信息交流,比方商品咨询、退换货信息咨询……,但假如接入函数调用功用,用户就能够直接在对话的过程中完成整个流程,这现在是彻底能够做到的,不过这个东西刚出来,其决议计划的可靠性还需求验证,连OpenAI在官网上都提示:
We strongly recommend building in user confirmation flows before taking actions that impact the world on behalf of users (sending an email, posting something online, making a purchase, etc).
咱们强烈主张在代表用户采纳影响国际的动作(发送电子邮件、在线发布内容、进行购买等)之前,先由用户确认。
假如你还认识不到函数调用的强壮才能,我再举一些简略的比如:假如ChatGPT和你的日历打通,那它是不是就能够帮你管理日程了; 假如和你的笔记打通,那它是不是就能够帮你整理笔记了;甚至是和你的股票账号打通,是不是就能够帮你炒股了;假如和脑机接口打通,那它是不是就能够操控……