@
dnfQzjPBXtWmML #14 Good point. 我看了一下,并且调试了一下,如果在等待数据回传的时候下断点,等一会儿再让程序继续,则动画会直接跳到最终状态。因此我之前说“4 增加动画”是错误的,此外我查了文档
https://github.com/openai/openai-cookbook/blob/main/examples/How_to_stream_completions.ipynb说明使用 stream 的时候每个 event 只传送一个 token ,但继续了解 Streams API
https://developer.mozilla.org/en-US/docs/Web/API/Streams_API之后我意识到 event 的边界是 API-supplier-defined ,即应用层概念。于是我们可以问:
> OpenAI 的 API 实现里,是每次得到新的 token 就立刻追加一个 event ,还是数个 tokens 一起组成数个 events 并发送?
也就是代码是类似
while (HasNextToken())
{
Respond(GetNextToken());
}
还是类似
while (HasNextToken())
{
for (int i = 0; i <10 && HasNextToken(); ++i)
{
tokens[i] = GetNextToken();
}
Respond(tokens);
}
第一种情况,我认为 API 是在一个 token 一个 token 地返回数据,虽然传输层可以打包;第二种情况,我认为 API 一次传输了数个 tokens ,虽然传输层可以分成多个 packets 发送。
但或许这个问题并不重要,token 生成、网络传输的延迟、客户端异步读取收到的数据,这些结合在一起自动导致了客户端动画。
另外我对 message.content.parts[0] 每次都是到目前为止完整的文本而不是只发送变化的文本感到震惊,毕竟这会导致通信复杂度上升到 Theta(n^2)。