大语言模型在线推理过程

大语言模型(如 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. 流式输出:支持边生成边输出,用户体验更自然(如实时对话)
相关推荐
Sui_Network2 小时前
回顾 2025,Sui 技术栈的落地之年
大数据·人工智能·web3·去中心化·区块链
卜锦元2 小时前
Golang后端性能优化手册(第一章:数据库性能优化)
大数据·开发语言·数据库·人工智能·后端·性能优化·golang
渡我白衣2 小时前
Python 与数据科学工具链入门:NumPy、Pandas、Matplotlib 快速上手
人工智能·python·机器学习·自然语言处理·numpy·pandas·matplotlib
AI360labs_atyun2 小时前
OpenAI应用商店,试试用它写年终PPT!
人工智能·科技·学习·ai·chatgpt·powerpoint
杨二K2 小时前
Milvus性能权衡
数据库·人工智能·milvus
love530love2 小时前
【笔记】把已有的 ComfyUI 插件发布到 Comfy Registry(官方节点商店)全流程实录
人工智能·windows·笔记·python·aigc·comfyui·torchmonitor
源创力环形导轨2 小时前
环形导轨常见的应用领域有哪些?
人工智能·自动化·制造·环形导轨
火山引擎开发者社区2 小时前
AI 时代的“无限”记忆:火山引擎 TOS Vectors 开启向量存储新范式
人工智能·火山引擎