逐句回答,流式返回,ChatGPT采用的Server-sent events后端实时推送协议Python3.10实现,基于Tornado6.1

善于观察的朋友一定会敏锐地发现ChatGPT网页端是逐句给出问题答案的,同样,ChatGPT后台Api接口请求中,如果将Stream参数设置为True后,Api接口也可以实现和ChatGPT网页端一样的流式返回,进而更快地给到前端用户反馈,同时也可以缓解连接超时的问题。

Server-sent events(SSE)是一种用于实现服务器到客户端的单向通信的协议。使用SSE,服务器可以向客户端推送实时数据,而无需客户端发出请求。

SSE建立在HTTP协议上,使用基于文本的数据格式(通常是JSON)进行通信。客户端通过创建一个EventSource对象来与服务器建立连接,然后可以监听服务器发送的事件。服务器端可以随时将事件推送给客户端,客户端通过监听事件来接收这些数据。

ChatGPT的Server-sent events应用

首先打开ChatGPT网页端,随便问一个问题,然后进入网络选单,清空历史请求记录后,进行网络抓包监听:

可以看到,在触发了回答按钮之后,页面会往后端的backend-api/conversation对话接口发起请求,但这个接口的通信方式并非传统的http接口或者Websocket持久化链接协议,而是基于EventSteam的事件流一段一段地返回ChatGPT后端模型的返回数据。

为什么ChatGPT会选择这种方式和后端Server进行通信?ChatGPT网页端使用Server-sent events通信是因为这种通信方式可以实现服务器向客户端推送数据,而无需客户端不断地向服务器发送请求。这种推送模式可以提高应用程序的性能和响应速度,减少了不必要的网络流量。

与其他实时通信协议(如WebSocket)相比,Server-sent events通信是一种轻量级协议,易于实现和部署。此外,它也具有广泛的浏览器兼容性,并且可以在不需要特殊网络配置的情况下使用。

在ChatGPT中,服务器会将新的聊天消息推送到网页端,以便实时显示新的聊天内容。使用Server-sent events通信,可以轻松地实现这种实时更新功能,并确保网页端与服务器之间的通信效率和稳定性。

说白了,降低成本,提高效率,ChatGPT是一个基于深度学习的大型语言模型,处理自然语言文本需要大量的计算资源和时间。因此,返回响应的速度肯定比普通的读数据库要慢的多,Http接口显然并不合适,因为Http是一次性返回,等待时间过长,而Websocket又过重,因为全双工通信并不适合这种单项对话场景,所谓单项对话场景,就是对话双方并不会并发对话,而是串行的一问一答逻辑,同时持久化链接也会占用服务器资源,要知道ChatGPT几乎可以算是日均活跃用户数全球最高的Web应用了。

效率层面,大型语言模型没办法一下子返回所有计算数据,但是可以通过Server-sent events将前面计算出的数据先“推送”到前端,这样用户也不会因为等待时间过长而关闭页面,所以ChatGPT的前端观感就是像打字机一样,一段一段的返回答案,这种“边计算边返回”的生成器模式也提高了ChatGPT的回答效率。

Python3.10实现Server-sent events应用

这里我们使用基于Python3.10的Tornado异步非阻塞框架来实现Server-sent events通信。

首先安装Tornado框架

pip3 install tornado==6.1

随后编写sse_server.py:

import tornado.ioloop  
import tornado.web  push_flag = True  from asyncio import sleep  class ServerSentEvent(tornado.web.RequestHandler):  def __init__(self, *args, **kwargs):  super(ServerSentEvent, self).__init__(*args, **kwargs)  self.set_header('Content-Type', 'text/event-stream')  self.set_header('Access-Control-Allow-Origin', "*")  self.set_header("Access-Control-Allow-Headers","*")  # 请求方式  self.set_header("Access-Control-Allow-Methods","*")  # 断开连接  def on_finish(self):  print("断开连接")  return super().on_finish()  async def get(self):  print("建立链接")  while True:  if push_flag:  print("开始")  self.write("event: message\n");  self.write("data:" + "push data" + "\n\n");  self.flush()  await sleep(2)

建立好推送路由类ServerSentEvent,它继承Tornado内置的视图类tornado.web.RequestHandler,首先利用super方法调用父类的初始化方法,设置跨域,如果不使用super,会将父类同名方法重写,随后建立异步的get方法用来链接和推送消息,这里使用Python原生异步的写法,每隔两秒往前端推送一个事件message,内容为push data。

注意,这里只是简单的推送演示,真实场景下如果涉及IO操作,比如数据库读写或者网络请求之类,还需要单独封装异步方法。

