AIGC: 关于ChatGPT中Function Call的调用

Function Call 概念

  • 关于 GPT 中API的function参数,提供了一些能力
    • 这个函数调用是 Open AI 在2023年的6.13号发布的新能力
    • 根据它的官方描述, 函数调用能力可以让模型输出一个请求调用函数的消息
    • 其中包含所需调用函数的信息,以及调用函数时所需携带的参数的信息
  • 这种方式是一种将GPT的能力和外部的工具,外部的API连接起来的新的方式

函数调用的机制

  • 那么应该如何去使用函数调用?
    • 首先我们需要去选择函数调用的新模型
    • 用户在构造message参数时候,需要主动的告诉模型有哪些函数
    • GPT 知道我们有哪些函数之后,根据对于自然语言的理解,根据用户的输入
    • GPT会自行的判断何时需要调用这些函数,然后会根据目标函数它的描述生成符合要求的请求的参数
    • 然后返回给我们,我们根据GPT的信息再去调用函数

函数的作用

  • 第一种,进行自然语言交流时,通过调用外部工具回答问题
    • 通过这种函数调用的能力,我们可以将GPT和第三方的工具去进行一个集成,形成类似于GPT插件的这种模式
  • 第二种,如果我们有特殊的对于自然语言处理的逻辑
    • 我们可以利用GPT, 将自然语言转换成调用API时使用的参数, 或转换成查询数据库时所使用的条件等等
  • 第三种,我们可以利用这种能力从文本当中去提取一些结构化的数据,这是函数的一些基础的作用。

函数调用的使用

  • 那么我们如何去使用函数调用呢?如何在它的聊天API的接口上去添加函数相关的这些参数呢?
  • 为了实现函数调用的能力, 在API里面有新的请求的参数就是function, function call等等, 在官方的API文档上可以查询
  • 在使用之前,我们先来了解一下函数调用的步骤
    • 第一步, 当我们去调用函数的时候,首先我们需要在请求参数当中向API也就是向GPT去传递信息, 我们要告诉GPT, 我们有哪些可以调用的函数
    • 第二步, 我们根据GPT的返回, 我们要去进行解析, 判断模型是不是需要调用函数, 如果不需要,我们则不处理
      • 如果需要调用函数,我们这里要根据需要调用的函数,根据GPT输入的参数去进行调用
      • 调用完成之后,得到函数调用的结果
    • 最后, 我们再将函数调用的结果添加到GPT的消息列表来告诉GPT

代码实现

  • 参考前文: https://blog.csdn.net/Tyro_java/article/details/134781021

1 )新增一些实现类,结构如下

  • src
    • main
      • java
        • com.xxx.gpt.client
          • entity
            • ChatFunction.java
            • FunctionCallResult.java
    • test
      • java
        • com.xxx.gpt.client.test
          • FunctionCallTest.java

ChatFunction.java

package com.xxx.gpt.client.entity;import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ChatFunction {String name;String description;ChatParameter parameters;@Data@AllArgsConstructor@NoArgsConstructor@Builder@JsonInclude(JsonInclude.Include.NON_NULL)public static class ChatParameter {String type;List<String> required;Object properties;}
}
  • ChatFunction 类中包含:名称,描述,参数等等字段

FunctionCallResult.java

package com.xxx.gpt.client.entity;import lombok.Data;@Data
public class FunctionCallResult {String name;String arguments;
}
  • FunctionCallResult 定义了名称,参数的字段

FunctionCallTest.java

