一文教你使用 ChatGPT API function calling

一文教你使用 ChatGPT API function calling

  • Function call
    • 如何理解Function call
    • 如何调用?

Function call

在这里插入图片描述

如何理解Function call

函式呼叫(function calling) 可说是这次ChatGPT API 更新的杀手级更新。所谓函式呼叫,就是让你把外部函式的形状写入ChatGPT API,这样ChatGPT API 就能输出对的格式来呼叫你的函式。让我们透过官方发布的例子来了解:

例子
假如你现在问ChatGPT 「波士顿目前天气如何」,ChatGPT 会吐给你乱回答的内容,因为它的训练资料只到2021 年。假如要有最新的资料,会需要呼叫外部的API,例如有个天气API,呼叫后可以拿到最新的天气资讯。

假设今天这个天气API 的输入格式要两个参数,一个是地点,需要是字串;第二个是单位,需要是摄氏或华氏。过去的作法是,你要在指令(prompt) 里面跟ChatGPT 说,请输出一个JSON 字串,里面要包含地点与单位,这两个栏位。但这时就有个问题,即使你有下这个指令,ChatGPT 的输出仍可能会不如你预期。最常见的状况是,它会回「好的没问题,以下是JSON 字串的输出」这个开头的回复

💣 然后这时候就炸掉了,因为当你把「好的没问题,以下是JSON 字串的输出」输入到天气API,天气API 会没办法处理。这是过去要做ChatGPT 应用程式会遇到的一个痛点。要能有效整合,就需要有对的格式。格式错误将可能让程式运行出问题,弄不好整组炸掉就悲剧了。

函式呼叫这功能就是让ChatGPT API 能用对的格式跟外部工具互动。今天改成用函式呼叫的功能,ChatGPT API 会依据你定义好的格式,给出对的输出。以这边为例,它不会再用「好的没问题,以下是JSON 字串的输出」开头。而是会直接输出一个JSON 字串。这时你可以拿去打天气API。

如何调用?

API调用

import requests
import os
import json

url = "https://api.openai.com/v1/chat/completions"

auth = ('', os.getenv('OPENAI_API_KEY'))

headers = {
  "Content-Type": "application/json",
}

data = {
  "model": "gpt-3.5-turbo-0613",
  "messages": [
    {"role": "user", "content": "What is the weather like in Boston?"}
  ],
  "functions": [
    {
      "name": "get_current_weather",
      "description": "Get the current weather in a given location",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city and state, e.g. San Francisco, CA"
          },
          "unit": {
            "type": "string",
            "enum": ["celsius", "fahrenheit"]
          }
        },
        "required": ["location"]
      }
    }
  ]
}

response = requests.post(url, auth=auth, headers=headers, data=json.dumps(data))

print(response.text)

这时会拿到

{
  "id": "chatcmpl-123",
  ...
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": null,
      "function_call": {
        "name": "get_current_weather",
        "arguments": "{ \"location\": \"Boston, MA\"}"
      }
    },
    "finish_reason": "function_call"
  }]
}
打完天气API,你拿到波士顿:22 度、单位:摄氏,接着再喂回去给ChatGPT API,这时ChatGPT API 就能精准回覆「波士顿现在的天气是摄氏22 度」

把上面的结果拿去呼叫天气API,会拿到

import requests
import os
import json

url = "https://api.openai.com/v1/chat/completions"

auth = ('', os.getenv('OPENAI_API_KEY'))

headers = {
  "Content-Type": "application/json",
}

data = {
  "model": "gpt-3.5-turbo-0613",
  "messages": [
    {"role": "user", "content": "What is the weather like in Boston?"},
    {"role": "assistant", "content": None, "function_call": {"name": "get_current_weather", "arguments": "{ \"location\": \"Boston, MA\"}"}},
    {"role": "function", "name": "get_current_weather", "content": "{\"temperature\": \"22\", \"unit\": \"celsius\", \"description\": \"Sunny\"}"}
  ],
  "functions": [
    {
      "name": "get_current_weather",
      "description": "Get the current weather in a given location",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city and state, e.g. San Francisco, CA"
          },
          "unit": {
            "type": "string",
            "enum": ["celsius", "fahrenheit"]
          }
        },
        "required": ["location"]
      }
    }
  ]
}

response = requests.post(url, auth=auth, headers=headers, data=json.dumps(data))

print(response.text)
最后拿到的就是正确的资料,同时又是自然语言

{
  "id": "chatcmpl-123",
  ...
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "The weather in Boston is currently sunny with a temperature of 22 degrees Celsius.",
    },
    "finish_reason": "stop"
  }]
}

