java接入gpt开发

前情提要

本次文章使用编译器为IDEA2020

使用GPT模型为百度旗下的千帆大模型

如果是个人用或者不流传出去,可以无脑入,因为会免费送20块钱(够用上万次)

代金卷查看

正式教程:

百度智能云控制台 (baidu.com)

按照步骤创建什么都不要担心

获取AccessToken 
无论是实现调用免费的接口还是付费接口,都要先获取AccessToken,目的是鉴权。

查看对应文档获取access_token 获取access_token - 千帆大模型平台 | 百度智能云文档 (baidu.com)

根据文档我们知道我们向接口发起一个POST请求。一个请求头以及三个Query参数。

首先我们在pom文件中导入了如下jar包

    <dependencies><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.8.1</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.19</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.36</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.8</version></dependency></dependencies>

编写测试获取AccessToken的方法 

@Slf4j
public class Chat {private final String ACCESS_TOKEN_URI = "https://aip.baidubce.com/oauth/2.0/token";private String apiKey = "yourApikey";private String secretKey = "yourSecetkey";private String accessToken;private OkHttpClient client = new OkHttpClient();public boolean getAccessToken(){MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, "");//创建一个请求Request request = new Request.Builder().url(ACCESS_TOKEN_URI+"?client_id=" + apiKey + "&client_secret=" + secretKey + "&grant_type=client_credentials").method("POST",body).addHeader("Content-Type", "application/json").build();try {//使用浏览器对象发起请求Response response = client.newCall(request).execute();//只能执行一次response.body().string()。下次再执行会抛出流关闭异常,因此需要一个对象存储返回结果String responseMessage = response.body().string();log.debug("获取accessToken成功");JSONObject jsonObject = JSON.parseObject(responseMessage);accessToken = (String) jsonObject.get("access_token");return true;} catch (IOException e) {e.printStackTrace();}return false;}
}

我们将调用的获取AccessToken接口获取到的信息转为JSON格式后,获取access_token属性值,复制给类属性。 

测试

public class Main {public static void main(String[] args) throws InterruptedException {Chat chat = new Chat();boolean result = chat.getAccessToken();System.out.println(result);}
}

19:46:13,387 DEBUG Chat:48 - 获取accessToken成功
true

实现Prompt模板接口调用

Prompt模板 - 千帆大模型平台 | 百度智能云文档 (baidu.com)查看对应文档Prompt模板 - 千帆大模型平台 | 百度智能云文档 (baidu.com)

要想调用该接口,我们需要事先创建好Promet模板。创建模板过程如下

创建好模板后,我们后续需要调用模板ID。