另外这里假定前端onmessage处理程序的事件名称为message。如果想使用其他事件名称,可以使用前端addEventListener来订阅事件,最后消息后必须以两个换行为结尾。

随后编写路由和服务实例:

def make_app():  return tornado.web.Application([  (r"/sse/data/", ServerSentEvent),  ])  if __name__ == "__main__":  app = make_app()  app.listen(8000)  print("sse服务启动")  tornado.ioloop.IOLoop.current().start()

随后在后台运行命令:

python3 sse_server.py

程序返回:

PS C:\Users\liuyue\www\videosite> python .\sse_server.py  
sse服务启动

至此,基于Tornado的Server-sent events服务就搭建好了。

前端Vue.js3链接Server-sent events服务

客户端我们使用目前最流行的Vue.js3框架:

sse_init:function(){  var push_data = new EventSource("http://localhost:8000/sse/data/")  push_data.onopen = function (event) {  // open事件  console.log("EventSource连接成功");  };  push_data.onmessage = function (event) {  try {  console.log(event);  } catch (error) {  console.log('EventSource结束消息异常', error);  }  
};  push_data.onerror = function (error) {  console.log('EventSource连接异常', error);  
};  }

这里在前端的初始化方法内建立EventSource实例,通过onmessage方法来监听后端的主动推送:

可以看到,每隔两秒钟就可以订阅到后端的message事件推送的消息,同时,SSE默认支持断线重连,而全双工的WebSocket协议则需要自己在前端实现,高下立判。

结语

不仅仅可以实现ChatGPT的流式返回功能,SSE在Web应用程序中的使用场景非常广泛,例如实时的新闻推送、实时股票报价、在线游戏等等,比起轮询和长轮询,SSE更加高效,因为只有在有新数据到达时才会发送;同时SSE支持自定义事件和数据,具有更高的灵活性和复用性,为流式数据返回保驾护航,ChatGPT的最爱,谁不爱?最后奉上项目地址,与众乡亲同飨:github.com/zcxey2911/sse_tornado6_vuejs3

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

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

相关文章

使用 Flask 快速构建 基于langchain 和 chatGPT的 PDF摘要总结

简介 这里不对 langchain 和 chatGPT 进行介绍,仅对实现过程进行整理 环境 Python >3.8 Flask2.2.3 Jinja23.1.2 langchain0.0.143 openai0.27.4 实现 总结功能 使用 langchain 和 openai 接口实现总结功能 实现逻辑:通过text_splitter 将pdf 分…

ABAP编程错误-ITAB_DUPLICATE_KEY

問題描述:SO:1100002326訂單修改存檔時,未更新資料;查看ST22發生ITAB_DUPLICATE_KEY的錯誤 處理歩驟: 1.在FQM_FLOW的Table,在ORIGIN_DOCUMENT_ID欄位用訂單號可查出相關的資料,其中DELETED為空白的2筆資料…

SAPSQL_IN_ITAB_ILLEGAL_OPTION dump

Created by Jerry Wang, last modified on Mar 31, 2014 这个runtime error的意思是NM( not empty )被不正确的传入了OPEN SQL的IN keyword里。 我们可以发现domain BAPIOPTION的value range里是不包含NM的。 如果直接在UI上给OBJECT_FAMILY指定NM的search attribute: 点searc…

iTab推荐:ProcessOn-你的创意小帮手

iTab推荐:ProcessOn-你的创意小帮手 如果你是创意工作者,经常需要整理自己的思路,那么一定不要错过这款宝藏软件,它可以帮你大幅提升效率,快速整理自己的idea; 可能你已经听过它了,即ProcessO…

兼顾美观和实用的标签页插件——iTab

