java springboot 整合webSocket接入调用chatGPT3.5接口实现自由返回

java springboot 中使用webSocket接入openAI接口调用chatGPT3.5接口实现自由返回

在springboot中添加webSocketServer

@Component
@Anonymous
@ServerEndpoint(“/websocket/{id}”) // 访问路径: ws://localhost:8080/websocket
public class WebSocketServer {

protected static final Logger log = LoggerFactory.getLogger(WebSocketServer.class);/*** 客户端ID*/
private String id="";/*** 与某个客户端的连接会话,需要通过它来给客户端发送数据*/
private Session session;/*** 记录当前在线连接数(为保证线程安全,须对使用此变量的方法加lock或synchronized)*/
private static int onlineCount = 0;/*** 用来存储当前在线的客户端(此map线程安全)*/
private static ConcurrentHashMap<String, WebSocketServer> webSocketMap = new ConcurrentHashMap<>();private static ConcurrentHashMap<String, StringBuffer> stringBufferMap = new ConcurrentHashMap<>();/*** 连接建立成功后调用*/
@OnOpen
public void onOpen(@PathParam(value = "id") String id, Session session) {this.session = session;// 接收到发送消息的客户端编号this.id = id;// 加入map中StringBuffer stringBuffer = new StringBuffer();stringBufferMap.put(id,stringBuffer);webSocketMap.put(id, this);

// try {
// sendMessage(“WebSocket连接成功”);
// } catch (Exception e) {
//
// }
}
/**
* 发送消息
* @param message 要发送的消息
*/
private void sendMessage(String message) throws IOException {
this.session.getBasicRemote().sendText(message);
}

// 关闭连接调用
@OnClose
public void close() {}// 接收消息
@OnMessage
public void message(String message, Session session) {System.out.println("client send: " + message);
}
/*** 推送信息给指定ID客户端,如客户端不在线,则返回不在线信息给自己** @param message 客户端发来的消息* @param sendClientId 客户端ID*/
public void sendToUser(String message, String sendClientId) throws IOException {if (webSocketMap.get(sendClientId) != null) {if (!id.equals(sendClientId)) {if("DONE".equals(message)){StringBuffer stringBuffers = new StringBuffer();stringBufferMap.put(sendClientId,stringBuffers);}else{StringBuffer stringBuffer = stringBufferMap.get(sendClientId);StringBuffer append = stringBuffer.append(message);stringBufferMap.put(sendClientId,append);}webSocketMap.get(sendClientId).sendMessage(message);} else {webSocketMap.get(sendClientId).sendMessage(message);}} else {// 如客户端不在线,则返回不在线信息给自己sendToUser("当前客户端不在线", id);}
}public String  getString(String sendClientId){return stringBufferMap.get(sendClientId).toString();
}

}

添加用户询问缓存机制

public class LocalCache {
/**
* 缓存时长
/
public static final long TIMEOUT = 5 * DateUnit.MINUTE.getMillis();
/
*
* 清理间隔
/
private static final long CLEAN_TIMEOUT = 5 * DateUnit.MINUTE.getMillis();
/
*
* 缓存对象
*/
public static final TimedCache<String, Object> CACHE = CacheUtil.newTimedCache(TIMEOUT);

static {//启动定时任务CACHE.schedulePrune(CLEAN_TIMEOUT);
}

}

调用openai国内一位大佬写的jar 注意因为我项目使用了其他日志文件,所以我排除了jar包自带的slf4j

