摘要: 用大白话图解LLM推理全流程,从用户Prompt文本到生成第一个Token,拆解为预处理→Embedding→Transformer前向→LM Head→解码决策五阶段,配9张详细图解。
详细图解LLM推理流程,从Prompt到第一个Token🚀🚀
今天用大白话拆解,0技术门槛也能看懂✅
📚📚先划重点:LLM生成不是“一次性写完”,而是从左到右逐Token生成,第一个Token的诞生,就是整个推理流程的“第一步关键操作”!
📌全程拆解(从Prompt到第一个Token,共4步
[一R]Step1:Prompt输入 → 模型“接收指令”
你输入的每一句话,对LLM来说都是“待处理的指令”,这一步就像你跟朋友说话,对方先听清你要干嘛~
但LLM看不懂人类语言,所以第一步要做“翻译”
[二R]Step2:预处理|把Prompt变成模型“能懂的语言”
这是最关键的前置步骤!主要做2件事:
① Tokenize编码:用模型自带的“翻译器”(Tokenizer),把你的Prompt拆成一个个Token,每个Token对应一个唯一的数字ID;
② 张量转换:把这些数字ID转换成模型能计算的“向量”,还会加上注意力掩码,标记哪些是有效内容
简单说:把“人类话”翻译成“机器的数字密码”,方便后续计算~
[三R]Step3:初始化|模型“热身准备”
预处理完成后,模型不会直接生成Token,还要做2个准备工作:
① 初始化KVCache:创建一个“空缓存”,用来存储后续计算的关键信息,避免重复计算,节省时间
② 加载生成参数:确定生成规则,比如温度(控制随机性)、Top-P采样(控制token选择范围)
[四R]Step4:计算+采样|诞生第一个Token✨
这是最核心的一步,也是第一个Token的“诞生时刻”,分3小步:
1. 前向计算:模型把预处理后的向量,传入多层Transformer结构,计算每个可能Token的“出现概率”(logits),这个概率分布覆盖了模型的整个词汇表(可能有十几万种选择);
2. 概率调整:根据之前加载的参数(温度、Top-P),调整概率分布,比如降低温度会让选择更确定,Top-P会筛选出累计概率达标的Token集合;
3. 采样选择:从调整后的概率集合里,选出概率最高的那个Token
总结一下:Prompt→预处理→初始化→计算采样→第一个Token🚀
#agent开发[话题]# #大模型学习[话题]# #大模型面试[话题]# #ai[话题]# #大模型应用[话题]# #ai人工智能[话题]# #Agent[话题]# #大模型[话题]#
| 需求 | 输入 | 实现 | 输出 | |||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| # | 目的 | 作用 | 实质 | 形式 | 类型 | 变量名 | 值 | 来源 | 外部工具 | 动作 | 指令 | 配置 | 运行 | 备注 | 逻辑控制 | 特性 | 实质 | 形式 | 类型 | 变量名 | 值 | 去处 | ||
| s1 | 用 <tokenizer> 把 提示词 切分为 Token序列 | 预处理 | /理念/知识/商业/前沿技术/AI智能/AI应用 | /架构/叙事/叙事体裁/演说交流/科普教学 | 程序控制类型/指令/提示词 | 用户Prompt | 详细图解LLM推理流程,从Prompt到第一个Token(用户输入的完整自然语言文本,如问题、指令等) | ← 工序输入 | <tokenizer> | 提取/化学提取/识别 | 将Prompt文本按Tokenizer规则切分为token字符串序列 | tokens=[t0,t1,...,tn-1];切分规则由模型/词表决定(BPE/WordPiece等);类比把一段话拆成一块块可拼装的乐高零件 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | /架构/逻辑/信息编排逻辑/条目列举/逐条罗列/序号列举 | Token序列 | tokens | <Prompt文本切分后的字符串token列表,如['今天','天气','很','好'],长度n取决于Prompt和词表粒度> | → s2 | ||||
| s2 | 词表查询把 Token序列 映射为 Token_ID序列 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | /架构/逻辑/信息编排逻辑/条目列举/逐条罗列/序号列举 | Token序列 | tokens | <Prompt文本切分后的字符串token列表,如['今天','天气','很','好'],长度n取决于Prompt和词表粒度> | ← s1.tokens | <tokenizer> | 修改/变/转换 | 在Tokenizer词表中查找每个token对应的整数ID | token_ids=[id0,id1,...,idn-1];目的:把符号映射成整数索引,便于embedding table以O(1)查表;类比把单词换成字典里的页码/编号 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | /架构/逻辑/信息编排逻辑/条目列举/逐条罗列/序号列举 | Token_ID序列 | token_ids | <tokens对应的整数ID列表,如[1234,5678,90,123],形状[n,],值域[0,vocab_size-1]> | → s3 / s4 | ||||
| s3 | 批处理填充对齐 Token_ID序列 生成 注意力掩码 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | Token_ID序列 | token_ids | <tokens对应的整数ID列表,如[1234,5678,90,123],形状[n,],值域[0,vocab_size-1]> | ← s2.token_ids | <tokenizer> | 生成/元素生成 | 对batch内多条序列进行padding对齐,生成attention_mask标记有效位置 | 可选步骤:单序列推理时可省略;用途:并行计算多个样本+防止padding位置参与注意力计算;padding位置填特殊PAD_ID;类比把不同长度积木墙用同样盒子装,周围堆起空位占位但不影响 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | Token_ID序列 | padded_token_ids | <padding后的token_ids,形状[batch_size,max_seq_len],PAD位置填充特殊PAD_ID> | → s4 | ||||||
| /理念/知识/商业/前沿技术/AI智能/机器学习 | 注意力掩码 | attention_mask | <与padded_token_ids同形状的二元mask,有效token=1,padding=0;用于标记哪些位置参与注意力计算> | → s6.4 | ||||||||||||||||||||
| s4 | 查表把 Token_ID序列 映射为连续 嵌入矩阵 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | Token_ID序列 | token_ids | <tokens对应的整数ID列表,如[1234,5678,90,123],形状[n,],值域[0,vocab_size-1]> | ← s2.token_ids | <llm> | 提取/化学提取/反推 | 查embedding table,将token_ids映射到连续向量空间X矩阵 | X=Embedding(token_ids);形状[n,d_model];目的:把离散ID映射到连续向量空间;embedding权重是模型可学习参数;类比把编号变成坐标,在地图上更易处理 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 嵌入矩阵 | X | <每个token_id对应的embedding向量堆叠,形状[n,d_model](如d_model=4096);每行是该token在语义空间的连续浮点表示> | → s5 | ||||||
| s5 | 注入位置信息到 嵌入矩阵 得带位置的 隐状态矩阵 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 嵌入矩阵 | X | <每个token_id对应的embedding向量堆叠,形状[n,d_model](如d_model=4096);每行是该token在语义空间的连续浮点表示> | ← s4.X | <llm> | 修改/增/添加 | 方式A(绝对/可学习位置嵌入):X = X + PosEmbed(positions),将位置向量叠加到token embedding上 | 方式A:X=X+PosEmbed(positions),位置嵌入是可学习参数或正弦编码;方式B(RoPE/ALiBi):不在此处处理,在每层Attention子层内部对Q/K施加位置相关旋转变换(见s6.3);两方案区别:绝对位置告诉模型你在第几位,相对位置告诉模型你们相距多远 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | X | <加入位置信息后的输入矩阵,形状[n,d_model];若方式A则X+=PosEmbed;若方式B(RoPE)则X不变,位置编码在s6.3对Q/K旋转注入> | → s6 | ||||||
| ▼ s6 | 遍历 L个Transformer层做前向计算,逐层更新隐状态建立跨位置依赖 | 主体生成 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | X | <加入位置信息后的输入矩阵,形状[n,d_model];若方式A则X+=PosEmbed;若方式B(RoPE)则X不变,位置编码在s6.3对Q/K旋转注入> | ← s5.X | - | 生成/元素生成 | 遍历 | - | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | XL | <经L层Transformer前向计算后的最终隐状态,形状[n,d_model];XL[n-1]代表读完整段prompt后的当前上下文状态> | → s7 | ||||||||
| └ s6.1 | Pre-Norm后线性投影 隐状态矩阵 得 QKV矩阵组 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | X | <当前层l的输入隐状态,形状[n,d_model]> | ← s6.X[l] | <llm> | 提取/化学提取/反推 | Pre-Norm:H=Norm(X)(RMSNorm/LayerNorm);线性投影:Q=H*Wq, K=H*Wk, V=H*Wv | Pre-Norm稳定数值尺度,降低激活异常风险;Q/K/V把同一隐状态映射到查询/键/值三个子空间;类比名片(Q)/目录索引(K)/具体内容(V)三件事分开做 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | QKV矩阵组 | Q_K_V | <Q/K/V各形状[n,d_model];H分别右乘Wq/Wk/Wv线性变换得到;Q负责查询匹配,K负责键索引,V负责值聚合> | → s6.2 | ||||||
| └ s6.2 | reshape QKV矩阵组 为 多头QKV 准备并行注意力 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | QKV矩阵组 | Q_K_V | <Q/K/V各形状[n,d_model];H分别右乘Wq/Wk/Wv线性变换得到;Q负责查询匹配,K负责键索引,V负责值聚合> | ← s6.1.Q_K_V | <llm> | 修改/变/转换 | 将Q/K/V从[n,d_model]reshape为[n,n_heads,d_head],拆分为多个注意力头 | d_head=d_model/n_heads;目的:让不同head学到不同关系子空间,并行建模多种依赖;类比同一段话同时从语法、指代、主题等多个角度去读 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 多头QKV | Q_K_V_heads | <Q/K/V各reshape为[n,n_heads,d_head];Head 1关注语法关系,Head 2关注指代,Head h关注主题等,并行计算> | → s6.3 | ||||||
| └ s6.3 | 对 多头QKV 的Q/K施加RoPE旋转注入相对位置信息 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 多头QKV | Q_K_V_heads | <Q/K/V各reshape为[n,n_heads,d_head];Head 1关注语法关系,Head 2关注指代,Head h关注主题等,并行计算> | ← s6.2.Q_K_V_heads | <llm> | 修改/变/调整 | 若使用RoPE:对每个head的Q/K应用旋转位置编码(旋转矩阵依赖token相对位置),V不做位置编码 | RoPE目的:以相对关系形式将位置信息注入注意力匹配,保持相对距离语义;类比把相对距离编码进匹配规则里;若已在s5使用绝对位置嵌入,此步可跳过;ALiBi是另一种方案:在attention score上直接加偏置 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 多头QKV | Q_K_V_pos | <Q'/K'已施加RoPE旋转携带相对位置信息,V不变;可进行位置感知的注意力计算> | → s6.4 | ||||||
| └ s6.4 | 点积计算并施加Causal Mask得 注意力分数矩阵 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 多头QKV | Q_K_V_pos | <Q'/K'已施加RoPE旋转携带相对位置信息,V不变;可进行位置感知的注意力计算> | ← s6.3.Q_K_V_pos | <llm> | 生成/元素生成 | 计算注意力分数S=QK^T/sqrt(d_head);施加因果mask(Causal Mask)将未来位置设为-∞,并结合padding mask | Causal Mask确保当前位置不能看未来信息(自回归语义正确性);-∞经softmax后→0;padding mask防止填充位置参与计算;类比读书时把后面的内容遮住 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 注意力分数矩阵 | S_masked | <形状[n_heads,n,n];未来位置=-∞(mask后),历史/当前位置=有效QK点积分数/sqrt(d_head)> | → s6.5 | ||||||
| /理念/知识/商业/前沿技术/AI智能/机器学习 | 注意力掩码 | attention_mask | <与padded_token_ids同形状的二元mask,有效token=1,padding=0;用于标记哪些位置参与注意力计算> | ← s3.attention_mask | ||||||||||||||||||||
| └ s6.5 | Softmax归一化后加权聚合V得 注意力输出矩阵 | 主体生成 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 注意力分数矩阵 | S_masked | <形状[n_heads,n,n];未来位置=-∞(mask后),历史/当前位置=有效QK点积分数/sqrt(d_head)> | ← s6.4.S_masked | <llm> | 生成/元素生成 | 对S_masked最后一维做softmax归一化得注意力权重A=softmax(S);加权求和O=AV | Softmax把分数归一化为概率分布(和=1),便于加权求和;O=AV,每个位置的输出是所有历史V的注意力加权平均;类比把多个小组意见按权重相加得一份摘要 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 注意力输出矩阵 | O_heads | <形状[n,n_heads,d_head];每个位置的O是历史V向量的注意力加权平均;A=softmax(S),O=AV> | → s6.6 | ||||||
| └ s6.6 | 输出投影+残差连接完成Attention子层输出 隐状态矩阵 | 主体生成 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 注意力输出矩阵 | O_heads | <形状[n,n_heads,d_head];每个位置的O是历史V向量的注意力加权平均;A=softmax(S),O=AV> | ← s6.5.O_heads | <llm> | 修改/增/添加 | 输出投影:O=concat(all_heads)*Wo,将多头结果投影回d_model;残差连接1:X'=X+O | 输出投影concat各head后经Wo线性变换回d_model;残差连接让深层网络更易梯度传播;类比在改稿时保留原稿主线再叠加补充内容 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | X_prime | <Attention子层完成后的中间隐状态,形状[n,d_model];X'=X+O*Wo,已融合多头注意力信息> | → s6.7 | ||||||
| /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | X | <当前层l的输入隐状态,形状[n,d_model]> | ← s6.1.X | ||||||||||||||||||||
| └ s6.7 | MLP/FFN非线性变换+残差连接得更新后的 隐状态矩阵 | 主体生成 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | X_prime | <Attention子层完成后的中间隐状态,形状[n,d_model];X'=X+O*Wo,已融合多头注意力信息> | ← s6.6.X_prime | <llm> | 修改/增/添加 | FFN/MLP子层:M=MLP(Norm(X')),两层线性+激活(SwiGLU/GEGLU/GELU);残差连接2:X=X'+M | MLP:Norm(X')→Linear(d_model→4d_model)→激活→Linear(4d_model→d_model);提供每个token位置的非线性变换与通道混合能力,补足注意力的表达能力;类比对每个位置做一次本地加工/润色 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | X_updated | <当前Transformer层最终输出,形状[n,d_model];X=X'+M,经Attention+MLP两个子层处理,传入下一层> | → s6[i+1] / → s6.8 | ||||||
| └ s6.8 | 将当前层K/V写入 KV缓存 供decode阶段复用 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | QKV矩阵组 | K_V_current | <当前层l的K和V矩阵,各形状[n,n_heads,d_head],将被缓存供后续decode阶段复用> | ← s6.1.Q_K_V | <llm> | 存储/暂存/缓存 | 将当前层l的K和V矩阵(按head)写入KV Cache存储 | KV Cache作用:后续每生成新token时不必重新计算整段prompt的K/V,解码复杂度从O(T²)降至近似O(T);存储结构:每层[2,n_heads,seq_len,d_head];类比做题时把已读材料做成笔记后面不必从头翻 | - | 写外部 | /理念/知识/商业/前沿技术/AI智能/机器学习 | KV缓存 | kv_cache | <按层和head组织的K/V缓存;prefill阶段写满所有n个位置;每层形状[2,n_heads,n,d_head](2=K+V);供后续续token生成的decode阶段读取> | → 返回 KV缓存 | ||||||
| s7 | 取 隐状态矩阵 最后位置得 位置向量 x_last | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 隐状态矩阵 | XL | <经L层Transformer前向计算后的最终隐状态,形状[n,d_model];XL[n-1]代表读完整段prompt后的当前上下文状态> | ← s6.XL | <llm> | 提取/物理提取/裁切 | 从最终隐状态XL中取最后一个序列位置:x_last=XL[n-1] | Prefill阶段对prompt每个位置都有隐状态输出,但只需最后位置x_last生成第一个token;x_last代表读完整段prompt后的当前上下文压缩表示 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 位置向量 | x_last | <XL最后一行XL[n-1],形状[d_model,];代表模型读完整段prompt后的当前上下文压缩状态> | → s8 | ||||||
| s8 | FinalNorm归一化 位置向量 得对齐尺度的 归一化向量 h | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 位置向量 | x_last | <XL最后一行XL[n-1],形状[d_model,];代表模型读完整段prompt后的当前上下文压缩状态> | ← s7.x_last | <llm> | 修改/变/增强 | Final Norm:h=FinalNorm(x_last),常见为RMSNorm/LayerNorm | 目的:把最终表征对齐到LM Head期望的数值尺度;类比出门前把指南针校准;取决于具体模型结构是否有FinalNorm(部分模型有,部分没有) | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 归一化向量 | h | <经FinalNorm处理后的最终表征,形状[d_model,];数值尺度对齐到LM Head期望范围> | → s9 | ||||||
| s9 | LM Head矩阵乘法得覆盖全词表的 logits向量 | 主体生成 | /理念/知识/商业/前沿技术/AI智能/机器学习 | 归一化向量 | h | <经FinalNorm处理后的最终表征,形状[d_model,];数值尺度对齐到LM Head期望范围> | ← s8.h | <llm> | 生成/元素生成 | LM Head矩阵乘法:logits=h*W_vocab,W_vocab形状[d_model,vocab_size] | logits是未归一化原始分数,形状[vocab_size,];代表第一个输出token的候选得分,覆盖整个词表;还未经softmax不是概率;类比把当前想法翻译成一张候选词得分榜 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | logits向量 | logits | <形状[vocab_size,]的未归一化原始分数,如[3.2,2.8,1.5,...,-0.3];每个位置对应词表一个token的预测得分;还未经softmax不是概率> | → s10 | ||||||
| s10 | 用 解码配置 对 logits向量 做Temperature等调整 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | logits向量 | logits | <形状[vocab_size,]的未归一化原始分数,如[3.2,2.8,1.5,...,-0.3];每个位置对应词表一个token的预测得分;还未经softmax不是概率> | ← s9.logits | <llm> | 修改/变/调整 | 可选:Temperature缩放(logits/T)+Logits bias(特定token加减分)+重复惩罚(降低已出现token分数)+Bad words mask(直接屏蔽某些token) | 可选步骤:目的是把基础模型偏好对齐到产品目标与可控性要求;T越低越确定,T越高越发散;Logits bias用于安全/风格控制;类比在出答案前调一调说话风格/谨慎程度旋钮 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | logits向量 | adjusted_logits | <经Temperature缩放+偏置+惩罚+屏蔽处理后的logits,形状仍[vocab_size,];不期望token得分被调整或置为-∞> | → s11 | ||||||
| /理念/知识/商业/前沿技术/AI智能/AI应用 | 解码配置 | decoding_params | <解码参数配置:temperature(如1.0),logits_bias(token级加减分词典),repetition_penalty(重复惩罚系数),bad_words_ids(屏蔽token列表)> | ← 工序输入 | ||||||||||||||||||||
| s11 | Top-k/Top-p截断 logits向量 得精简 候选Token列表 | 预处理 | /理念/知识/商业/前沿技术/AI智能/机器学习 | logits向量 | adjusted_logits | <经Temperature缩放+偏置+惩罚+屏蔽处理后的logits,形状仍[vocab_size,];不期望token得分被调整或置为-∞> | ← s10.adjusted_logits | <llm> | 提取/物理提取/裁切 | 可选截断:Top-k(只保留前k个分数最高的token)/ Top-p(累积概率达p截断)/ Min-p(低于阈值全过滤)/ Typical(保留类型性制的) | 可选步骤:降低长尾噪声,提升可读性/一致性;先列候选短名单再做决定;Top-k和Top-p常组合使用 | - | 幂等 | /理念/知识/商业/前沿技术/AI智能/机器学习 | /架构/逻辑/信息编排逻辑/条目列举/逐条罗列/通用列举 | 候选Token列表 | candidate_logits | <经Top-k/Top-p截断后的候选token子集,其余位置logits置为-∞;形状仍[vocab_size,]但有效候选数远小于vocab_size> | → s12 | |||||
| s12 | 采样/贪心从 候选Token列表 选出并Detokenize为 输出Token | 交付 | /理念/知识/商业/前沿技术/AI智能/机器学习 | /架构/逻辑/信息编排逻辑/条目列举/逐条罗列/通用列举 | 候选Token列表 | candidate_logits | <经Top-k/Top-p截断后的候选token子集,其余位置logits置为-∞;形状仍[vocab_size,]但有效候选数远小于vocab_size> | ← s11.candidate_logits | <llm> | 生成/元素生成 | Sampling:softmax(candidate_logits)得概率分布→随机按概率采样;Greedy:argmax(candidate_logits)直接选最高分;得到next_token_id后Detokenize为字符/子词 | Sampling目的:多样性;Greedy目的:确定性可复现;两者选择取决于应用场景;Detokenize把整数ID还原为用户可见文本;第一个token产出后进入自回归循环 | - | 随机 | /理念/知识/商业/前沿技术/AI智能/AI应用 | 输出Token | first_token | <第一个生成Token,如next_token_id=1234对应'的';Detokenize后为字符或子词(如'##子'前缀);后续进入自回归循环续token生成> | → 返回 first_token | |||||
| ↩ | 返回 输出Token 第一个生成Token(字符/子词,可继续自回归循环) | |||||||||||||||||||||||