兼顾美观和实用的标签页插件——iTab 闲来网上冲浪,被b站一个视频的标题吸引:“【【良心巨制】我一个人肝出来的iTab新标签页,可能是2022年最值得期待的浏览器扩展了-哔哩哔哩】”(视频链接:https://b23.tv/2v5hcom&a…

【好物安利】给大家安利一款好用的浏览器插件-iTab

今天给大家安利一款我最近一直在用的浏览器起始页插件-itab。 这款起始页插件,除过可以内置Google,百度等众多搜索引擎外,还聚集了日历、天气、头条新闻、壁纸、倒计时类似iOS小组件和常用网站等等功能,并且这个起始页插件的审美…

【工具】工具推荐-Edge浏览器新标签页插件———iTab

向大家推荐一款我自己用了很长时间的插件——itab 理由一:页面清新简介 点击时间可以切换几件模式 理由二:便捷切换搜索引擎 理由三:无限添加网站图标 更多优点,可以看一下作者本人的视频 【良心巨制】我一个人肝出来的iTab新标签页&#…

iTab新标签页重磅更新 |这些功能绝对有你想要的新体验!

01 写在前面 csdn的朋友们,你好哦,我是iTab 插件的独立开发者,今天给大家安利一下我做的这款桌面插件。 首先要告诉大家一个好消息: 最近iTab新标签页被Edge 浏览器商店官方热门🔥推荐啦。 在此,特别感谢…

SAP DUMP ITAB_ILLEGAL_SORT_ORDER

1. 报错界面 2. 报错原因 ls_style TYPE lvc_s_styl.是排序表,APPEND的数据时必须遵守主键的排序 3. 解决方法 方法1:使用语法: INSERT wa_style INTO TABLE lt_style ,程序将自动按照字段排序插入到对应行 (建议使用方法)

录屏居然也可以用iTab新标签页

一直以来,如何在浏览器录屏,都是一个不太好解决的问题;网上的录屏软件,要么是付费的,要么有很多广告,操作非常繁琐,功能乱七八糟的;相信你也被相同的事情所烦恼,不妨尝试…

iTab新标签页,一款个性化的浏览器起始页插件

神奇插件,还你一个干净整洁的起始页! 今天给大家推荐一款超令人惊喜的个性化浏览器起始页插件 iTab ,它是一款让你不受广告干扰的卡片式起始页插件。相信很多人的起始页插件都有为广告所烦恼的经历,而这款插件则可以为你解决困扰!…

iTab插件谷歌浏览器安装、使用(程序员、开发、设计、摸鱼神器)

iTab介绍(卡片式小组件,好看又好用) iTab,一个标签页美化插件,安装之后,可以取代浏览器默认的标签页,效果如下。 iTab 最大的特色在于,加入了 iOS 上的小组件的设计,让它…

iTab!一款超级无敌好用的浏览器插件 简洁美观

iTab免费,纯净无干扰,没有任何广告和多余的信息,登录以后还能设置同步,可以把收藏家里的网站全都搬到iTab上,超级方便快捷! 网友评论 用过了很多款标签页插件,都因为各种问题劝退了&#xff0…

个人开发作品分享:iTab新标签页

我是前端工程师,因为用了很多浏览器默认起始页,要么广告太多,要么呆板无趣,都满足不了我对美观和实用兼顾的需求,所以就自己动手做了一个。前后我一个人从设计产品到前后端开发连着熬夜肝了一个多月上架了这个iTab新标…

用iTab来私人订制属于你的新标签页面

是不是还在为浏览器新标签页功能单一而苦恼?是不是因为壁纸单一找不到优美的图片而感到心烦气躁?是不是为频频弹出的广告而感到苦恼?今天向大家推荐一款宝藏浏览器插件,满足你的所有需要! iTab,一切皆有可能…

iTab浏览器插件,助你打造个性桌面

iTab浏览器插件,助你打造个性桌面 哈喽!各位小伙伴们。随着互联网的高速发展,软件种类层出不穷,人们愈发注重其简便性、功能性、实用性等。今天我要向大家推荐一款非常好用的浏览器插件-iTab。 iTab拥有海量卡片应用,…

神级浏览器插件iTab新标签页

各位好,如果你还在用十年前的杂乱的导航页,那么你一定要看看这篇文章!这篇文章将介绍一个改变你的浏览器主页的小插件,还给你一个干净清爽、潮流美观的浏览器主页。这款插件就是iTab,iTab是一款可以用于多种浏览器平台…

iTab 近期更新一览,快来看看有没有你最喜欢的新功能

Hi,iTab的朋友们,你们好哦。 给朋友们“汇报”一下我们近期所更新的功能, 看看有没有你最喜欢的部分。 01 微信扫码登陆 点击iTab【侧边栏】左上角头像时,可以微信扫码登陆,一键同步书签到云端账户,会极大…

ChatGPT来临,革新学习方式

近年来,人工智能技术的快速发展引发了广泛的关注,尤其是在教育领域。作为人工智能技术的重要应用之一,聊天机器人ChatGPT的问世,为学生和教师带来了更多的机会和挑战。在这篇文章中,我们将探讨ChatGPT如何革新学习方式…

(Chatgpt辅助)C语言移植Code128B条形码算法到LVGL8.3【附跑通代码】

&#xff08;Chatgpt辅助&#xff09;C语言移植Code128B条形码算法到LVGL8.3【附跑通代码】 <1>CODE128算法简介<2>C语言实现算法<3>LVGL绘图函数实现<4>ChatGPT使用有感 序言&#xff1a; 这篇博客是我在移植条形码过程中&#xff0c;发现CSDN以及Goo…