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

这篇具有很好参考价值的文章主要介绍了长连接:chatgpt流式响应背后的逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言:

提起长连接,我们并不陌生,最常见的长连接非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 onerror(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文章来源地址https://www.toymoban.com/news/detail-606713.html

到了这里,关于长连接:chatgpt流式响应背后的逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Nginx的流式响应配置

    Nginx的流式响应(streaming response)是指在Nginx作为反向代理服务器时,将响应内容一边接收,一边逐步发送给客户端的过程。这种响应方式可以提高用户体验和网络传输效率,常用于处理较大的响应内容。 在默认情况下,Nginx是通过缓存响应内容来处理请求的。也就是说,当

    2024年02月17日
    浏览(31)
  • 淘宝销量展示方式变更背后的逻辑

    淘宝 销量展示 方式发生了调整,平台于8月16日将商品详情销量展示表达由【月销**件】全部换成展示【已售**件】, 将30天销量改成了近365天销量 。 【已售**件】统计口径:统计近365天支付的商品件数,数据更新请关注24-48小时。其中涉及销量规则、不诚信经营、售中退款等

    2024年02月09日
    浏览(21)
  • 微信小程序之流式(chunked)响应

    使用场景 实时输出场景(GPT) 数据实时要求比较高(商场首页) 微信小程序用法 1、启动块接收(只是适合使用在wx.request接口中) 2、重写块接收函数onChunkReceived 特别注意 接收的Arraybuffer需要转换为字符串进行处理,需要注意中文,详细请查考 往期博文 启动enableChunked之后

    2024年02月10日
    浏览(28)
  • 前端流式(stream)请求,获取持续响应的方式

    在网络请求中,流(stream)表示持续接收数据的过程。使用流,可以逐步获取服务器响应,而不是等待整个响应完成后一次性获取。 Axios 通过监听响应对象的 data 事件,可以实现流式请求,主要的写法有直接 pipe 流和手动监听事件两种。使用流可以实现大文件或数据的流传输,

    2024年03月25日
    浏览(52)
  • 容器化背后的魔法之Docker底层逻辑解密

    Docker内部工作原理是怎样的? 现在我们知道了Docker是什么以及它提供了哪些好处,让我们逐个重要的细节来了解。 什么是容器?它们是如何工作的? 在深入研究Docker的内部机制之前,我们首先要了解容器的概念。简单地说,容器是一个隔离和轻量级的运行时环境,封装了一

    2024年02月16日
    浏览(34)
  • python django StreamingHttpResponse流式响应中文是乱码

    在 Django 中,StreamingHttpResponse 用于实现流式响应,即在响应过程中逐步发送数据。如果在使用 StreamingHttpResponse 时,返回的中文内容出现乱码,可能是因为编码设置不正确。 要解决这个问题,请确保在设置 StreamingHttpResponse 时,正确设置了字符编码。以下是一个示例: 在这个

    2024年03月10日
    浏览(31)
  • 使用 Python 流式传输来自 OpenAI API 的响应:分步指南

    OpenAI API 提供了大量可用于执行各种 NLP 任务的尖端 AI 模型。但是,在某些情况下,仅向 OpenAI 发出 API 请求可能还不够,例如需要实时更新时。这就是服务器发送事件 (SSE) 发挥作用的地方。 SSE 是一种简单有效的技术,用于将数据从服务器实时流式传输到客户端。 如何在 W

    2023年04月19日
    浏览(52)
  • 【AI底层逻辑】——篇章7(上):海量运算背后的算力支持

    目录 引入 一、计算机芯片 1、芯片的制造 2、复杂指令集精简指令集

    2024年02月13日
    浏览(33)
  • VR/AR/XR背后的逻辑?离不开三维引擎相机

    作者:木一 自从Apple Vision Pro问世以来,这款被誉为开启“ 空间计算时代 ”的产品迅速吸引了众多科技博主的深度关注。业界对它的评价褒贬不一,一些人认为它是一款具有里程碑意义的创新产品,而另一些人则认为它不过是众多高质量虚拟现实(VR)产品中的一员。尽管市

    2024年04月12日
    浏览(41)
  • 用【Java】调用百度千帆大模型并提供流式接口【SSE】响应

    接口地址: V1版本:https://apis.ydxiaoshuai.cn/xai/rest/llm/baidu/qianfan/chat?accessToken=ACCESSTOKENprompt=PROMPT V2版本使用WebFlux:https://apis.ydxiaoshuai.cn/xai/rest/llm/baidu/qianfan/v2/chat?accessToken=ACCESSTOKENprompt=PROMPT 请求方式:GET 参数替换: 替换ACCESSTOKEN为自己的 替换PROMPT为自己要提问的问题 注意:服务器带

    2024年04月24日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包