首页 > 其他分享 >长连接:chatgpt流式响应背后的逻辑

长连接:chatgpt流式响应背后的逻辑

时间:2023-07-27 10:11:05浏览次数:35  
标签:console log 流式 响应 ws chatgpt data 连接 客户端

一、前言:

提起长连接,我们并不陌生,最常见的长连接非websocket莫属了。即使没有在项目中实际用过,至少也应该有所接触。长连接指在一次网络通信中,客户端与服务器之间建立一条持久的连接,可以在多次请求和响应中重复使用该连接。这种方式的优点是减少了连接建立和关闭的开销,提高了通信效率,但需要注意控制连接的数量,避免资源浪费。短连接则是每次请求和响应都建立一个新的连接,完成后立即关闭,需要频繁进行连接建立和关闭,效率相对较低。但是这种方式更加灵活,适用于请求量较小、请求频率不高的场景。

二、背景:

最近项目在引用chatgpt智能小助手,最开始采用的是当chatgpt回答完成后一次性返回答案。但这种方式受限于网络及服务较慢的原因导致用户需要等待较长时间,极大的降低了用户的使用体验。经过项目组成员商议决定采取答案逐字返回的形式,以便于用户能更快的得到反馈。

关于长连接技术,主要考虑两种方案websocket和sse

三、原理:

1.websocket概念:WebSocket是HTML5定义的新协议,实现了服务器与客户端之间的全双工通信。WebSocket连接一旦建立,客户端和服务器端处于平等地位,可以相互发送数据,不存在请求和响应的区别。

2、websocket优劣势:优势在于实现了双向通信,劣势在于服务器端的逻辑非常复杂。现在针对不同的后台语言有不同的插件可以使用。

3、sse概念:SSE(Server-Sent Events)是HTML5新增的功能,允许服务器将数据推送到客户端。与长轮询和短轮询不同,SSE不需要客户端先发送请求,而是在服务器端数据有更新时立即发送到客户端

4、sse优劣势:优势在于节约资源,提升应用性能。SSE可以实现只要服务器端数据有更新,就可以马上发送到客户端,不需要建立或保持大量的客户端发往服务器端的请求。另外,SSE的实现非常简单,并且不需要依赖其他插件。劣势在于不是双向通信,只能后台向前台推送。

5、相同点:都是基于tcp,都是可靠的传输协议

6、不同点

  • WebSocket是双向通信协议,模拟Socket协议,可以双向发送或接受信息
  • HTTP是单向的
  • WebSocket是需要浏览器和服务器握手进行建立连接的
  • 而http是浏览器发起向服务器的连接,服务器预先并不知道这个连接

四、应用:

1、sse在chatgpt中的应用

前端代码

import { fetchEventSource } from '@microsoft/fetch-event-source'
let answerContent = ''
fetchEventSource('/chatgptApi/chatgpt_qa_stream', {
        method: 'POST',
        headers: {
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ messages }),
        async onopen(response) {
          if (response.ok && response.status === 200) {
            console.log('连接成功')
          } else {
            console.log('连接异常')
          }
        },
        async onmessage(event) {
          // 表示整体结束
          if (event.data === '[DONE]') {
            console.log('结束')
            return
          }
          if (event.data) {
            const data = JSON.parse(event.data)
            answerContent += data.content
          }
        },
        async one rror(error) {
          console.error('Error:', error)
        },
        async onclose() {
          console.log('关闭连接')
        }
      })



后端代码

const http = require('http');
const yun = express();
const eventServer = http.createServer((req, res) => {
    res.writeHead(200, {
        'Content-Type': 'text/event-stream',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Access-Control-Allow-Origin': "*",
        'Access-Control-Allow-Headers': 'Content-Type,Content-Length,Authorization,Accept,X-Requested-With',
        'Access-Control-Allow-Methods': 'PUT,POST,GET,DELETE,OPTIONS'
    });
    setInterval(() => {
    	// 事件要用两个\n结束
        res.write('data: The server time is: ' + new Date() + '\n\n');
    }, 1000);
    req.connection.addListener('close', () => {
        console.log('SSE connection closed!');
    }, false);
}).listen(4001);



2、websockt在即时聊天中的应用

前端代码

// 创建WebSocket对象
let ws = new WebSocket('ws://localhost:8888')

// 连接成功后的回调函数
ws.onopen = function (params) {
  console.log('客户端连接成功')
  // 向服务器发送消息
  ws.send('hello')
};

// 从服务器接受到信息时的回调函数
ws.onmessage = function (e) {
  console.log('收到服务器响应', e.data)
};

// 连接关闭后的回调函数
ws.onclose = function(evt) {
  console.log("关闭客户端连接");
};

// 连接失败后的回调函数
ws.onerror = function (evt) {
  console.log("连接失败了");
};
// 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,这样服务端会抛异常。
window.onbeforeunload = function() {
    ws.close();
}



后端代码

