chatgpt/bingchat 这些大语言模型在进行文字回应的时候都是几个字几个字的往外蹦,这背后的原因是啥?

211 天前
 MajestySolor
3594 次点击
所在节点    机器学习
53 条回复
starrycat
211 天前
学人的,因为人也是这样( doge
noe132
211 天前
因为模型是这样工作的。会根据你的输入和已经生成的文字,来推断下面用哪个词语( token )是最合理的,然后不断重复这个步骤。
airyland
211 天前
jimages
211 天前
因为大模型运行一次推断只能推断出下一个字(实际上是 token )
geelaw
211 天前
@noe132 #2
@airyland #3
@jimages #4
诸位似乎有点小看电脑的运行速度或者小看上下文切换和网络传输的延迟了。模型确实是一个一个预测的,但用户界面上几个字/词几个字/词显示回答纯粹是表演,API 里即使用 stream=True 也是一大段儿一大段儿收到回复的,否则反复多轮传输很不划算。
noe132
211 天前
浏览器支持 SSE/WebSocket 长连接,每次只传输增量数据,没有多次传输的 overhead
另外 API 的速度不是稳定的,可能有时候快有时候慢,很可能某个高峰期他就是 1 秒钟只吐一两个字。
airyland
211 天前
@geelaw 没看明白你在说什么。
如果你说提是 Azure OpenAI 一大段输出,那是因为它做了优化,进行合并输出,也可能是为了实现边输出边审查,OpenAI 更多是逐字逐词输出。
geelaw
211 天前
@airyland #7 我理解 OP 所问的是为什么网页上回答是几个词几个词往外蹦。

1. 模型是一个 token 一个 token 输出的
2. 用户在网页看到的是几个词几个词输出的
3. 网页调用的 API 是一个词一个词返回数据到客户端的
4. 网页调用 API 后增加动画让回答一个词一个词显示

1 和 2 都成立,但 1 不是 2 的原因,4 才是 2 的原因,并且 3 不成立。这样说清楚了吗?

关于 3 不成立,可以参考 https://stackoverflow.com/questions/75826303/is-there-any-way-to-stream-response-word-by-word-of-chatgpt-api-directly-in-reac 这个 StackOverflow 问题的存在就说明 OpenAI 的 API 并不是一个词一个词传送的。
em70
211 天前
你在说一句话之前,不可能知道你将要说的话的第三个词是啥,必须说完第二个词才知道.大模型是模仿人脑设计的
MajestySolor
211 天前
@em70
这个模仿是纯粹的“模仿”还是说大语言模型的底层设计就是这样和人类说话一样的?
人类说话在说到上一个字/词之前确实很难知道下一个字/词是啥,但这个特性需要模拟么,似乎并无益处啊,以计算机的算力完全可以生成完整内容以后再显示给用户,那么大语言模型模仿这个特性是不是纯粹是为了更像人。
flyaway
211 天前
@MajestySolor 人类的语言是线性的(读和写都是一个一个顺序进行的,不然人脑无法理解。)。 在 ML 领域,此类问题都称为 sequence modeling 问题,也是 NLP 中最常见的建模方式。
ChatGPT 确实是一个一个 token 生成的,但是 OpenAI 可以:
1. 每次 request 都等 ChatGPT 完成输出之后,一次性把一段话发给你
2. 每次 request 都等 ChatGPT 完成输出之后,一个词一个词的发给你,模拟人的说话方式
3. 每次 request 都是实时输出,但是模型很大,也许生成速度就是这样,不得不一个词一个词蹦。 虽然现在计算力很大,但是模型也很大啊……
flyaway
211 天前
BTW, 我觉得 8 楼说的是正解。
eae29qvc
211 天前
问过 azure 官方的人,纯粹是为了限流,充值足够完全可以秒回
dnfQzjPBXtWmML
211 天前
@geelaw 要么你 f12 看看
https://chat.openai.com/backend-api/conversation 这个 SSP 请求?下面这个请求,在我这耗时 16 秒,推了 407 个消息体,703,001 字节 headers:3,017; body:699,984 。而且可以看到,['message']['content']['parts'][0]每次推消息都在追加文本

https://imgur.com/a/wxJ24Ix
ziseyinzi
211 天前
类似于小米 8 透明探索版:后盖表面上是透明的,好像展示了内部结构,其实是一张贴纸照着内部结构画上去的。
geelaw
211 天前
@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)。
swulling
211 天前
@eae29qvc 受限于单卡算力瓶颈,GPT-4 秒回是不可能的。

其实这里有个计算公式,可以算出首 token 以及完全 token 的理论最快速度。
makelove
211 天前
你在本地用 cpu 部署一个最快最次的 7b 小模型就知道了,目前的 ai 完全是暴力算法,我在老机上的 5 代 i3 就是一秒 2 token 水平。
自然界进化这么多亿年的人类大脑就耗能极高速度极低,也许就是这种神经 ai 算法的本质复杂性,想出下一个词得扫一遍,永远都不可能快得起来。
qwer1234zh
211 天前
看过 api 文档吧,有个 stream 开关,true 就是模仿打字机输出,false 就是结果完全输出
naminokoe
211 天前
我使用 api 都是直接出现全部结果

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/981501

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX