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

这篇具有很好参考价值的文章主要介绍了java集成chatGpt完整案例代码(效果和官网一样逐字输出)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

要集成chatGpt参考我上一篇文章即可。但是,如果要实现官网一样的效果,逐字输出,难度就提升了不少了。经过在官网的研究发现它应该是采用了SSE技术,这是一种最新的HTTP交互技术。SSE(Server-Sent Events):通俗解释起来就是一种基于HTTP的,以流的形式由服务端持续向客户端发送数据的技术。相比较WebSocket更加轻量了。有了SSE,我们就可以实现,一次HTTP请求,可以逐步获取后端内容并及时输出展示,也就可以实现ChatGpt官网的效果了。下面给出简单的实现代码

 文章来源地址https://www.toymoban.com/news/detail-477198.html

后端核心代码

@Controller
@RequestMapping("/chat")
public class ChatController {

    /**
     * 暂存消息(由于前端EventSource对象仅支持Get请求,故消息通过POST发送到后端后进行中转)
     */
    Map<String, String> msgMap = new ConcurrentHashMap<>();

    @Autowired
    ChatService chatService;

    /**
     * 发送消息
     *
     * @param msg 消息
     * @return 消息ID
     */
    @ResponseBody
    @PostMapping("/sendMsg")
    public String sendMsg(String msg) {
        String msgId = IdUtil.simpleUUID();
        msgMap.put(msgId, msg);
        return msgId;
    }

    /**
     * 对话
     *
     * @param msgId 消息ID
     * @return SseEmitter
     */
    @GetMapping(value = "/conversation/{msgId}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public SseEmitter conversation(@PathVariable("msgId") String msgId) {
        SseEmitter sseEmitter = new SseEmitter();
        String msg = msgMap.remove(msgId);

        //调用流式会话服务
        chatService.streamChatCompletion(msg, sseEmitter);

        //及时返回SseEmitter对象
        return sseEmitter;
    }
}

 

前端核心代码

var eventSource = new EventSource('http://localhost:8080/chat/conversation/'+data)
             eventSource.addEventListener('open', function(e) {
                console.log("EventSource连接成功");
             });
             eventSource.addEventListener("message", function(evt){
                var data = evt.data;
                var json = JSON.parse(data);
                var content = json.content ? json.content : '';
                content = content.replaceAll('\n','<br/>');
                console.log(json)
                var outputBody = $('#outputTxt');
                outputBody.html(outputBody.html()+content);
                var outputCard = $('#outputCard');
                var scrollHeight = outputCard[0].scrollHeight;
                outputCard.scrollTop(scrollHeight);
            });
            eventSource.addEventListener('error', function (e) {
                console.log("EventSource异常:" + e)
            });

 

效果图

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

 

 

完整项目代码

https://github.com/hdwang123/GptTest

https://gitee.com/hdwang123/GptTest

 

感想

在调研这个技术的时候,遇到很多挑战,虽然艰难好在最终都克服了。主要有以下几个方面的问题:

1. SSE技术仅支持GET请求,这个查了相关文章有第三方库可以实现POST,由于我这里只是做个简单的例子,所以不想再去弄什么第三方库。于是终于想到了办法,就是在后端进行消息暂存:先用POST请求将数据提交到后端,返回一个消息ID,然后再用使用SSE技术提交消息ID建立连接。

2. SSE向前端send的消息总是一把输出,并没有实现逐字输出效果。折腾了半天终于从SSE源码中看到了解决方案。那就是GetMapping控制器方法必须及时返回,要做到这一点,send消息方法的调用必须在新的线程中进行调用,我用@Async解决了

3.SSE向前端输出英文的时候丢失空格,所有英文单词挤在一起了,哎!这个我一开始是直接发送消息内容的,发现英文单词前面的空格丢失了。没办法,改成现在发送json对象字符串的方式,保证了空格不丢失。

4. 前端样式调整问题,主要遇到了滚动条自动滚动到div底部失效问题,scrollTop设置值始终为0。看了好多文章,也找不到解决方案。后来看到别人写的是两个div,灵感来了。我也用两个div,父div设置滚动,子div设置内容,这样就搞定了!

 

