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和你的日历打通,那它是不是就能够帮你管理日程了; 假如和你的笔记打通,那它是不是就能够帮你整理笔记了;甚至是和你的股票账号打通,是不是就能够帮你炒股了;假如和脑机接口打通,那它是不是就能够操控……