使用java对接chatgpt(含全部代码)

使用java对接chatgpt(含全部代码)

  1. 因为对vscode不熟悉,前段界面我也是在idea里写的,先看一下效果图是这样,比较简陋请添加图片描述

我直接上代码,关于chatgpt前端的html,对了因为这个是我用之前写的匿名群聊改的,可能有多余的就是样式没去掉,如果有人用的话自己看着可以优化下
前端这方面还有两个问题还没有优化我说一下,就是chatgpt返回的有markdown样式的话不能正常解析,二一个是换行有问题
不过不影响大方面使用,后期我会优化的

<!DOCTYPE html>
<html lang="en">
<head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! --><meta name="viewport"content="width=device-width, initial-scale=1.0, maximum-scale=1.0,user-scalable=no,minimal-ui"><title>chatgpt问答</title><link rel="icon" href="./../images/favico.ico"><!--不同屏幕尺寸根字体设置--><script src="./../js/base.js"></script><!--element-ui的样式--><link rel="stylesheet" href="../../backend/plugins/element-ui/index.css"/><!--引入vant样式--><link rel="stylesheet" href="../styles/vant.min.css"/><!-- 引入样式  --><!--<link rel="stylesheet" href="../styles/index.css"/>--><!--本页面内容的样式--><link rel="stylesheet" href="./../styles/login.css"/><style scoped>.chat {font-size: 20px;padding-left: 5%;padding-right: 5%;padding-top: 20px;position: absolute;height: 75%;width: 90%;/*height: 500px; !* 设置内容高度 *!*/overflow-y: scroll; /* 启用垂直滚动 */overflow-x: hidden; /* 禁用水平滚动 */}.chat-header .back-btn {margin-right: 16px;cursor: pointer;}.chat-header .user-avatar {margin-right: 12px;width: 40px;height: 40px;border-radius: 50%;overflow: hidden;}.message-user img {width: 100%;height: 100%;object-fit: cover;object-position: center;}.chat-input {flex: 1;/*height: 40px;*//*margin-right: 10px;*/padding-bottom: 10px;}form {position: fixed;/*padding-top: 20px;*//*padding-left: 5%;*/bottom: 0;width: 90%/*padding-right: 5%;*/}p {color: black;font-size: 15px;margin-bottom: 10px;}.el-textarea {padding-right: 20px;display: inline-block;width: 70%;}.chat-input .el-button el-button--primary {margin-left: 10px;}.message-body img {width: 50%;height: 50%;object-fit: cover;}.avatar {margin-right: 12px;/*width: 40px;*//*height: 40px;*//*border-radius: 50%;*/overflow: hidden;float: left; /* 将用户头像框浮动到左侧 */margin-top: 5px; /* 稍微调整一下上边距,使其垂直居中 */}.message-content {overflow: hidden;}.message-content span{vertical-align: super;}.avatar img {width: 46px;height: auto;}.el-message-box {width: 300px;}[v-cloak] {display: none;}</style></head>
<body><div class="chat" id="login" ><div class="chat-history" v-cloak><div class="chat-bubble" v-for="message in messages" :key="message.id"><div class="message-content" v-if='message.role=="assistant"'><img :src="'./../images/1.ico'" alt="请等待"><span>{{message.name}}</span><div class="content">{{message.content}}</div></div><div class="message-content" v-else><img :src="'./../images/2.ico'"><span style="color: blue">{{message.name}}</span><div class="content">{{message.content}}</div></div><hr/></div><a id="myElement"></a></div><form><div class="chat-input"><el-input :disabled="isButtonDisabled"type="textarea"placeholder="发送消息对chatgpt提问..."v-model="input"></el-input><el-button type="primary"  @click="sendMessage">发送</el-button></div></form></div><!-- 开发环境版本,包含了有帮助的命令行警告 -->
<script src="../../backend/plugins/vue/vue.js"></script>
<!-- 引入组件库 -->
<script src="../../backend/plugins/element-ui/index.js"></script>
<!-- 引入vant样式 -->
<script src="./../js/vant.min.js"></script>
<!-- 引入axios -->
<script src="../../backend/plugins/axios/axios.min.js"></script>
<script src="./../js/request.js"></script>
<script src="./../api/login.js"></script></body><script>new Vue({el: "#login",data() {return {lock:true,input:'',messages:[],isButtonDisabled: false,isInteger: 0};},created() {let uuid = localStorage.getItem('uuid');if (uuid == null) {uuid = Math.random().toString(36).substring(2, 10);localStorage.setItem('uuid', uuid);}},watch: {messages(value) {if (this.isInteger != value.length) {this.isInteger = value.length;this.scrollToEnd();}},},methods:{async sendMessage(){if (this.isButtonDisabled) {return;}this.isButtonDisabled = true;let uuid = localStorage.getItem('uuid');if(this.input!=null&&this.input!=''&&this.lock==true){this.lock=false;this.messages.push({role:"user",content:this.input,name:"笨笨的杰瑞"});$axios.post("/chatgpt", { userId: uuid, message: this.input }).then((res) => {this.messages.push({role:'assistant',content:res,name:"聪明的汤姆"});this.lock=true;this.isButtonDisabled = false;});this.input='';}},scrollToEnd() {const element = document.getElementById('myElement');element.scrollIntoView(false);}}});
</script>
</html>