    <dependency><groupId>com.unfbx</groupId><artifactId>chatgpt-java</artifactId><version>1.0.6</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>slf4j-simple</artifactId></exclusion></exclusions></dependency>

创建SSE接口转发类OpenAIEventSourceListener也可自定义其他长连接

public class OpenAIEventSourceListener extends EventSourceListener {

protected static final Logger log = LoggerFactory.getLogger(OpenAIEventSourceListener.class);
private String sockentId;private WebSocketServer webSocket;private final AppService appService;public OpenAIEventSourceListener(WebSocketServer webSocket, String sockentId) {this.sockentId = sockentId;this.webSocket = webSocket;
}/*** {@inheritDoc}*/
@Override
public void onOpen(EventSource eventSource, Response response) {log.info("OpenAI建立sse连接...");
}/*** {@inheritDoc}*/
@SneakyThrows
@Override
public void onEvent(EventSource eventSource, String id, String type, String data) {//log.info("OpenAI返回数据:{}", sockentId);try {if (data.equals("[DONE]")) {String string = webSocket.getString(sockentId);log.info("问题最终答案:"+string);//log.info("OpenAI返回数据结束了");webSocket.sendToUser("DONE",sockentId);webSocket.close();return;}ChatCompletionResponse completionResponse = JSON.parseObject(data, ChatCompletionResponse.class);if(ObjectUtil.isNotNull(completionResponse.getChoices().get(0).getDelta().getContent())){// log.info("返回数据"+completionResponse.getChoices().get(0).getDelta().getContent());webSocket.sendToUser(completionResponse.getChoices().get(0).getDelta().getContent(),sockentId);}}catch (Exception e){}
}@Override
public void onClosed(EventSource eventSource) {log.info("OpenAI关闭sse连接...");
}@SneakyThrows
@Override
public void onFailure(EventSource eventSource, Throwable t, Response response) {if(Objects.isNull(response)){return;}ResponseBody body = response.body();if (Objects.nonNull(body)) {log.error("OpenAI  sse连接异常data:{},异常:{}", body.string(), t);} else {log.error("OpenAI  sse连接异常data:{},异常:{}", response, t);}eventSource.cancel();
}

}

Controller层

@RepeatSubmit
@Operation(summary = "用户问询")
@PostMapping("/enquiry")
public R<String> enquiry(//需要定义对象接收参数) {String messageContext = (String) LocalCache.CACHE.get();List<Message> messages = new ArrayList<>();if (StrUtil.isNotBlank(messageContext)&&openAIBo.getType()==1) {messages = JSONUtil.toList(messageContext, Message.class);if (messages.size() >= 10) {messages = messages.subList(1, 10);}Message currentMessage = Message.builder().content(openAIBo.getLastPrompt()).role(Message.Role.USER).build();messages.add(currentMessage);} else {Message currentMessage = Message.builder().content(openAIBo.getLastPrompt()).role(Message.Role.USER).build();messages.add(currentMessage);}log.info("最终问题:{}",messages);OpenAiStreamClient client = OpenAiStreamClient.builder().connectTimeout(50).readTimeout(50).writeTimeout(50).apiKey(//openai的token).apiHost(//自己香港服务器或者国外服务器的转发).build();WebSocketServer webSocketServer = new WebSocketServer();OpenAIEventSourceListener openAIEventSourceListener = new OpenAIEventSourceListener(webSocketServer,openAIBo.getUid(), appService);client.streamChatCompletion(messages, openAIEventSourceListener);LocalCache.CACHE.put(userId.toString(), JSONUtil.toJsonStr(messages), LocalCache.TIMEOUT);return R.ok("询问成功");
}

香港/国外服务器nginx转发配置

server {
listen 8080;
server_name //自己服务器IP;
access_log /home/nginx/log/api.openai.com.log;
error_log /home/nginx/log/api.openai.com.err.log;
location / {
proxy_pass https://api.openai.com/;

	client_max_body_size 10M;client_body_buffer_size 128k;proxy_connect_timeout 600;proxy_send_timeout 600;proxy_read_timeout 600;proxy_buffer_size 4k;proxy_buffers 4 32k;proxy_busy_buffers_size 64k;proxy_temp_file_write_size 64k;proxy_set_body $request_body;
}

}

结尾

项目中确实有自己项目中的对象需要自己添加,因为我是自己的项目也看了国内大佬的jar把国内大佬jar项目放到这里感兴趣可以研究研究其他连接方式。
https://github.com/Grt1228/chatgpt-steam-output

博主使用这套代码开发了一个小程序感兴趣朋友可以看看,自己使用。确实最近国内VPN被封的挺多的,所以有一部分问题还是能帮到我的。微信扫码打开小程序。目前还是第一版后续会继续研究,有感兴趣可以私信一起讨论。在这里插入图片描述

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

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

相关文章

探索ChatGPT背后的网络基础设施

ChatGPT是OpenAI公司开发的一款聊天机器人应用&#xff0c;自2022年11月推出以来以迅雷不及掩耳盗铃之势火爆全球。ChatGPT不仅可以模仿人类对话&#xff0c;还可以创建音乐、电视剧、童话故事和学生论文&#xff0c;甚至是编写和调试计算机程序。 截至2023年1月&#xff0c;C…

chatgpt帮我写的一个小程序气泡框代码

效果图 这是一个气泡框 .bubble { position: relative; padding: 10px; border-radius: 8px; background-color: #ddd; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3); } .triangle { position: absolute; width: 0; height: 0; top: -10px; left: 50%; margin-left: -10px; bor…

2023 ChatGPT智能AI机器人微信小程序源码

最近ChatGPT智能AI聊天突然爆火了 ChatGPT 是 OpenAI 开发的一款专门从事对话的人工智能聊天机器人原型。 聊天机器人是一种大型语言模型&#xff0c;采用监督学习和强化学习技术。 ChatGPT 于 2022 年 11 月推出&#xff0c;尽管其回答事实的准确性受到批评&#xff0c;但因…

三分钟完成小程序 uni-app、网站接入chatgpt实现聊天效果

利用laf云开发实现uni-app调用chatGPT API&#xff0c;实现与openai对话 1.实现后台接口 注册laf云开发账号 https://laf.dev/ 注册一个应用后进入这个页面&#xff1a; 下载依赖 chatgpt配置apiKey写send函数 //send函数源码 import cloud from lafjs/cloud export async…

离大谱,直接让chatG开发微信小程序

大家好&#xff0c;最近chatgpt不是比较火嘛&#xff0c;小浅浅我也打算来凑凑热闹&#xff0c;通过一番魔法操作后&#xff0c;终于是搞定了账号环境这些东西&#xff0c;上手体验了一下之后发现确实不错&#xff0c;可以直接提需求给他&#xff0c;然后帮你出思路和写代码。我…

借助ChatGPT编写html小程序

在数值模拟过程中&#xff0c;经常需要反复计算一些参数&#xff0c;例如常见的无量纲参数雷诺数和瑞利数等 它们的表达式如下&#xff1a; R a g β Δ T H 3 P r ν 2 Ra \frac{g \beta \Delta T H^3Pr}{\nu^2} Raν2gβΔTH3Pr​ 为了确定这个参数&#xff0c;需要给定 g…

ChatGPT都说厉害的东西,零基础,3个小时完成微信小程序的制作并发布

ChatGPT都说厉害的东西&#xff0c;零基础&#xff0c;3个小时完成微信小程序的制作并发布 目录 ChatGPT都说厉害的东西&#xff0c;零基础&#xff0c;3个小时完成微信小程序的制作并发布一、事情的起因&#xff08;先解释一些因素&#xff0c;可以选择跳过&#xff09;二、产…

微信小程序| AIGC之动手实现ChatGPT法律顾问小程序

一、需求背景 在资本退去后,现如今的互联网行情很差劲,很多创新业务都不得不砍除。再加上国内互联网时代进入到了一个增量犹显疲态,增量杀红了眼!阶段,各大互联网公司均有一种断臂求生的态势!各位互联网同行,大力发展第二职业已然变成了必要的生产力! 我们既要辩证的…

微信小程序 |做一款跟ChatGPT下五指棋的小程序

一、写在前面 敢问世间万物,何以解忧? 时下最为火爆的ChatGPT想必够资格来回答一下这个问题。 要想当年AlphaGO打败世界围棋高手李世石,就展露出AI的惊人实力,时隔多年,AI领域在憋了这么多年之后,现如今,ChatGPT 4大杀四方,各行各业无不为之震撼! 借用刚召开的新程…

ChatGPT的朋友们:大语言模型经典论文一次读到吐

知乎&#xff1a;Ostrich 职位&#xff1a;阿里巴巴 算法工程师 原文&#xff1a;https://zhuanlan.zhihu.com/p/620360553 要说2023刷屏最多的词条&#xff0c;ChatGPT可以说是无出其右。到最近的GPT-4&#xff0c;技术的革新俨然已呈现破圈之势&#xff0c;从学术圈到工业界再…

0起步用GPT+知乎赚了点小钱,人人可复制

大家好&#xff0c;我是五竹。 前段时间分享了一篇关于用ChatGPT赚点小钱的实战&#xff1a;TMD&#xff0c;被人偷窥了一个月&#xff01;结果上周末的时候在知乎追了一个关于Claude的热点&#xff0c;发布了一篇注册Claude的文章&#xff0c;结果小小的“爆了”一下&#xf…

这是一篇由ChatGPT生成的博客

这是一篇由ChatGPT生成的博客 前言功能“写”小说编程C语言实现雪花算法Vue和element-ui写一个登陆界面MySQLSpringboot 结尾 前言 ChatGPT是一款由OpenAI开发的预训练聊天机器人模型。它是基于GPT-3&#xff08;Generative Pretrained Transformer-3&#xff09;架构构建的&a…

GPT4和ChatGPT的区别,太让人震撼

文 | Serendipity知乎 前言 GPT4上午朋友圈已经刷屏啦&#xff0c;不过我还在忙&#xff0c;刚刚才登上 GPT-4 &#xff0c;现在来体验一下~ 附 GPT-4 能力测试站&#xff08;无需魔法&#xff0c;仅供国内研究测试&#xff09;&#xff1a; https://gpt4test.com 附 Cha…

研究生如何利用 ChatGPT 帮助开展日常科研工作?

链接&#xff1a;https://www.zhihu.com/question/583232012 编辑&#xff1a;深度学习与计算机视觉 声明&#xff1a;仅做学术分享&#xff0c;侵删 作者&#xff1a;武幺六https://www.zhihu.com/question/583232012/answer/3022264244 我这篇保姆级的ChatGPT论文精读和组会汇…

知乎、百度会被ChatGPT取代吗?百度文心一言胜算如何

有人说ChatGPT革了知乎的命&#xff0c;这种看法是很直观能理解的&#xff0c;因为知乎上面有问题&#xff08;题主&#xff09;&#xff0c;也有很多人回答问题&#xff0c;解决题主的疑惑&#xff0c;其实这种形式和ChatGPT的“一问一答”“知识分享”或“对话交流”很相像。…

她用ChatGPT写了一篇文章,日赚14000元!

金磊 Pine 发自 凹非寺量子位 | 公众号 QbitAI 用ChatGPT写篇博客&#xff0c;竟能实现日入过万&#xff01; 没开玩笑&#xff0c;这事真真儿地就发生了。 事情的起因&#xff0c;是一位小姐姐正准备发布一篇数据分析文章&#xff0c;字数大约在3000左右。 但她觉得一边要分析…

​ChatGPT爆火后:API与平台战争

无界社区是一个跨学科的创新组织&#xff0c;由设计师和工程师组成的开放式线上协作组织。我们正在寻找对跨学科内容感兴趣、敢于尝试新方法并乐于分享想法的人士。如果你准备好加入一个开放、协作、有思想并能够凸显你独特性格的大家庭&#xff0c;那么请来无界社区吧&#xf…

危!ChatGPT一出,这10大职业可能先丢饭碗

新智元报道 编辑&#xff1a;David 【新智元导读】ChatGPT一出&#xff0c;很多人害怕自己的工作会被AI取代。最近&#xff0c;有外媒盘点了最可能被ChatGPT取代10大高危职位。 自从去年11月发布以来&#xff0c;OpenAI的ChatGPT已经被用来写求职信&#xff0c;创作儿童读物&…

ChatGPT版Office来了:微软下周四举行发布会,CEO亲自上

机器之心报道编辑&#xff1a;蛋酱 又一次「工业革命」正在加速进行&#xff1f; 从微软、谷歌到百度&#xff0c;大型科技公司正加速将生成式 AI 整合到他们的产品中。 刚刚&#xff0c;微软公司宣布将 ChatGPT 背后的技术与其低代码应用平台 Power Platform 捆绑在一起&#…

ChatGPT技术与市场动态

ChatGPT服务器&#xff0c;深度拆解&#xff08;2023&#xff09; ChatGPT发布之后&#xff0c;引发了全球范围的关注和讨论&#xff0c;国内各大厂商相继宣布GPT模型开发计划。据各公司官网&#xff0c;2023年2月7日&#xff0c;百度宣布将推出ChatGPT类似产品“文心一言”&am…