大语言模型(如 Qwen3)的输出过程本质是基于自回归机制的逐 token 生成循环,从 "输入预处理" 到 "最终文本输出" 可拆解为「预处理→初始化→逐 token 生成→后处理」四大阶段,每个阶段都对应具体的张量计算、缓存更新和采样逻辑。以下结合 Qwen3 的实际推理流程,详细拆解输出的完整过程:
一、输出过程总览(核心逻辑)
模型的输出不是 "一次性生成完整文本",而是从左到右、逐 token 预测,每一步都基于 "前文 + 历史缓存" 生成下一个 token,直到满足停止条件。完整流程如下:
输入Prompt → 预处理(Tokenize→张量转换)→ 初始化KVCache → 进入生成循环:
1. 模型前向计算(复用KVCache)
2. 生成下一个token的概率分布(logits)
3. 采样选择下一个token
4. 更新KVCache和生成序列
5. 判断是否满足停止条件
→ 后处理(解码token→过滤特殊字符)→ 输出最终文本
二、分阶段拆解输出过程(结合 100token Prompt 示例)
假设输入是100token 的科普文生成 Prompt:"写一篇关于人工智能发展历程的科普短文,从1956年达特茅斯会议开始,介绍关键里程碑和技术突破,包括深度学习、Transformer架构、大语言模型等核心节点,语言通俗易懂,适合大众阅读",以下是具体输出步骤:
阶段 1:输入预处理(将 Prompt 转为模型可计算的张量)
这是输出的前置准备,核心是 "自然语言→张量" 的转换,为模型提供标准化输入:
- Tokenize 编码:用 Qwen3 的 Tokenizer 将 Prompt 转为整数 token 序列(input_ids),长度为 100,示例:input_ids = [151642, 10000, 151644, 151, 888, ..., 890, 151644] # 100个token ID
- 构造注意力掩码:由于 Prompt 无 padding,attention_mask为全 1 序列(标记所有 token 为有效):attention_mask = [1, 1, 1, ..., 1] # 长度100
- 张量维度调整:将input_ids和attention_mask转换为 PyTorch 张量,扩展为批量维度([batch_size=1, seq_len=100]),适配模型输入要求。
阶段 2:初始化(为生成循环做准备)
- KVCache 初始化:创建空的缓存对象(如 Qwen3 默认的DynamicCache),用于存储每一层 Transformer 的键(K)和值(V)向量,避免重复计算历史 token 的注意力。
- 生成参数加载:读取用户配置的生成参数,如max_new_tokens=300(最多生成 300 个新 token)、temperature=0.7(控制随机性)、top_p=0.9(Top-P 采样)。
- 因果掩码启用:通过is_causal=True触发 SDPA(缩放点积注意力)的内置因果掩码,确保模型只能看到前文 token,无法获取未来信息。
阶段 3:逐 token 生成循环(核心输出环节)
这是输出过程的核心,模型会循环执行 "预测→采样→更新" 步骤,直到生成 300 个 token 或触发停止条件。以下是前 2 个 token 的生成细节:
第 1 次循环:生成第一个新 token
- 第 1 次循环:生成第一个新 token
- 输入:input_ids(100token 的 Prompt)、attention_mask、空的past_key_values;
- 模型通过 Embedding 层将 token 转为向量,叠加 RoPE 位置编码;
- 多层 Decoder Block 执行 SDPA 注意力计算(复用空缓存,首次计算完整 Prompt 的 K/V);
- 输出logits(未归一化概率分布),维度为[1, 100, 151643](batch_size=1,seq_len=100,词表大小 15 万 +)。
- 提取目标 logits:仅取最后一个位置(第 100 个 token)的 logits,对应 "预测第 101 个 token" 的概率分布,维度为[1, 1, 151643]。
- 采样选择 token:
- 对 logits 做温度缩放:logits = logits / temperature(0.7),调整概率分布的平滑度;
- 应用 Top-P 采样:筛选累计概率≥0.9 的最小 token 集合,从该集合中随机选择一个 token;
- 假设采样结果为 token ID=222(对应文本 "人工智能" 的 "人")。
- 更新状态:
- 将新 token(222)追加到input_ids,此时input_ids长度变为 101;
- 更新past_key_values:将本次计算的 K/V 向量存入缓存,供下一轮复用;
- 检查停止条件:未达到max_new_tokens,也未生成 EOS(结束 token),继续循环。
第 2 次循环:生成第二个新 token
- 模型前向计算(复用缓存):
- 输入:仅传入新生成的 1 个 token(ID=222),而非完整的 101token 序列;
- 模型复用past_key_values中存储的前 100 个 token 的 K/V,仅计算第 101 个 token 的 K/V,大幅减少计算量;
- 输出logits,维度为[1, 1, 151643](仅对应新 token 的预测)。
2.采样与更新:重复上述采样逻辑,假设采样得到 token ID=333(对应 "工"),追加到input_ids,更新 KVCache。
后续循环:持续生成直到停止
- 每一轮循环仅输入上一步生成的 1 个 token,复用 KVCache,计算效率极高;
- 生成的 token 会不断追加到序列中,形成连贯文本;
- 当满足以下任一条件时,循环终止:
- 生成的新 token 数达到max_new_tokens=300;
- 采样到 EOS token(ID=151643,<|endoftext|>);
- 生成了用户自定义的停止词(如 "###""\n\n")。
阶段 4:后处理(将 token 序列转为用户可读文本)
循环终止后,模型会对生成的 token 序列做最后处理,得到用户可见的输出:
- 解码 token 序列:将input_ids(原始 100token Prompt + 新生成的 300token)通过 Tokenizer 转回自然语言文本;
- 过滤特殊 token:自动移除模型的特殊标记(如<|im_start|>、<|im_end|>、EOS token),仅保留有效文本;
- 格式优化:对文本做换行、空格调整,确保格式美观(如代码生成时自动缩进);
生成辅助信息:统计生成的 token 数、耗时、停止原因等,封装为元数据(meta)。
三、输出过程的关键技术细节(决定生成质量与效率)
- KVCache:提升生成速度的核心
- 作用:首次计算完整 Prompt 的 K/V 后,后续仅计算新 token 的 K/V,生成速度提升 5~10 倍;
- 存储:Qwen3 的DynamicCache会动态扩展缓存大小,适配变长生成序列,显存占用仅随生成长度线性增长(而非平方增长)。
- 采样策略:控制生成的多样性与准确性
- 贪心采样:选择概率最高的 token,生成结果准确但可能单调;
- Top-P/Top-K 采样:从高概率 token 集合中随机选择,平衡多样性与准确性(Qwen3 默认用 Top-P=0.9);
- 温度调节:温度越高,概率分布越平滑,生成越随机;温度越低,越倾向于高概率 token,结果越确定。
3.因果掩码:保证自回归逻辑的核心
- 通过is_causal=True启用,SDPA 会自动生成下三角掩码,确保每个 token 只能看到前文;
- 避免模型 "作弊" 式利用未来 token,保证生成的文本符合语言逻辑。
- 停止条件:避免无意义生成
- EOS token:模型预训练时学习到的结束标记,生成到该 token 表示文本完成;
- max_new_tokens:防止生成过长文本,控制资源占用;
- 自定义停止词:适配特定场景(如对话中遇到 "再见" 停止生成)。
四、生成过程示例(100token Prompt 生成 300token 响应)
第 1 轮:生成第 101 个 token
- 输入:100token Prompt
- 输出:logits [1, 100, 15 万 +] → 取最后一位 logits [1, 1, 15 万 +]
- 采样得到 token A(如 "人")
- 更新序列:[100token Prompt + A]
- 更新 KV 缓存:添加 token A 的 K/V
第 2 轮:生成第 102 个 token
- 关键优化:仅输入 token A(而非完整 101token 序列)
- 模型复用之前的 KV 缓存,只计算 token A 的注意力和前馈
- 输出 logits [1, 1, 15 万 +],采样得 token B(如 "工")
- 序列变为:[100token Prompt + A + B]
- KV 缓存追加 token B 的 K/V
- ...(重复 298 次,直到生成 300 个新 token)
五、逐 token 生成的核心优势
- 高效计算:每次只处理一个 token,大幅降低计算量
- 上下文连贯:每个 token 生成都基于完整历史,确保语义一致性
- 可控生成:通过参数精确控制输出长度、多样性和内容方向
- 流式输出:支持边生成边输出,用户体验更自然(如实时对话)