打印完天气API,你拿到波士顿:22 度、单位:摄氏,接着再喂回去给ChatGPT API,这时ChatGPT API 就能精准回覆「波士顿现在的天气是摄氏22 度」

把上面的结果拿去呼叫天气API,会拿到


import requests
import os
import json

url = "https://api.openai.com/v1/chat/completions"

auth = ('', os.getenv('OPENAI_API_KEY'))

headers = {
  "Content-Type": "application/json",
}

data = {
  "model": "gpt-3.5-turbo-0613",
  "messages": [
    {"role": "user", "content": "What is the weather like in Boston?"},
    {"role": "assistant", "content": None, "function_call": {"name": "get_current_weather", "arguments": "{ \"location\": \"Boston, MA\"}"}},
    {"role": "function", "name": "get_current_weather", "content": "{\"temperature\": \"22\", \"unit\": \"celsius\", \"description\": \"Sunny\"}"}
  ],
  "functions": [
    {
      "name": "get_current_weather",
      "description": "Get the current weather in a given location",
      "parameters": {
        "type": "object",
        "properties": {
          "location": {
            "type": "string",
            "description": "The city and state, e.g. San Francisco, CA"
          },
          "unit": {
            "type": "string",
            "enum": ["celsius", "fahrenheit"]
          }
        },
        "required": ["location"]
      }
    }
  ]
}

response = requests.post(url, auth=auth, headers=headers, data=json.dumps(data))

print(response.text)

最后拿到的就是正确的资料,同时又是自然语言


{
  "id": "chatcmpl-123",
  ...
  "choices": [{
    "index": 0,
    "message": {
      "role": "assistant",
      "content": "The weather in Boston is currently sunny with a temperature of 22 degrees Celsius.",
    },
    "finish_reason": "stop"
  }]
}

在了解完函式呼叫功能后,大概可以更理解OpenAI 的未来策略,如同执行长Sam Altman 先前提到的,不会是再去做ChatGPT 这种应用;而是会以平台的角度出发。函式呼叫能让外部工具更好与ChatGPT API 整合,这会让ChatGPT 这个平台变得更有价值。

以上就是今天的全部内容,希望对大家有所帮助,也希望大家多多留言、点赞、在看、转发四连爱❤️ 支持。 咱们下篇文章见,Bye~👋

微信公众号搜索【一个正经的测试】,专注于AI与软件测试技术和宝藏干货分享,每天准时更新原创技术文章,每月不定期赠送技术书籍,让我们在测试会所在测试社区这个大家庭一起学习交流。喜欢记得星标⭐我,每天及时获得最新推送,
在这里插入图片描述

后台回复“软件测试基础”、“AI与大模型“,简历与面试”等领取测试资源,回复“微信交流群”、“内推群”一起进群吹水摸鱼。
个人微信llwfancymyself添加请注明来意 😃

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/326989.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

win下安装tensorflow

1首先ctrlaltdelete打开任务管理器查看GPU型号 2或者右键我的电脑然后如下方式查看显卡发现没有navida没有GPU

Linux--部署 Tomcat 及其负载均衡

1.案例前置知识点 1)Tomcat简介 名称由来:Tomcat最初是由 Sun的软件构架师詹姆斯邓肯戴维森开发的。后来他帮助将其变 为开源项目,并由Sun贡献给Apache软件基金会。由于大部分开源项目OReilly都会出一本相关的 书,并且将其封面设…

黑马程序员——javase基础——day02——运算符选择语句