package com.xxx.gpt.client.test;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xxx.gpt.client.ChatGPTClient;
import com.xxx.gpt.client.entity.*;
import com.xxx.gpt.client.util.Proxys;
import org.junit.Before;
import org.junit.Test;import java.net.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class FunctionCallTest {private ChatGPTClient chatGPTClient;@Beforepublic void before() {Proxy proxy = Proxys.http("127.0.0.1", 7890);chatGPTClient = ChatGPTClient.builder().apiKey("sk-6kchn0DasdfqOJqkc3aI665ct") // 填入自己的 key.timeout(900).proxy(proxy).apiHost("https://api.openai.com/").build().init();}// 调用gpt的时候,带上函数信息,让GPT选择是否调用@Testpublic void chat() {List<ChatFunction> functions = new ArrayList<>();ChatFunction function = new ChatFunction();function.setName("getCurrentWeather"); // 设置函数信息function.setDescription("获取给定位置的当前天气");function.setParameters(ChatFunction.ChatParameter.builder().type("object").required(Arrays.asList("location")).properties(JSON.parseObject("{\n" +"          \"location\": {\n" +"            \"type\": \"string\",\n" +"            \"description\": \"The city and state, e.g. San Francisco, " +"CA\"\n" +"          },\n" +"          \"unit\": {\n" +"            \"type\": \"string\",\n" +"            \"enum\": [\"celsius\", \"fahrenheit\"]\n" +"          }\n" +"        }")).build());// 添加到列表中functions.add(function);// 构造 messageMessage message = Message.of("上海的天气怎么样?");// 构造调用 api 参数ChatCompletion chatCompletion = ChatCompletion.builder().model(Model.GPT_3_5_TURBO_16K.getName()).messages(Arrays.asList(message)).functions(functions).maxTokens(8000).temperature(0.9).build();// 调用ChatCompletionResponse response = chatGPTClient.chatCompletion(chatCompletion);ChatChoice choice = response.getChoices().get(0);Message res = choice.getMessage();System.out.println(res);// 基于 finish reason 判断,如果是 function_call 就需要调用函数if ("function_call".equals(choice.getFinishReason())) {FunctionCallResult functionCall = res.getFunctionCall();String functionCallName = functionCall.getName();// 如果需要调用的是 getCurrentWeatherif ("getCurrentWeather".equals(functionCallName)) {String arguments = functionCall.getArguments();JSONObject jsonObject = JSON.parseObject(arguments);String location = jsonObject.getString("location");String unit = jsonObject.getString("unit");// 得到最终的结果String weather = getCurrentWeather(location, unit);res.setContent("");// 将结果 weather 告诉GPTcallWithWeather(weather, res, functions);}}}// 将结果传送给GPTprivate void callWithWeather(String weather, Message res, List<ChatFunction> functions) {Message message = Message.of("上海的天气怎么样?");Message function1 = Message.ofFunction(weather);function1.setName("getCurrentWeather");ChatCompletion chatCompletion = ChatCompletion.builder().model(Model.GPT_3_5_TURBO_16K.getName()).messages(Arrays.asList(message, res, function1)).functions(functions).maxTokens(8000).temperature(0.9).build();ChatCompletionResponse response = chatGPTClient.chatCompletion(chatCompletion);ChatChoice choice = response.getChoices().get(0);Message res2 = choice.getMessage();//上海目前天气晴朗,气温为 22 摄氏度。System.out.println(res2.getContent());}// 首先我们添加一个函数,函数是获取天气的信息,这里需要传入 location// return 我们这里的返回值是根据location构造出来的一个JSON, 这里设置的固定的,就是模拟接口,或者对接天气网站接口都可public String getCurrentWeather(String location, String unit) {return "{ \"temperature\": 22, \"unit\": \"celsius\", \"description\": \"晴朗\" }";}
}
// 本地有一个函数,将函数信息告诉chatgpt,并告诉chatgpt什么情况需要调用这个函数。由chatgpt判断是否需要调用该函数,如果需要在交互中进行调用。类似于委托机制
  • 第一步,需要告诉GPT我们有哪些函数?也就是这些函数是我们本地定义的
  • 第二步,是在调用GPT的时候带上函数信息,然后让GPT选择是否调用函数
  • 第三步,解析GPT的返回,如果GPT需要调用函数,我们在本地根据GPT返回的参数,调用函数获取结果,在获取结果之后,将结果告诉GPT
  • 通过GPT的函数调用的一个简单的示例
    • 看到通过 GPT函数调用的这种方式,可以将我们本地的一些函数
    • 可以和外部的一些第三方的工具做一个更好的集成
    • 整体的这个模式,就类似于委托的机制
  • GPT根据我们的自然语言,也就是我们的 Prompt 自行去判断是不是需要调用函数
  • 如果需要调用的话,然后再告诉我们,由我们完成调用
  • 完成调用之后,再将调用的结果返回给它
  • 整个过程是我们和GPT的程序上的密切交互

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CMD批量添加防火墙端口

通过命令提示符窗口输入命令&#xff0c;添加防火墙允许端口。语法格式如下&#xff1a; netsh advfirewall firewall add rule name新端口 protocolTCP localport新端口 dirin actionallow,block 其中allow允许&#xff0c;block禁止以33088端口为例&#xff0c;用管理员身份…

最长连续序列代码中的细节解读

最长连续序列 一、题目概述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 原题地址&#xff1a;https://leetcode.cn/problems/l…

C语言入门基础知识(一)

#C语言基础知识入门 说明C语言代码块结构 #include <stdio.h> //这个语句的功能是进行有关的预处理操作。include称为文件包命令&#xff0c;后面尖括号中内容称为头部文件或收文件。 #include "demo.h" //导入的是工程内部的头文件 int main() { //main 函…

【踩坑】解决maven的编译报错Cannot connect to the Maven process. Try again later

背景 新公司新项目, 同事拷给我maven的setting配置文件, 跑项目编译发现maven报 Cannot connect to the Maven process. Try again later. If the problem persists, check the Maven Importing JDK settings and restart IntelliJ IDEA 虽然好像不影响, 项目最终还是能跑起来…

2023-2024-1-高级语言程序设计-第2次月考编程题

注&#xff1a;此前已发布过的题解不再发布&#xff08;原题请在下面位置进行搜索&#xff09;。 7-1-2 排序(算法任意) 本题要求将给定的n个整数从大到小排序后输出&#xff08;可使用任意排序算法&#xff09;。 输入格式: 输入第一行给出一个不超过10的正整数n。第二行给…

笔记66:自注意力和位置编码

本地笔记地址&#xff1a;D:\work_file\&#xff08;4&#xff09;DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章&#xff1a;动手学深度学习~注意力机制 a a a a a a a a a a a a a a a a a a a

paddleocr文本检测改进变迁

数据增强&#xff1a; BDA(Base Data Augmentation)&#xff1a;色调变换&#xff0c;透明度变换&#xff0c;旋转&#xff0c;背景模糊&#xff0c;饱和度变换。 图像变换类&#xff1a;AutoAugment&#xff0c;RandAugment 图像裁剪类&#xff1a;CutOut、RandErasing、Hi…

万字长文带你搞定MMUTLBTWU

最近一直在学习内存管理&#xff0c;也知道MMU是管理内存的映射的逻辑IP&#xff0c;还知道里面有个TLB。 今天刚刚好看到了几篇前辈的文章&#xff0c;很是不错&#xff0c;于是这里来一起学习一下吧。 PART 一&#xff1a;MMU 架构篇 MMU&#xff08;Memory Management Uni…

人工智能-A*算法-八数码问题

一&#xff0c;A*算法设计思想 A*算法&#xff08;A-star&#xff09;是一种寻路算法&#xff0c;主要用于游戏、机器人等领域。 它的设计思想是将最短路径搜索问题转化为一个优化问题&#xff0c;通过计算每个节点的评分&#xff08;f(n) g(n) h(n)&#xff09;来寻找最优…

Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll

环境: Win7 旗舰版 64位 Rustdesk1.19自编译客户端 问题描述: Win7 旗舰版打开Rustdesk软件提示无法启动程序 ,计算机中丢失api-ms-win-shcore-scaling-|1-1-1.dll "api-ms-win-shcore-scaling-|1-1-1.dll" 是一个系统动态链接库文件,它是Windows操作系统的一…

Ubuntu20.04/Linux中常用软件的安装

文章目录 一、安裝与卸载微信二、安裝与卸载QQ三、安装Chrome浏览器并加入apt更新四、安裝VScode4.1 安装常用插件4.2 减小Ipch缓存&#xff1a; 五、安装代码对比工具Meld六、安裝WPS七、安装PDF阅读器Foxit Reader八、安装文献管理软件Zotero九、安装有道云笔记十、安装远程控…

二级等保,nginx设置问题,请求头,SSL密码组件,防web信息泄露,tls版本太老,头缺失

简洁版&#xff1a; 请按需添加&#xff0c;添加完成后重启nginx进行一下测试&#xff0c;看是否影响网站访问及功能。 add_header Content-Security-Policy "default-src self; script-src self unsafe-inline unsafe-eval; img-src self data:; style-src self unsafe-i…

python pyaudio对音频进行端点检测,检测出说话区间

python pyaudio对音频进行端点检测&#xff0c;检测出说话区间 主要采用过零率和语音能量来进行检测&#xff0c;并设置双阈值。 代码如下&#xff1a; # -*- coding: utf-8 -*- import wave import os import matplotlib.pyplot as plt import numpy as np# 判断是否变号 de…

基于Java SSM教学管理系统

教学管理是所有学校都应有的最基本的管理功能。教学管理系统实现学校的简单教学管理&#xff0c;包括学生入学登记、学生选课、教师登记考试成绩、补考处理、学生成绩统计、教师教学工作量统计&#xff0c;可随时查询出院系、教师、学生、课程、选课、成绩等情况。系统的主要信…

数据管理系统-week11-用户管理

文章目录 前言一、基本安全指南二、添加/删除用户帐户三、设置帐户资源限制四、锁定/解锁用户帐户参考文献 前言 本次课程介绍数据的基本安全指南&#xff0c;使用这些安全指南可以提高数据库的安全性&#xff0c;同时介绍一下如何添加/删除用户帐户&#xff0c;设置帐户资源限…

MysqlCluster集群部署

1.引言 1.1目的 部署MysqlCluster集群环境 1.2 MySQL集群Cluster原理 1. 数据分片 MySQL集群Cluster将数据分成多个片段&#xff0c;每个片段存储在不同的服务器上。这样可以将数据负载分散到多个服务器上&#xff0c;提高系统的性能和可扩展性。 2. 数据同步 MySQL集群…

PTA 7-225 sdut-C语言实验- 冒泡排序中数据交换的次数

听说过冒泡排序么&#xff1f;一种很暴力的排序方法。今天我们不希望你用它来排序&#xff0c;而是希望你能算出从小到大冒泡排序的过程中一共进行了多少次数据交换。 输入格式: 输入数据的第一行为一个正整数 T &#xff0c;表示有 T 组测试数据。 接下来T行&#xff0c;每行…

layui+ssm实现数据表格双击编辑更新数据

layui实现数据表格双击编辑数据更新 在使用layui加载后端数据请求时&#xff0c;对数据选项框进行双击即可实现数据的输入编辑更改 代码块 var form layui.form, table layui.table,layer parent.layer undefined ? layui.layer : parent.layer,laypage layui.laypag…

ElasticSearch学习笔记(一)

计算机软件的学习&#xff0c;最重要的是举一反三&#xff0c;只要大胆尝试&#xff0c;认真验证自己的想法就能收到事办功倍的效果。在开始之前可以看看别人的教程做个快速的入门&#xff0c;然后去官方网站看看官方的教程&#xff0c;有中文教程固然是好&#xff0c;没有中文…

备忘录不小心删了怎么办?如何找回我的备忘录?

如果你的记性不太好&#xff0c;或者每天需要记住、完成的事情很多&#xff0c;那么养成随手记事的好习惯是非常有必要的。因为手机是每个成年人都会随身携带的电子设备&#xff0c;所以直接在手机上记录事情比较简单、便捷。而手机备忘录、便签、笔记等工具类软件&#xff0c;…