具体实现代码如下

    /*** 调用Prompt接口* @param param*/public void getPrompt(int id,String param){Request request = new Request.Builder()
//        https://aip.baidubce.com/rest/2.0/wenxinworkshop/api/v1/template/info?access_token=xxx&id=7964&name=value.url(CHAT_URI + "?access_token="+accessToken+"&id="+id+"&name="+param).addHeader("Content-Type", "application/json").method("GET",null).build();try {Response responseMessage = client.newCall(request).execute();JSONObject jsonObject = JSON.parseObject(responseMessage.body().string());log.debug(jsonObject.toString());Object result = jsonObject.get("result");log.debug("{}",result.toString());} catch (IOException e) {e.printStackTrace();}}

测试

public class Main {public static void main(String[] args) throws InterruptedException {Chat chat = new Chat();boolean result = chat.getAccessToken();if (result){chat.getPrompt(7964,"zmbwcx");}}
}

19:48:04,906 DEBUG Chat:48 - 获取accessToken成功
19:48:05,144 DEBUG Chat:99 - {"result":{"templateName":"测试接口调用","templateContent":"文章内容:{name}测试接口调用成功","templateId":7964,"content":"文章内容:zmbwcx测试接口调用成功","templateVariables":"name"},"log_id":"0hkyy9izb4azvsgp","success":true,"status":200}
19:48:05,145 DEBUG Chat:101 - {"templateName":"测试接口调用","templateContent":"文章内容:{name}测试接口调用成功","templateId":7964,"content":"文章内容:zmbwcx测试接口调用成功","templateVariables":"name"}

实现对话接口调用

同样是观察文档,不过实现对话接口调用比实现调用Prompt接口稍微复杂一些。需要创建一些类来设置我们的参数。

创建请求参数类

@Data
public class RequestMessage {/*** 聊天上下文*/List<Message> messages = new ArrayList<>();/*** 范围(0~1.0]* 较高的数值会使输出更加随机*/float temperature = Float.parseFloat("0.95");/*** 影响文本的多样性,取值越大生成的文本多样性越强* 建议该参数与temperature只设置一个。建议top_p和temperature不要同时更改*/float top_p = Float.parseFloat("0.8");/*** 通过对已生成的token增加惩罚,减少重复生成的现象* 值越大,惩罚越大* 取值范围[1,2]*/float penalty_score = Float.parseFloat("1.0");/*** 是否以流式接口形式返回数据*/boolean stream = false;/*** 模型人设*/String system = null;/*** 表示用户唯一标识符,用于监测和检测滥用行为。防止接口恶意调用。*/String user_id = "";public void addMessage(Message message){this.messages.add(message);}
}

创建Message类 

@Data
public class Message {/*** 用户角色* 目前支持:* user 用户* assistant 对话助手*/String role;/*** 对话内容。*/String content;public Message(String role, String content) {this.role = role;this.content = content;}
}

设置接收响应信息类

@Data
public class ResponseMessage {//本轮对话idString id;//回包类型。 chat.completion:多轮对话返回String object;//时间戳int created;//表示当前子句的序号。只有在流式接口模式下才会返回该字段int sentence_id;//表示当前子句是否是最后一句。只有在流式接口模式下会返回该字段。boolean is_end;//对话返回结果。String result;/*** 表示用户输入是否存在安全,是否关闭当前会话,清理历史回话信息。* true:是,表示用户输入存在安全风险,建议关闭当前会话,清理历史会话信息。* false:否,表示用户输入无安全风险。*/boolean need_clear_history;//token统计信息,token数 = 汉字数+单词数*1.3 (仅为估算逻辑)。Usage usage;
}

 设置Usage类

public class Usage {//问题token数int prompt_tokens;//回答token数int completion_tokens;//token总数int total_tokens;
}

 如果看文档不太清楚的话,我们可以通过在线调试平台观察一下请求所需要的必须参数与响应过来的参数结构。

接下来我们编写Chat类 

@Slf4j
public class Chat {private final String ACCESS_TOKEN_URI = "https://aip.baidubce.com/oauth/2.0/token";private final String CHAT_URI = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant";private String apiKey = "yourApikey";private String secretKey = "yourSecretkey";private String accessToken = "";private OkHttpClient client ;//请求参数private RequestMessage requestBody = new RequestMessage();//响应超时时间private int responseTimeOut = 5000;public Chat(){this.client = new OkHttpClient.Builder().readTimeout(responseTimeOut,TimeUnit.SECONDS).build();}public Chat(int responseTimeOut){this.client = new OkHttpClient.Builder().readTimeout(responseTimeOut,TimeUnit.SECONDS).build();}public boolean getAccessToken(){MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, "");//创建一个请求Request request = new Request.Builder().url(ACCESS_TOKEN_URI+"?client_id=" + apiKey + "&client_secret=" + secretKey + "&grant_type=client_credentials").method("POST",body).addHeader("Content-Type", "application/json").build();try {//使用浏览器对象发起请求Response response = client.newCall(request).execute();//只能执行一次response.body().string()。下次再执行会抛出流关闭异常,因此需要一个对象存储返回结果String responseMessage = response.body().string();log.debug("获取accessToken成功");JSONObject jsonObject = JSON.parseObject(responseMessage);accessToken = (String) jsonObject.get("access_token");return true;} catch (IOException e) {e.printStackTrace();}return false;}/**** 获取问题参数,返回答案* @param question*/public void getAnswer(String question){//通过参数获取一个MessageMessage message = new Message("user",question);//将新的问题添加到消息上下文requestBody.addMessage(message);String jsonStr = JSON.toJSONString(requestBody);MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, jsonStr);Request request = new Request.Builder().url(CHAT_URI + "?access_token="+accessToken).addHeader("Content-Type", "application/json").method("POST",body).build();try {Response response = client.newCall(request).execute();log.debug("发送一次请求,询问问题:{}",question);String responseJsonStr = response.body().string();ResponseMessage responseMessage = JSON.parseObject(responseJsonStr, ResponseMessage.class);System.out.println("返回的响应结果为:"+responseJsonStr);String result = responseMessage.getResult();String answer = result.replaceAll("\n+", "\n");log.debug("{}",answer);Message assistant = new Message("assistant", answer);requestBody.addMessage(assistant);} catch (IOException e) {e.printStackTrace();}}public void getRequestBody(){System.out.println(JSON.toJSONString(requestBody));}    
}

测试

public class Main {public static void main(String[] args) throws InterruptedException {Chat chat = new Chat();boolean result = chat.getAccessToken();if (result){Scanner scanner = new Scanner(System.in);String question = scanner.nextLine();while(!"q".equals(question)){chat.getAnswer(question);chat.getRequestBody();question = scanner.nextLine();}}}
}

注意!!

以上信息均为使用Java调用千帆大模型接口-CSDN博客大佬教程(此处抄袭仅为整合自用)

但是我需要的是可以提供阅读背景式的调用,接下来以我的web作业为例:

我需要gpt扮演我的网站客服为用户回答问题:实现场景如下

ok,进入正题:

根据要求配置插件后在插件详情页面有

我们来看一下开发文档域内知识搜索增强插件API调用说明 - 千帆大模型平台 | 百度智能云文档 (baidu.com)

注意请求体发生了改变!!!

我一直以为一样结果在这里被坑惨了

java代码简单修改一下

 /**** 获取问题参数,返回答案* @param question*/public String getAnswer(String question) throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();Map<String, Object> payload = new HashMap<>();payload.put("query", question);payload.put("verbose", true);String jsonString = mapper.writeValueAsString(payload);MediaType mediaType = MediaType.parse("application/json");RequestBody body = RequestBody.create(mediaType, jsonString);Request request = new Request.Builder().url(CHAT_URI + "?access_token="+accessToken).addHeader("Content-Type", "application/json").method("POST",body).build();try {Response response = client.newCall(request).execute();log.debug("发送一次请求,询问问题:{}",question);String responseJsonStr = response.body().string();ResponseMessage responseMessage = JSON.parseObject(responseJsonStr, ResponseMessage.class);System.out.println("返回的响应结果为:"+responseJsonStr);String result = responseMessage.getResult();return result;} catch (IOException e) {e.printStackTrace();return null;}}