目录: 运算符 算术运算符案例数值拆分操作的三种情况 数字相加(类型转换)字符相加字符串相加赋值运算符选择语句 顺序结构Debug的基本使用选择语句之if if语句格式1if语句格式2和格式3案例1(交通信号灯)关系运算符案例2(奇偶数)案例3(手机以旧换新)案例4(你是青年人…

探索2023年大模型与AIGC峰会:程序员的学习之旅与未来展望

在2023年的技术前沿,大模型与AIGC峰会无疑是一个备受瞩目的盛会。 作为程序员,你将从这次大会中学到什么?这次峰会将为你揭示哪些前沿科技趋势?让我们一起来探讨这个问题。 一、理解大模型与AIGC 大模型和AIGC是人工智能领域中两…

开源图床Lychee本地如何部署并结合内网穿透工具实现远程访问

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站,可以看做是云存储的一部分,既可…

NASA太空原子电池与Betavolt便携原子能电池对比分析

一、核心技术原理对比 1. Betavolt BV100原子能电池 工作原理:Betavolt BV100采用镍-63同位素作为能量源,这种同位素在衰变过程中释放β粒子(高速电子流),并通过金刚石半导体材料捕获并转换为电能。不同于传统的热电转…

单调栈练习(五)— 子数组的最小值之和

题目 同样的LeetCode原题:题目链接 给定一个整数数组 arr,找到 min(b) 的总和,其中 b 的范围为 arr 的每个(连续)子数组。 由于答案可能很大,因此 返回答案模 10^9 7 。 思路 暴力解 先来说暴力解的思路…

别再给自己的创业失败找借口了,什么都有你还创什么业?2024普通人如何创业,2024适合普通人的创业项目

说起创业,大家都是满腹牢骚,抱怨现在阶层固化,没有机会,自己也没有钱,没有资源。反正就是给自己创业失败找借口。 但是马云曾经表示,钱是最容易得到的东西,如果自己一开始就有钱,那…

C++特殊类设计类型转换

一、特殊类设计 在普通类的设计基础上,提出一些限制条件设计的类就是特殊类。 1、请设计一个类,不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝, 只需让该类不能调…

Codeforces Round 919 (Div. 2) A~E

A. Satisfying Constraints(模拟) 题意: 给出 n n n个限制条件,问有多少个数字 k k k同时满足这些限制条件。 限制条件分为以下三种: k k k必须大于等于给出的一些数字 x x x k k k必须小于等于给出的一些数字 x x x k k k不能与给出的…

Go新项目-为何选Gin框架?(0)

先说结论:我们选型Gin框架 早在大概在2019年下旬,由于内部一个多线程上传的需求,考虑到Go协程的优势; 内部采用Gin框架编写了内部的数据上传平台BAP,采用GinVue开发,但前期没考虑到工程化思维,导…

【linux】终端发送网络请求与文件下载

发送网络请求 linux的终端中发送网络请求可以使用curl命令。 语法: curl [url] 但是他返回的是html代码,因为在终端中,他无法像浏览器中一样把访问到的html代码渲染成我们访问的页面,所以我们只能拿到他的源码。 访问CSDN - 专…

线性表的应用 | 线性表的合并

线性表的合并 #include <iostream> using namespace std;#define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2typedef int Status;// 定义单链表 typedef struct LNode {int data;struct LNode *next; }LNode, *…

stack,queue和prioriy_queue

MySTL stack和queue template <class T, class Container deque<T> > class queue;template <class T, class Container deque<T> > class stack;选择适配器的宗旨是要能达到预想的功能 queue——只能使用list和deque stack——可以使用vector和…

【开源】基于JAVA的康复中心管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

试用清华Chatglm智能体

清华AI平台&#xff0c;感觉在见过的国内AI平台中做的是比较优秀的&#xff0c;目前该平台提供的智能体功能感觉更智能或者说更傻瓜式一些。定义可以定义专属智能体&#xff0c;这些智能体是自己想要的网络上的汇集处理后的信息&#xff0c;或者是绘画或者是编写某个方面的代码…

16.桥接模式

桥接模式 介绍 桥接模式是一种结构型设计模式&#xff0c;它通过将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。这种模式通过组合的方式来实现&#xff0c;而不是继承。桥接模式通过将抽象和实现解耦&#xff0c;从而实现抽象和实现的分离&#xff0c;使得系统更加…

数字人系统OEM流程:部署AI数字人系统源码需要注意哪些?

随着数字化技术的不断发展&#xff0c;数字人SaaS系统源码的部署已经成为许多企业关注的焦点。数字人SaaS系统源码的部署可以帮助企业降低成本、提高运营效率&#xff0c;为企业提供更加高效的服务。然而&#xff0c;在部署数字人SaaS源码时&#xff0c;有一些须知事项需要我们…

SpringAOP-说说 JDK动态代理和 CGLIB 代理

Spring 的 AOP 是通过动态代理来实现的&#xff0c;动态代理主要有两种方式 JDK 动态代理和 Cglib 动态代理&#xff0c;这两种动态代理的使用和原理有些不同。 JDK 动态代理 Interface&#xff1a;JDK动态代理是基于接口的代理&#xff0c;它要求目标类实现一个接口。Invoca…

内存四区图练习

带着白卡去旅行 绘制图中三种情况的内存四区图 一个实参 一个形参 取地址 通过指针修改变量 返回 多级指针的训练 #define _CRT_SECURE_NO_WARNINGS #include<stdlib.h> #include<stdio.h> #include<string.h> #include<math.h>int getMem(char***p3,…