• Python ChatGPT API 新增的函数调用功能演示


    🍉 CSDN 叶庭云https://yetingyun.blog.csdn.net/


    一、前言

    OpenAI 重磅更新,API 添加函数调用能力,能处理更长上下文,价格又有所降低 …

    在这里插入图片描述

    知乎讨论:https://www.zhihu.com/question/606520916

    这次更新的主角,在我看来毫无疑问是函数调用功能,过去要么依靠 Prompt Engineering 提供的信息,要么就需要使用 LangChain 这样的框架实现。现在官方提供了更稳定的方式与本地代码或者第三方 API,可以无缝将 GPT 的语言理解和解析能力整合入本地工作流中。

    稍微再总结一下此次更新的主要内容:

    • 在 Chat Completions API 中提供函数调用能力
    • 更新更易控制的 gpt-4 和 gpt-3.5-turbo 版本
    • 新的 16k 上下文版本 gpt-3.5-turbo (与标准的 4k 版本相比很香)
    • embeddings 嵌入模型价格降低了75%
    • gpt-3.5-turbo 输入 token 价格降低 25%
    • 宣布 gpt-3.5-turbo-0301 和 gpt-4-0314 型号的弃用计划
    • 以上所有的模型都会遵循 0301 介绍的数据隐私规则:所有使用 API 的数据不会用于训练。

    二、主要内容

    新增的函数调用功能的解释:我理解的是,ChatGPT 的 API 现在可以根据你给出的函数描述,理解你的函数输入输出格式要求,把用户的自然语言转化成本地 / {/} /第三方函数的输入参数。然后开发者需要拿着这个参数自己执行一下,得到一个结果再还给 ChatGPT,ChatGPT 最后会根据这个结果回答用户的问题,输出最终内容。

    函数调用的官方示例:

    在这里插入图片描述

    自从 ChatGPT 插件的 alpha 版本发布以来,我们已经学到了很多关于如何安全地使工具和语言模型协同工作的知识。然而,仍有一些未解决的研究问题。例如,一个概念验证漏洞说明了不受信任的数据可以指示模型执行意外操作。我们正在努力减轻这些和其他风险。开发人员可以通过只消费来自可信工具的信息并在执行具有现实影响(例如发送电子邮件、在线发布或购买)的操作之前包含用户确认步骤来保护其应用程序。

    下面我们自己写个实例来实践和感受一下,以查询国内城市今天的天气情况为例:

    API 使用的是国家气象局的接口,完全免费的:http://t.weather.sojson.com/api/weather/city/101010100

    城市到代码的转化是参考这篇博客:https://blog.csdn.net/qq_42855293/article/details/103864266。把他分享的内容粘贴到 Excel 并保存,方便后续使用。

    完整代码如下:

    import ast
    import json
    import requests
    import pandas as pd
    import openai
    from pprint import pprint
    
    
    def get_current_weather(city):
        code = city2code[city]
        resp = requests.get(f"http://t.weather.sojson.com/api/weather/city/{code}")
        data = resp.json()["data"]
        
        date_info = data["forecast"][0]["ymd"] + " - " + data["forecast"][0]["week"]
        wendu = data["wendu"]
        shidu = data["shidu"]
        pm25 = data["pm25"]
        pm10 = data["pm10"]
        tianqi_type = data["forecast"][0]["type"]
        air_quality = data["quality"]
        zhuyi = data["forecast"][0]["notice"]
        low = data["forecast"][0]["low"]
        high = data["forecast"][0]["high"]
        aqi = data["forecast"][0]["aqi"]
        
        return {"时间": date_info, "温度": wendu, "最高温度": high, "最低温度": low,
                "湿度": shidu, "天气类型": tianqi_type, "空气质量": air_quality,
                "注意": zhuyi, "PM2.5": pm25, "PM10": pm10, "AQI": aqi}
    
    
    openai.api_key = "请注意:替换为你的 API KEY"      # 配置自己的 API Key
    openai.api_base = 'https://你的反向代理域名-如果有的话/v1'   # 请注意后面 /v1 不可省略
    
    # 如果没有自己的反向代理   你还需要设置你挂的魔法
    # proxies = {'http': "http://127.0.0.1:7890", 'https': "https://127.0.0.1:7890"}
    # openai.proxy = proxies
    
    df = pd.read_excel("./citycode/city.xlsx")
    city2code = {k: v for k, v in zip(df["区域"], df["区域编号"])}
                 
    prompt = "今天北京的天气怎么样?"
    print("Prompt:")
    print(prompt)
    
    my_function = [{"name": "get_current_weather",
                    "description": "获取给定位置的当前天气",
                    "parameters": {"type": "object",
                                   "properties": {"location": {"type": "string", "description": "城市,例如北京"},
                                                  "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
                                                },
                                   "required": ["location"]
                                   }
                    }
                   ]
    # LLMs as Controller
    # 据你给出的函数描述,理解你的函数输入输出格式要求,把用户的自然语言转化成本地${/}$第三方函数的输入参数和确定调用那个函数。然后开发者需要拿着这个参数自己执行一下,得到一个结果再还给 ChatGPT,ChatGPT 最后会根据这个结果回答用户的问题,输出最终内容。
    resp1 = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",
                                         messages=[{"role": "user", "content": prompt}],
                                         temperature=0.0,
                                         max_tokens=3072,
                                         functions=my_function,
                                         )
    params = ast.literal_eval(resp1.choices[0].message.function_call["arguments"])
    call_fuction = resp1.choices[0].message.function_call["name"]
    if call_fuction == "get_current_weather":
        weather_data = get_current_weather(params["location"])
    
    resp2 = openai.ChatCompletion.create(model="gpt-3.5-turbo-0613",
                                         messages=[{"role": "user", "content": prompt},
                                                   {"role": "assistant", "content": "null", "function_call": resp1.choices[0].message.function_call},
                                                   {"role": "function", "name": "call_fuction", "content": str(weather_data)}
                                                   ],
                                            temperature=0.0,
                                            max_tokens=3072,
                                            functions=my_function,
                                         )
    print("-" * 99)
    print(resp2.choices[0].message.content)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78

    这段代码主要实现了以下功能:

    • 引入了需要用到的库,包括 ast、json、requests、pandas、openai,以及 pprint 模块的 pprint 函数。
    • 定义了 get_current_weather 函数,该函数接受一个参数 city,并返回一个字典对象,包含当地的天气信息。
    • 配置了 OpenAI 的 API Key 和 API Base。
    • 从 Excel 文件中读取了城市数据,并将城市和编号映射为一个字典 city2code
    • 定义了一个字符串变量 prompt,表示用户的对话询问。
    • 定义了一个名为 my_function 的列表,其中包含一个名为 get_current_weather 的字典对象,描述了返回值的数据结构和输入参数的类型等信息。
    • 调用 OpenAI 的 ChatCompletion.create 函数,传入一些参数,返回一个 OpenAI 对话的响应结果 resp1,其中包含对话的输出及调用的函数名称和参数。
    • 解析 resp1 响应结果中的参数信息,判断调用的函数名称是否为 get_current_weather,如果是则调用该函数获取当地天气信息。
    • 再次调用 OpenAI 的 ChatCompletion.create 函数,不同的是带入了调用的函数名称和返回的天气信息,返回 OpenAI 对话的响应结果 resp2
    • 打印出 resp2 响应结果中的内容,即机器人回复的信息。

    结果如下示意:

    在这里插入图片描述


    三、总结

    所谓的「函数调用」功能,并不是说 GPT API 会帮你执行某些第三方的功能或接口,而是说,通过提交给 GPT 函数的名称、描述和输入参数,它能够在语义中理解应该调用哪一个函数去满足用户功能,如果此时的语境中缺少函数必需的参数,GPT 会进一步与用户对话要求补全信息;当满足函数调用条件时,GPT 会返回一个结果,告诉开发者此时需要调用的函数名和相应的参数;然后开发者自行执行本地/第三方函数,并将结果再次输入给 GPT API,GPT API 则会根据返回值告诉用户结果。

    我们必须先理解了这个过程,至于具体的代码很容易实现。从上面这段话抽取一下工作流程

    • GPT 根据开发者给出的函数描述,理解函数功能和输入参数要求;
    • GPT 理解用户的自然语言,决定此时是否需要调用某函数,并从对话中抽取信息转化成本地/第三方函数的输入参数;
    • 如果此时缺少必要信息,GPT 会继续与用户对话询问补全;
    • 开发者拿到函数名和参数后,自己本地执行,得到一个结果再还给GPT;
    • GPT 最后会根据这个结果回答用户的问题。

    示意图如下所示(图片来自知乎@段小草):
    在这里插入图片描述

    GPT API 是介于开发者和用户直接的「翻译官」,干两件事:

    • 把「用户」的自然语言 → 合适的函数功能和参数 → 返回给「开发者」
    • 把「开发者」接口返回的数据(一般是 JSON)→ 自然语言 → 返回给「用户」


    📚️ 参考链接:

  • 相关阅读:
    大学生期末大作业之购物网站
    [附源码]Python计算机毕业设计Django设备运维平台出入库模块APP
    day1 计算机硬件基础
    【c语言】atoi的模拟实现
    Windows下载安装Vue开发者工具(VueDevtools)
    Android Splash实现
    h5插件_h5页面嵌入客户端调试
    网站监控的重要性及实施策略
    2022年深度学习最新研究成果
    11.多进程与多线程
  • 原文地址:https://blog.csdn.net/fyfugoyfa/article/details/131216745