/ 引入插件
const ws = require('nodejs-websocket')
// 只要有用户链接,函数就会执行,会给当前链接的用户创建一个connect对象
const server = ws.createServer((connect)=>{
    console.log('连接成功')
    // console.log(connect)
    // 注册text事件 ,接收用户传递过来的数据
    connect.on('text',data=>{
        console.log('接收客户端数据---->', data)
        // 给所有用户发送消息
        broadcast(server,data+"--返回数据")
    })
    // 连接断开,触发事件close
    connect.on('close',()=>{
        console.log('用户链接断开--close')
    })
    // 用户链接断开
    connect.on('error',err=>{
        console.log('err', err)
    })

}).listen(3001,()=>{
    console.log('websocket服务启动成功了')
})

// 给所有人发消息
function broadcast(server,msg){
    server.connections.forEach(element => {
        element.send(msg)
    });
}



五、效果:

sse在chatgpt案例中的应用

作者:京东物流 田雷雷

来源:京东云开发者社区 自猿其说Tech

标签:console,log,流式,响应,ws,chatgpt,data,连接,客户端
From: https://www.cnblogs.com/jingdongkeji/p/17584200.html

相关文章

  • 尝试解决Sublime Text启动即卡死白屏无响应问题
    最近在使用SublimeText时发现启动时会卡死将近1-2分钟,一两次可还行,但次次都出现这个问题真的忍不了辣!!等得我要摔电脑辣!!(bushi 1.问题的产生在Sublime中按下Ctrl+~开启控制台界面见下图: 我们可以看见其他插件正常加载(reloading),但我的1self这个插件出现了报错,(合理推测......
  • ChatGPT 的最佳提示
    “ChatGPT”——你听说过这个词吗?我敢肯定,现在很少遇到对ChatGPT缺乏认识的人。ChatGPT是由OpenAI基于GPT(生成预训练转换器)架构开发的高级语言模型,专门设计用于参与对话交互。与ChatGPT交互时,用户以文本输入或问题的形式提供提示。ChatGPT中的提示对生成的输出具有重大影响,......
  • ChatGPT使用框架
    今天的打卡就是纯笔记了,把刚刚看到的一个好用的框架给记下来,并且分享出来。(其实好像有大佬分享过了,我记得我收藏了,但我找不回来了...)BasicPromptFrameworkInstruction(必须):指令,即你希望模型执行的具体任务。Context(选填):背景信息,或者说是上下文信息,这可以引导模型做出更好......
  • chatgpt从入门到精通深入学习路线?
    chatgpt从入门到精通深入学习路线?如果您想深入学习和掌握ChatGPT,以下是一个学习路线的建议:1.了解自然语言处理(NLP)基础知识:开始之前,建议您对NLP的基本概念和技术有所了解,包括语言模型、分词、词向量、文本分类等。2.学习深度学习和神经网络:ChatGPT是基于深度学习技术的,因此了......
  • ChatGPT使用技巧和实践
    在工作使用当中,需要使用到GPT,目前使用的是浏览器端的WeTab。在这里插入图片描述下面是给AI的提问和交互请写出HashMap和Hashtable的区别HashMap和Hashtable是Java中两种常用的哈希表实现,它们在功能和使用上有一些区别。线程安全性:HashMap是非线程安全的,不保证在多线程环境......
  • ChatGPT是什么?ChatGPT里的G、P、T分别指什么
    前言ChatGPT是一种基于人工智能技术的聊天机器人,它可以模拟人们的对话方式进行自然语言交流,并根据用户提出的问题、需求、意愿等信息提供相关服务或回答问题。ChatGPT的G、P、T分别指“生成式”(Generative)、“预训练”(Pre-trained)和“文本”(Text)。 G、P、T分别指什么一、G首......
  • 应急响应—勒索病毒
    勒索病毒简介•勒索病毒,是一种新型电脑病毒,主要以邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大,一旦感染将给用户带来无法估量的损失。这种病毒利用各种加密算法对文件进行加密,被感染者一般无法解密,必须拿到解密的私钥才有可能破解。•勒索病毒通常使用......
  • 文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题
    四、在MAX-HEAP-INSERT的第2行,为什么我们要先把关键字设为-∞,然后又将其增加到所需的值呢?文心一言:在MAX-HEAP-INSERT算法的第二行将关键字设为-∞,是为了保持堆的性质。堆是一种二叉树结构,其中每个节点的值都大于或等于其子节点的值。在MAX-HEAP-INSERT算法中,我们需要在......
  • 文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题
    四、在MAX-HEAP-INSERT的第2行,为什么我们要先把关键字设为-∞,然后又将其增加到所需的值呢?文心一言:在MAX-HEAP-INSERT算法的第二行将关键字设为-∞,是为了保持堆的性质。堆是一种二叉树结构,其中每个节点的值都大于或等于其子节点的值。在MAX-HEAP-INSERT算法中,我们需要......
  • 【ChatGPT】AI 人工智能能让你成为更聪明的程序员吗?
    目录......