后端代码如下

@RestController
@RequestMapping("/chatgpt")
public class chatgptController {private final String OPENAI_API_KEY = "你的sk";private final String OPENAI_API_URL = "https://api.openai.com/v1/chat/completions";private Map<String, List<String>> userSessions = new HashMap<>();@PostMappingpublic String chatWithGPT(@RequestBody ChatRequest chatRequest) {//获取用户的标识和消息String userId = chatRequest.getUserId();String message = chatRequest.getMessage();// 检查用户会话是否存在if (!userSessions.containsKey(userId)) {//第一次进来肯定不存在会话中,这时候我们放进去userSessions.put(userId, new ArrayList<>());}//把发送的消息扔进这个人的list中List<String> sessionMessages = userSessions.get(userId);sessionMessages.add(message);// 构建请求头HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);headers.setBearerAuth(OPENAI_API_KEY);// 构建请求体String requestBody = buildRequestBody(userId, sessionMessages);// 发送请求RestTemplate restTemplate = new RestTemplate();SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();//我用的呆里端口33210,这个要改factory.setProxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress("127.0.0.1", 33210)));restTemplate.setRequestFactory(factory);HttpEntity<String> request = new HttpEntity<>(requestBody, headers);ResponseEntity<String> response = restTemplate.postForEntity(OPENAI_API_URL,request, String.class);// 提取回复消息String responseBody = response.getBody();String reply = extractReplyFromResponse(responseBody);System.out.println("-------------------"+reply+"--------------------");//把回复消息也存进当前用户的的list中,方便上下文记忆sessionMessages.add(reply);return reply;}private String buildRequestBody(String userId, List<String> sessionMessages) {JSONArray messagesArray = new JSONArray();for (String message : sessionMessages) {JSONObject messageObj = new JSONObject();messageObj.put("role", "user");messageObj.put("content", message);messagesArray.add(messageObj);}JSONObject requestBodyObj = new JSONObject();requestBodyObj.put("model", "gpt-3.5-turbo");requestBodyObj.put("messages", messagesArray);return requestBodyObj.toString();}private String extractReplyFromResponse(String response) {JSONObject jsonObject = JSONUtil.parseObj(response);JSONArray choices = jsonObject.getJSONArray("choices");JSONObject firstChoice = choices.getJSONObject(0);JSONObject message = firstChoice.getJSONObject("message");String reply = message.getStr("content");return reply;}
}

好了,这就是关于通过java调用chatgpt的全部代码了

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

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

相关文章

【开源免费】ChatGPT-Java版SDK重磅更新至1.0.10版,支持Tokens计算,快来一键接入!!!

简介 ChatGPT Java版SDK开源地址&#xff1a;github.com/Grt1228/cha… &#xff0c;目前收获将近1000个star。 有bug欢迎朋友们指出&#xff0c;互相学习&#xff0c;所有咨询全部免费。 最新版&#xff1a;1.0.10 <dependency><groupId>com.unfbx</groupId&…

面向Java开发者的ChatGPT提示词工程(1)

各位Java开发者们&#xff0c;欢迎来到万猫学社&#xff01;在这里&#xff0c;我将和大家分享ChatGPT提示词工程的系列文章&#xff0c;希望能够和大家一起学习和探讨提示词的最佳实践。 虽然互联网上已经有很多有关提示词的材料&#xff0c;比如那些“每个人都必须知道的30个…

JAVA 集成 chatGPT

1.文档地址&#xff1a; https://platform.openai.com/docs/introduction 下载demo&#xff1a;2. pom集成包 <dependency><groupId>com.theokanning.openai-gpt3-java</groupId><artifactId>client</artifactId><version>0.9.0</vers…

2023ChatGPT整理回答的Java高级工程师面试题

本文整理了一些 ChatGPT 回答的 java 面试题,希望能够帮助到更多的人! 死锁与活锁的区别,死锁与饥饿的区别? 死锁和活锁都是多线程并发编程中的问题,它们的区别主要在于线程是否能够继续执行。 死锁指的是两个或以上进程因竞争资源而造成的一种互相等待的现象。当多个线…

java集成chatGpt完整案例代码(效果和官网一样逐字输出)

要集成chatGpt参考我上一篇文章即可。但是&#xff0c;如果要实现官网一样的效果&#xff0c;逐字输出&#xff0c;难度就提升了不少了。经过在官网的研究发现它应该是采用了SSE技术&#xff0c;这是一种最新的HTTP交互技术。SSE(Server-Sent Events):通俗解释起来就是一种基于…

【程序源代码】ChatGPT Java Api

“ 关键字: “ChatGPT AI 人工智能" 01 ———— 【总体介绍】 ChatGPT Java Api 使用 maven <dependency><groupId>com.github.plexpt</groupId><artifactId>chatgpt</artifactId><version>1.1.2</version> </dependency…

体验使用 InsCode AI 创作助手 来帮我完成一篇博客

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 InsCode AI 创作助手 它来啦回答不满意可以要求重新生成在输入 prompt 时&#…

厉害了!北大3位硕博生搞出ChatGPT版Excel!动动嘴就能自动处理表格……免费用!...

来源&#xff1a;量子位 做Excel表&#xff0c;真就动动嘴就够了&#xff01; 看&#xff0c;输入想要干的事&#xff1a;给学生成绩排个名吧。 简单敲个回车&#xff0c;表格唰一下就列好了&#xff01; 检查一遍也没错。 还能跨表格处理。 比如标记出两张不同表格中排名都在前…

「原驼」炸场:跑分达ChatGPT的99%,人类难以分辨!

源 | 量子位 大家好&#xff0c;这里是 NewBeeNLP。羊驼家族又出新品&#xff0c;直接炸场&#xff01;自动测试分数达到ChatGPT的99.3%&#xff0c;人类难以分辨两者的回答…… 这是开源大模型最新成果&#xff0c;来自羊驼家族的又一重磅成员——华盛顿大学原驼&#xff08;G…

《用ChatGPT自学的正确打开方式》

丰色 发自 凹非寺量子位 | 公众号 QbitAI 这两天&#xff0c;一个用ChatGPT进行自学的免费工具火了&#xff1a; 它叫AIbus&#xff0c;主界面是一块白板&#xff0c;只需写下你想探索的任何主题&#xff0c;比如“傅立叶变换”&#xff0c;它就会在几秒之内给出n个建议。 然后…

「实战」将多种AI工具整合到游戏开发工作流;AI应用推荐writeout;ControlNet新手实操流程图;ChatGPT复现之路 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 『Notion AI 这波大赚』一个月内&#xff0c; AI 为 Notion 带来至少1000万美金ARR 作为最早一批接入 ChatGPT 的产品&#xff0c;Not…

从ChatGPT到Auto-GPT,自主人工智能真的要来了吗?

随着ChatGPT的持续爆火&#xff0c;人们在使用ChatGPT的时也发现了它的局限性&#xff0c;就是需要使用者自己来给GPT提示&#xff08;prompt&#xff09;。 如果你想感受ChatGPT强大&#xff0c;又没有OpenAI账号&#xff0c;可以关注《可立AI科技》这个微信公众号&#xff0c…

编辑部已成羊村,这几天幸亏有ChatGPT(doge)

梦晨 羿阁 发自 凹非寺量子位 | 公众号 QbitAI 坏事了&#xff0c;AI真的来抢饭碗了。 还是我的饭碗&#xff01; 这两天你们看的推送&#xff0c;有些标题是AI帮忙取的&#xff0c;有些文章甚至由AI完成了主要工作。 我呢&#xff1f;我不过是打打下手&#xff0c;加些过渡句&…

我用 ChatGPT 学设计模式之访问者模式

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;蚂蚁集团高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《EffectiveJava》独家解析》专栏作者。 热门文章推荐…

Spring Cloud Gateway路由到Amazon S3签名失败处理

Spring Cloud Gateway路由到Amazon S3签名失败处理 背景 最近在预研统一存储网关&#xff0c;想到就是使用Spring Cloud Gateway作为网关的入口&#xff0c;再反向代理到S3对象存储服务器。 软件版本 网关&#xff1a;Spring Cloud Gateway 3.1.2 s3对象存储&#xff1a;m…

基于java(springboot)和go-cqhttp实现QQ机器人

目录 yh-qqrobot机器人简介go-cqhttp搭建1.下载应用2.生成bat文件3. 初始化项目4. 配置5. 运行项目 yh-qqrobot搭建搭建后端1. 导入sql文件2. 配置文件3. 导入到idea 搭建前端 yh-qqrobot机器人简介 yh-qqrobot是一个基于若依框和go-cqhttp集成的系统&#xff0c;一开始我只是揣…

【基于Flink的城市交通实时监控平台】需求一:卡口车辆超速情况检测

案例需求&#xff1a; 从kafka的topic-car中读取卡口数据&#xff0c;将超速车辆写入mysql的select * from t_speeding_info表&#xff0c;当通过卡口的车速超过60就认定为超速 卡口数据格式&#xff1a; action_time long --摄像头拍摄时间戳&#xff0c;精确到秒, monitor…

chatgpt赋能python:Python下载工具:提高工作效率的不二之选

Python下载工具&#xff1a;提高工作效率的不二之选 作为一名有10年Python编程经验的工程师&#xff0c;我深知一款好用的下载工具对于我们的工作效率有多么重要。因此&#xff0c;在众多Python工具中&#xff0c;我多次选用了一些好用的下载工具&#xff0c;并且对它们进行了…

将 ChatGLM2-6B 部署成 OpenAI API 服务

将 ChatGLM2-6B 部署成 OpenAI API 服务 0. 背景1. FastChat 部署使用 ChatGLM2-6B1-1. 创建虚拟环境1-2. 克隆代码1-3. 安装依赖库1-4. 使用 UI 进行推理1-5. 使用 OpenAI API 方式进行推理 0. 背景 最近一直在使用 OpenAI 的 API 做一些学习和调研。使用 OpenAI 的 API&…

chatgpt赋能Python-python_downloader

优秀Python下载器的重要性 在今天的数字化世界中&#xff0c;下载器是一个极其重要的工具。随着互联网速度的不断提升和存储设备的容量的增加&#xff0c;大量的数据和文件需要及时下载到本地计算机或存储设备中。许多编程语言都提供了相应的下载库&#xff0c;但Python是其中…