ant-design / pro-chat

🤖 Components Library for Quickly Building LLM Chat Interfaces.
https://pro-chat.antdigital.dev
MIT License
668 stars 83 forks source link

🐛[BUG] 服务侧SSE返回,对话显示延迟,1.10.1引入 #119

Closed liguobao closed 6 months ago

liguobao commented 6 months ago

WechatIMG7017

如图,此次对话 HTTP SSE请求大概是5.1s,显示已经接受完成所有数据,同时回复也正常停止了。

但是页面中机器人状态依旧是“回复中”,输入框禁用,

服务端日志显示此次请求为5085.7301ms,可以映证SSE请求正常完成。

[2024-03-09 14:57:53.590 | INF | 0HN20937RBC7K:00000002 | Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker] Executed Controllers.ProxyOpenAIController.Openai in 5085.7301ms

代码没什么特别处理。

      <ProChat
        style={{ height: '500px' }}
        chats={cachedChats}
        request={async (messages: any) => {
          let messageRep = {
            model: currentRow.model,
            messages: [...messages] as any,
            stream: true,
          }
          const response: any = await openai.chat.completions.create(messageRep);
          const stream = OpenAIStream(response);
          return new StreamingTextResponse(stream);
        }}
      ></ProChat>
liguobao commented 6 months ago

https://github.com/ant-design/pro-chat/issues/109

我看这个Issue已经关闭了,于是我更新带了1.10.1,停止倒看起来正常了。

但是好像出现了”对话延迟显示“(相比之前的版本)

我看了下代码提交大概是这里:

https://github.com/ant-design/pro-chat/commit/9555b0179b80f50b82e43adbd60f7afee6dd29c2

大佬确认一下?

可以确认当前版本打字机效果没了,服务侧的SSE返回正常。

ONLY-yours commented 6 months ago

@liguobao 试试?发了 1.10.2

liguobao commented 6 months ago

@liguobao 试试?发了 1.10.2

在1.10.2里面,打字机效果恢复了,但是Loading 又变成了请求结束之后好一会才停止。 我看上个版本的修复代码是超时导致的,这个有什么比较舒服的解决方案吗? https://github.com/ant-design/pro-chat/commit/32e63473c92c6902a9c633ced4d4f6de7ed24a0f

照着这个Commit来说,还是只能在超时之后终止Loading

@ONLY-yours

ONLY-yours commented 6 months ago

@liguobao 试试?发了 1.10.2

在1.10.2里面,打字机效果恢复了,但是Loading 又变成了请求结束之后好一会才停止。 我看上个版本的修复代码是超时导致的,这个有什么比较舒服的解决方案吗? 32e6347

照着这个Commit来说,还是只能在超时之后终止Loading

@ONLY-yours

「但是Loading 又变成了请求结束之后好一会才停止」这个我在使用 chatgpt 的时候没复现,会迟一点是因为 SSE 结束的时候,打字机可能还没走完,会有剩余的文字还在缓冲流里面,可以看下代码,有一个 output 的队列在维护,等队列彻底结束才算是 Loading 结束。

ONLY-yours commented 6 months ago

关于超时的,目前除非主动断开链接,或者返回 error 的 respone 外,sse 是不会主动断开的,手动停止 loading 是比较正确的做法。

如果一定要做类似的逻辑,可以采用 useProChat hooks 里面的 stopGeretae 来停止生成该内容

liguobao commented 6 months ago

我这边使用了中转代理和自己实现的SSE,都复现了这个问题, 如果是直接非Stream返回应该是看不到这个的。

liguobao commented 6 months ago

关于超时的,目前除非主动断开链接,或者返回 error 的 respone 外,sse 是不会主动断开的,手动停止 loading 是比较正确的做法。

如果一定要做类似的逻辑,可以采用 useProChat hooks 里面的 stopGeretae 来停止生成该内容

我看到SSE是有终止的消息的,直接就是stop的呀。

ONLY-yours commented 6 months ago

关于超时的,目前除非主动断开链接,或者返回 error 的 respone 外,sse 是不会主动断开的,手动停止 loading 是比较正确的做法。 如果一定要做类似的逻辑,可以采用 useProChat hooks 里面的 stopGeretae 来停止生成该内容

我看到SSE是有终止的消息的,直接就是stop的呀。

对的,这个逻辑我们支持的,你是说默认 SSE 返回结束的标志的时候还是 Loading 态么?我这边这个 Case 是对的

liguobao commented 6 months ago
截屏2024-03-11 13 05 06

就上图来说,完整的请求在17s左右完成了, 后端日志请求显示“(R2049GPT) in 17627.2704ms ”完成了HTTP请求全部数据返回。 但是机器人的Loading和数据发送状态一直都是Loading,

liguobao commented 6 months ago

关于超时的,目前除非主动断开链接,或者返回 error 的 respone 外,sse 是不会主动断开的,手动停止 loading 是比较正确的做法。 如果一定要做类似的逻辑,可以采用 useProChat hooks 里面的 stopGeretae 来停止生成该内容

我看到SSE是有终止的消息的,直接就是stop的呀。

对的,这个逻辑我们支持的,你是说默认 SSE 返回结束的标志的时候还是 Loading 态么?我这边这个 Case 是对的

大佬你要不用一下我这边的接口测试一下?我给你个权限看看。

ONLY-yours commented 6 months ago

关于超时的,目前除非主动断开链接,或者返回 error 的 respone 外,sse 是不会主动断开的,手动停止 loading 是比较正确的做法。 如果一定要做类似的逻辑,可以采用 useProChat hooks 里面的 stopGeretae 来停止生成该内容

我看到SSE是有终止的消息的,直接就是stop的呀。

对的,这个逻辑我们支持的,你是说默认 SSE 返回结束的标志的时候还是 Loading 态么?我这边这个 Case 是对的

大佬你要不用一下我这边的接口测试一下?我给你个权限看看。

不用,我拿 ChatGPT 再试试看

ONLY-yours commented 6 months ago

依然无法复现你说的问题,用的是 ChatGPT 的接口:

image

虽然接口是 9.26s 就结束了,但是上面说的缓动输出,实际上大概是 10s 左右彻底输出完毕。

查看下你这个 SSE 最后返回这个 Done 结束符了么

image

liguobao commented 6 months ago

好,我再看下。 我可能知道是为嘛了,感觉我这边和中转实现的SSE也不太一样? 我在浏览器控制台是没看到SSE的数据包的,在PostMan能看到。

截屏2024-03-11 13 51 56
liguobao commented 6 months ago

最终确认,升级到1.10.2 问题修复,感恩大佬~