ChatGPT 刚出来时,各类的 GPT 客户端层出不穷,交互秒杀官方网页版,我本人也几乎不用官方页面。直到某一天,所有的第三方客户端都无法显示 GPT 的回复了,网上一查,说是 OpenAI 升级了页面,数据管道从原来的 EventSource 升级成了 WebSocket,这才造成几乎所有的第三方客户端全部阵亡的情况。 虽然大家很快跟进了修改,但是作为开发者,我们还是有必要了解下,为什么 OpenAI 要进行升级,WebSocket 有什么优势吗?
ChatGPT 的网页应用就是一个标准的聊天应用,信息交互比较频繁。但是,这个频繁只是相对的,首先我们与 ChatGPT 主要数据是文本,其次 ChatGPT 只会在我们发出消息后才会回复消息,不会主动向我们发送消息,所以官方一开始就选用了单向数据推送、传输数据为文本的 EventSource 作为消息管道。
但随着 OpenAI 的政策变化,网页版 ChatGPT 功能越来越强,现在已经支持文件上传,各种数据类型已经不是 EventSource 能承载得了了。可能你会想,文件上传就使用 HTTP 协议实现一个新的接口不就好了?增加一个功能就要增加接口,随着页面功能越来越多,ChatGPT 的 HTTP 连接会非常多,连接建立也是会消耗时间造成延迟,在聊天类应用上不合适;而且浏览器对于同一个网址的 HTTP 连接是有数量限制的,Chrome 的限制是 6 个,也就是同一个网址,只能同时存在 6 个 HTTP 连接,后续一律等待,直到前面的连接有断开。这对基于 HTTP 的 EventSource 简直就是灾难。基于数据类型、网络性能、浏览器限制等种种考虑,OpenAI 进行了升级,将 EventSource 替换成了 WebSocket。
虽然 ChatGPT 已经使用了 WebSocket 了,但是这不妨碍我们学习它的打字机效果的实现,下面将通过三种方式实现。
1. Stream 流式传输