到了这里,关于java集成chatGpt完整案例代码(效果和官网一样逐字输出)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 原生js实现复选框(全选/全不选/反选)效果【含完整代码】

    1、勾选后,可以获取到所勾选的值组成的数组,并展示到页面; 2、全部勾选,以及取消勾选时,要相应地更新全选框的状态及文字显示; 3、点击反选,将所有选项的选择状态置换,并相应改变全选框的状态; 定义一个数组 checkValues ,存放用户所勾选的内容。 再定义一个

    2023年04月13日
    浏览(48)
  • 打造专业级ChatGPT风格聊天界面:SpringBoot与Vue实现动态打字机效果,附完整前后端源码

    大家好,今天用 SpringBoot 、 vue 写了一个仿ChatGPT官网聊天的打字机效果。 所有代码地址:gitee代码地址 ,包含前端和后端,可以直接运行 使用本技术实现的项目:aicnn.cn,欢迎大家体验 如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。 本文主要应用的技术有

    2024年01月24日
    浏览(51)
  • 案例:如何评价代码走查的效果?

    某嵌入式软件开发公司在代码提交系统测试之前,开发人员做了单元测试,项目组中的技术负责人对所有的代码进行了评审,对代码也通过工具做了静态扫描,系统上线后仍然存在比较多的问题,因此提升质量是其过程改进的一个重要目标。开发人员对代码进行单元测试时,

    2024年02月05日
    浏览(88)
  • 网易云音乐小程序案例分享 附完整代码

    todo: 添加音乐到收藏(最近)列表 歌词滚动

    2023年04月24日
    浏览(39)
  • pyecharts绘制各种数据可视化图表案例(效果+代码)

    1、pyecharts绘制饼图(显示百分比) 2、pyecharts绘制柱状图 3、pyecharts绘制折线图 4、pyecharts绘制柱形折线组合图 5、pyecharts绘制散点图 6、pyecharts绘制玫瑰图 7、pyecharts绘制词云图 8、pyecharts绘制雷达图 9、pyecharts绘制散点图 10、pyecharts绘制嵌套饼图 11、pyecharts绘制中国地图 12、

    2024年02月09日
    浏览(49)
  • 案例:模拟京东秒杀倒计时(完整代码)【前端实现】

    目录 实现效果  案例分析 代码分析 代码实现 (完整) 背景图片引用   实现效果  案例分析  1.倒计时是不断变化的 所以需要一个定时器( setInterval )  2.三个盒子通过 innerHTML 进行赋值 放入时分秒  3.使用 Date() 对象获取当前时间(时间戳)  4.传递参数获取活动开始的时间

    2024年02月09日
    浏览(56)
  • 小程序自定义底部导航 custom-tab-bar完整实现代码附效果图

    根据用户身份,动态设置底部的导航图标  实现步骤: 第一步 ,先配置:app.json里面的 tabBar 的 custom 设置为 true,如图:这里需要注意的是,自定义 tabBar 中包含的页面,在这里的 list 页面路径也必须得有,其它字段可以不设置 相关代码:   第二步 ,创建组件:在项目跟目

    2024年02月15日
    浏览(53)
  • opencv实现图像去畸变——几种实现方式(含完整代码)&&效果对比图&&详细参数说明&&核心参数变化对应变化效果图&&常见问题

    以下介绍下opencv实现图像去畸变的几种方式以及详细参数说明,含项目案例,含扩展的相关知识 ① cv::fisheye::initUndistortRectifyMap 和 ② cv::initUndistortRectifyMap 都是 OpenCV 库中的函数,用于摄像机的畸变校正和图像的矫正。二者的区别在于,cv::fisheye::initUndistortRectifyMap 适用于

    2024年02月10日
    浏览(110)
  • matlab中cell数组的介绍及操作(包含完整代码案例演示)

    Cell数组是MATLAB中一种常用的数据类型,可以存储任意类型的元素,包括数字、字符、逻辑值、结构体等等。我将从专业角度介绍MATLAB中的Cell数组,包括其定义、创建、访问和操作等方面。 在MATLAB中,Cell数组可以用花括号“{}”表示,也可以用函数“cell”创建。例如: % 用花

    2024年02月08日
    浏览(40)
  • 基于TensorFlow 实战案例:气温预测(附 Python 完整代码和数据集)

    各位同学好,今天和大家分享一下TensorFlow2.0深度学习中的一个小案例。 案例内容:现有348个气温样本数据,每个样本有8项特征值和1项目标值,进行回归预测,构建神经网络模型。完整代码及数据,文末获取,喜欢记得收藏、点赞。 导入所需要的库文件,获取气温数据 tem

    2024年02月09日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包