提问背景 Question:
这里我有一个想不通的问题,我的想法是,肯定要都计算好,才能输出。因为计算是一个整体,计算机不可能先读取用户的第一个字母就开始计算,应该是以读取整体计算,不可能只看前半段计算一下输出,再看后半段,这样前后就乱了。
AI流式输出与自回归计算
你提出的疑问非常合理,也揭示了许多人对AI模型工作方式的误解,但这恰恰是大型语言模型(LLM)的精妙之处,也是为什么“流式输出”能够实现,并且不会导致“前后混乱”的关键。
核心概念:自回归生成(Autoregressive Generation)
AI模型(尤其是LLM)的文本生成过程是“自回归”的。这意味着模型不是一次性“想好”所有内容再输出,而是一个词元(Token)一个词元地生成。每生成一个新词元,模型都会:
- 接收并处理所有已有上下文: 这包括你最初的提问,以及所有之前已经生成并输出的词元。
- 基于完整上下文预测下一个词元: 模型会根据当前所有信息,计算出概率最高的下一个词元是什么。
- 输出这个新词元。
- 将新词元添加到上下文,然后重复这个过程,直到生成结束词元或达到最大长度。
为什么不会“乱”:
你担心“只看前半段计算一下输出,再看后半段,这样前后就乱了”的顾虑,在这里是不存在的。因为:
- 每次计算都基于“全局”: 这里的“全局”指的是当前所有已知的上下文(包括输入和已生成的)。模型在生成第N个词元时,是“知道”第1到第N-1个词元的,它始终保持对整个对话历史的连贯理解。
- 计算不是独立的: 后半段的计算依赖于前半段的输出。它不是独立进行的,而是持续地在已有的文本基础上进行推断,所以逻辑是连续的。
流式输出(Streaming)与计算速度的关系:
流式输出正是利用了这种自回归的特性:
- 降低“首字延迟”(Time To First Token - TTFT): 即使整个回复可能需要20秒才能全部计算完成,但第一个词元(或前几个词元)往往在几秒内就能计算出来。流式输出允许服务器立即将这些计算好的词元发送给客户端。
- 用户体验优化: 客户端收到第一个词元后就可以立即显示,而不是等待整个20秒才能看到任何内容。这大大改善了用户等待时的体验,让用户感觉响应更快。
- 计算速度不变: 流式输出并不能加快模型总体的计算速度。如果模型需要20秒才能生成1000个词元,那么它总共还是需要20秒。流式只是把这20秒的等待,从“什么都没有”变成了“逐步填充”。
所以,当你在前端看到AI“一点一点地给我”回复时,这正是后端模型在逐步计算、逐步发送结果的表现。它不是先计算好全部再分段发送,而是计算出一段就发送一段,确保了内容在逻辑上的连贯性。