虽迟但到,这周给我的小玩具 GeekChat 新增了对 stream 响应的支持,实现边回复边输出,感兴趣可以体验下:GeekChat —— 支持语音的免费体验版 ChatGPT。前端交互还有待优化,放到下个迭代吧。
由于 GeekChat 是用 Laravel + Vue3 实现的,所以也必须依赖这套技术栈实现 stream 流式响应,对应的实现源码已经提交到 Github:https://github.com/geekr-dev/geekchat,如果觉得对你有帮助,顺手点个 star 。
用到的东西:
注意点:
由于用到了 header
、ob_flush
、flush
这些函数,所以不支持基于 Swoole 、RoadRunner 之类常驻内存机制驱动的 PHP HTTP 服务器,在部署到生产环境的时候需要注意这一点。
1
PickleFish 2023-03-17 12:33:07 +08:00
不懂 但已 star
|
2
sunny1688 2023-03-17 13:39:08 +08:00
那你这个 server 还能并发?
|
3
brader 2023-03-17 15:43:25 +08:00
我建议你关闭缓冲区或者调整缓冲区的大小,它会让你 UI 表现看起来是逐字出现而不是一段一段的出现,表现更加丝滑,体验会更加友好。
缓冲区可能存在于列举任何一个地方:代码、中间代理服务、nginx 等等 |
7
shellus 2023-03-17 17:43:35 +08:00
请教一下,这个 EventSource 和 websocket 相比好像没什么优势吧,后端的支持的话,也是 swoole 的 websocket 更好简单实用,技术栈比较主流吧?
|
8
brader 2023-03-17 18:06:03 +08:00
@shellus 客户端是无法实现的我说的效果的,因为流形式 gpt 回答问题是持续性逐字回答。
因为开启了缓冲区,假设一段话被分为了 A 、B 、C 三块进行输出,那么客户端接收数据流程如下: 客户端等待 -> 客户端接收 A 块消息(这里按你说的,客户端自实现逐字输出) -> 等待 -> 接收 B 块消息 -> 等待 -> 接收 c 块消息 你会发现上面的流程,虽然你接收到一整块的大量文字的时候,自己做了逐字输出,但因为服务端必须等待接收满一个缓冲区的数据,才会向客户端发送数据,所以客户端在每一块数据之间,又进入了等待期,失去了连续性。 |
10
Acckr 2023-03-20 10:38:32 +08:00
速度好慢,另外总是出现 接收回复出错,请重试
|
12
ieliwb 2023-03-23 11:24:46 +08:00
大佬好,php-fpm 有连接限制的,你这开启流模式,会导致一直占有 fpm 进程,后面的用户因为连接数限制完全挤不进来啊,服务器不挂了
|
14
voidmnwzp 2023-03-28 18:14:33 +08:00 via iPhone
我用 evensource 会丢掉数据中的空格符 不知道啥原因
|