Controller层代码:

 @PostMappingpublic String ai(@RequestBody String text) throws JsonProcessingException {log.info("沟通文本为:{}",text);//ai接口Chat chat = new Chat();boolean result = chat.getAccessToken();if(result) {String ai = chat.getAnswer(text);return  "美女客服:"+ai;}return  "客服忙去了~";}

ok,完美解决

最后总结!

遇到一个新东西,不要想当然的操作,还是要去看一下开发者文档!!!!

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

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

相关文章

JMS(Java Message Service)使用指南

介绍 JMS即Java消息服务&#xff08;Java Message Service&#xff09;应用程序接口&#xff0c;是一个Java平台中关于面向消息中间件&#xff08;MOM&#xff09;的API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。它是一…

基于单片机智能病床呼叫系统设计

**单片机设计介绍&#xff0c;基于单片机智能病床呼叫系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的智能病床呼叫系统是一种利用单片机技术设计的医疗设备&#xff0c;它能够帮助病人在住院期间快速、方便…

国内大厂机器人赛道产品

大疆 大疆无人机自然不必说&#xff0c;除此之外大疆搞机甲大师&#xff0c;教育机器人。 字节 当前字节在机器人领域只是初步探索阶段&#xff0c;目前尚未发布相关产品&#xff08;截止至23.12&#xff09;。 管理层想法&#xff1a; 跟已有业务做结合&#xff0c;服务好…

Java设计模式分类

java的设计模式大体上分为三大类&#xff1a; 创建型模式&#xff08;5种&#xff09;&#xff1a;工厂方法模式&#xff0c;抽象工厂模式&#xff0c;单例模式&#xff0c;建造者模式&#xff0c;原型模式。 结构型模式&#xff08;7种&#xff09;&#xff1a;适配器模式&am…

传感器(一) :IMU / 陀螺仪模块

IMU / 陀螺仪模块 一、概述二、注意参数2.1 陀螺仪芯片标准&#xff08;MPU6050)2.2 参数说明 三、IMU模式使用注意事项3.1 IMU模块安装注意事项3.2 为什么IMU要安装在机器中心位置 四、常见陀螺仪芯片品牌 一、概述 IMU全称为惯性测量单元&#xff0c;可以通过测量物体在三维空…

Linux实用操作

一、各类小技巧&#xff08;快捷键&#xff09; 1.1 ctrl c 强制停止 Linux某些程序的运行&#xff0c;如果想要强制停止它&#xff0c;可以使用快捷键ctrl c 命令输入错误&#xff0c;也可以通过快捷键ctrl c&#xff0c;退出当前输入&#xff0c;重新输入 1.2 ctrl d…

ReLU(Rectified Linear Unit)和Sigmoid激活函数

ReLU&#xff08;Rectified Linear Unit&#xff09;和Sigmoid都是神经网络中常用的激活函数。 特点&#xff1a; ReLU是一种简单而有效的激活函数。它对于正数部分直接返回输入&#xff0c;对于负数部分返回零。这种非线性转换有助于网络学习更复杂的表示。ReLU在许多深度学习…

自治调优!人大金仓解放DBA双手

数据库系统的性能是确保整个应用系统高效运转的关键因素&#xff0c;因此数据库性能调优工作至关重要。KingbaseES通过将人工调优过程内化为数据库内核&#xff0c;成功实现了自治调优。这种创新的调优方案为DBA提供了更高效且准确的性能调优途径&#xff0c;同时也显著降低了数…

构建VREP和MATLAB联合仿真实验平台,控制机械臂末端按照固定轨迹移动

构建VREP和MATLAB联合仿真实验平台&#xff0c;控制机械臂末端按照固定轨迹移动。主要工作如下&#xff1a; &#xff08;1&#xff09;solidworks构建机械臂模型&#xff1b; &#xff08;2&#xff09;将solidworks中构建的模型导入VREP中建立机械臂的多体动力学模型&#xf…

【Unity动画】什么是任意状态(Any state)

&#xff08;Any state&#xff09;可以从某个状态A直接切换到另一个状态 B\C\D\E\F 比如A到C的过渡&#xff0c;直接设置从Any state 到C的过渡线触发参数即可。而不需要让A到C直接在连接&#xff0c;同样&#xff0c;B到C之间也无需直接链接。 这样设计是在每一个动画之间都…

【论文笔记】Gemini: A Family of Highly Capable Multimodal Models——细看Gemini

Gemini 【一句话总结&#xff0c;对标GPT4&#xff0c;模型还是transformer的docoder部分&#xff0c;提出三个不同版本的Gemini模型&#xff0c;Ultra的最牛逼&#xff0c;Nano的可以用在手机上。】 谷歌提出了一个新系列多模态模型——Gemini家族模型&#xff0c;包括Ultra…

Java 何时会触发一个类的初始化

Java 何时会触发一个类的初始化&#xff1f; 使用new关键字创建对象访问类的静态成员变量 或 对类的静态成员变量进行赋值调用类的静态方法反射调用类时&#xff0c;如 Class.forName()初始化子类时&#xff0c;会先初始化其父类&#xff08;如果父类还没有进行过初始化的话&a…

找不到WMVCORE.dll怎么办?一键解决WMVCORE.dll缺失的详细方法分享

当打开软件时提示wmvcore.dll丢失&#xff0c;这可能是由于以下几个原因导致的&#xff1a; 系统文件损坏&#xff1a;wmvcore.dll是系统文件&#xff0c;可能会因为各种原因&#xff08;如病毒感染、系统错误、软件卸载等&#xff09;而损坏。 软件依赖问题&#xff1a;某些…

用 Python 自动创建 Markdown 表格

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Markdown表格是文档中整理和展示数据的重要方式之一。然而&#xff0c;手动编写大型表格可能会费时且容易出错。本文将介绍如何使用Python自动创建Markdown表格&#xff0c;通过示例代码详细展示各种场景下的创建…

Linux基础指令详解(1)

操作系统的概念 百度百科 操作系统&#xff08;英语&#xff1a;Operating System&#xff0c;缩写&#xff1a;OS&#xff09;是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境&#xff0c;操作系…

【Python网络爬虫入门教程1】成为“Spider Man”的第一课:HTML、Request库、Beautiful Soup库

Python 网络爬虫入门&#xff1a;Spider man的第一课 写在最前面背景知识介绍蛛丝发射器——Request库智能眼镜——Beautiful Soup库 第一课总结 写在最前面 有位粉丝希望学习网络爬虫的实战技巧&#xff0c;想尝试搭建自己的爬虫环境&#xff0c;从网上抓取数据。 前面有写一…

论文阅读——Deformable ConvNets v2

论文&#xff1a;https://arxiv.org/pdf/1811.11168.pdf 代码&#xff1a;https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch 1. 介绍 可变形卷积能够很好地学习到发生形变的物体&#xff0c;但是论文观察到当尽管比普通卷积网络能够更适应物体形变&#xff…

Numpy数组的去重 np.unique()(第15讲)

Numpy数组的去重 np.unique()(第15讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

Linux权限详解

Linux权限 文章目录 Linux权限一、root账号与普通账号二、Linux权限管理三、权限权值表示方法四、文件访问权限的设置方法五、粘滞位六、权限总结 前言&#xff1a; 我们在学习Linux的时候&#xff0c;我们知道在Linux下一切皆文件&#xff0c;而不同的文件对于不同的用户有不同…

第二十一章总结。。

计算机网络实现了堕胎计算机间的互联&#xff0c;使得它们彼此之间能够进行数据交流。网络应用程序就是再已连接的不同计算机上运行的程序&#xff0c;这些程序借助于网络协议&#xff0c;相互之间可以交换数据&#xff0c;编写网络应用程序前&#xff0c;首先必须明确网络协议…