大语言模型在线推理过程

大语言模型(如 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. 第 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 万 +)。
  1. 提取目标 logits:仅取最后一个位置(第 100 个 token)的 logits,对应 "预测第 101 个 token" 的概率分布,维度为[1, 1, 151643]。
  2. 采样选择 token:
  • 对 logits 做温度缩放:logits = logits / temperature(0.7),调整概率分布的平滑度;
  • 应用 Top-P 采样:筛选累计概率≥0.9 的最小 token 集合,从该集合中随机选择一个 token;
  • 假设采样结果为 token ID=222(对应文本 "人工智能" 的 "人")。
  1. 更新状态:
  • 将新 token(222)追加到input_ids,此时input_ids长度变为 101;
  • 更新past_key_values:将本次计算的 K/V 向量存入缓存,供下一轮复用;
  • 检查停止条件:未达到max_new_tokens,也未生成 EOS(结束 token),继续循环。
第 2 次循环:生成第二个新 token
  1. 模型前向计算(复用缓存):
  • 输入:仅传入新生成的 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 会不断追加到序列中,形成连贯文本;
  • 当满足以下任一条件时,循环终止:
    1. 生成的新 token 数达到max_new_tokens=300;
    2. 采样到 EOS token(ID=151643,<|endoftext|>);
    3. 生成了用户自定义的停止词(如 "###""\n\n")。
阶段 4:后处理(将 token 序列转为用户可读文本)

循环终止后,模型会对生成的 token 序列做最后处理,得到用户可见的输出:

  1. 解码 token 序列:将input_ids(原始 100token Prompt + 新生成的 300token)通过 Tokenizer 转回自然语言文本;
  2. 过滤特殊 token:自动移除模型的特殊标记(如<|im_start|>、<|im_end|>、EOS token),仅保留有效文本;
  3. 格式优化:对文本做换行、空格调整,确保格式美观(如代码生成时自动缩进);
    生成辅助信息:统计生成的 token 数、耗时、停止原因等,封装为元数据(meta)。

三、输出过程的关键技术细节(决定生成质量与效率)

  1. KVCache:提升生成速度的核心
  • 作用:首次计算完整 Prompt 的 K/V 后,后续仅计算新 token 的 K/V,生成速度提升 5~10 倍;
  • 存储:Qwen3 的DynamicCache会动态扩展缓存大小,适配变长生成序列,显存占用仅随生成长度线性增长(而非平方增长)。
  1. 采样策略:控制生成的多样性与准确性
  • 贪心采样:选择概率最高的 token,生成结果准确但可能单调;
  • Top-P/Top-K 采样:从高概率 token 集合中随机选择,平衡多样性与准确性(Qwen3 默认用 Top-P=0.9);
  • 温度调节:温度越高,概率分布越平滑,生成越随机;温度越低,越倾向于高概率 token,结果越确定。

3.因果掩码:保证自回归逻辑的核心

  • 通过is_causal=True启用,SDPA 会自动生成下三角掩码,确保每个 token 只能看到前文;
  • 避免模型 "作弊" 式利用未来 token,保证生成的文本符合语言逻辑。
  1. 停止条件:避免无意义生成
  • 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 生成的核心优势

  1. 高效计算:每次只处理一个 token,大幅降低计算量
  2. 上下文连贯:每个 token 生成都基于完整历史,确保语义一致性
  3. 可控生成:通过参数精确控制输出长度、多样性和内容方向
  4. 流式输出:支持边生成边输出,用户体验更自然(如实时对话)
相关推荐
NAGNIP6 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab7 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab7 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP11 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年11 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼11 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS11 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区13 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈13 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang13 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx