我花 1 小时搞懂了 LLM 的核心原理从 Token 到 Attention用代码逐行实现适合想理解大语言模型LLM底层原理的开发者不需要深度学习基础。本文用 Python 代码逐行实现 LLM 的核心组件不依赖任何深度学习框架。为什么要理解 LLM 原理用 AI 工具不需要理解原理就像开车不需要懂发动机。但如果你想调优 prompt知道为什么某个 prompt 效果好选模型知道 7B 和 70B 的区别在哪优化成本知道 token 是怎么计算的开发 Agent知道上下文窗口的限制在哪就需要理解 LLM 的核心原理。核心概念 1Token词元LLM 不是按字处理文本而是按token。defsimple_tokenize(text):简化的 token 化按空格和标点分割importre# 按空格、标点分割tokensre.findall(r\w|[^\w\s],text)returntokens# 示例text我用 Python 写了一个自动化脚本tokenssimple_tokenize(text)print(tokens)# [我, 用, Python, 写, 了, 一个, 自动化, 脚本]print(fToken 数:{len(tokens)})# Token 数: 8实际的 tokenizer如 GPT 用的 BPE更复杂会把常见词组合并# 自动化 可能被拆成 自动 化2 个 token# Python 是 1 个 token# 1 个中文字 ≈ 1.5-2 个 token为什么重要API 按 token 收费prompt 回复的总 token 数决定成本。核心概念 2Embedding向量化LLM 把每个 token 转成一个数字向量一组浮点数才能做数学运算。importnumpyasnpdefsimple_embedding(tokens,dim8):简化的 embedding把 token 映射到随机向量# 实际中这些向量是训练出来的这里用随机数演示np.random.seed(42)vocab{token:np.random.randn(dim)fortokeninset(tokens)}returnnp.array([vocab[t]fortintokens])tokens[我,用,Python,写]vectorssimple_embedding(tokens,dim8)print(f输入:{tokens})print(f向量形状:{vectors.shape})# (4, 8) - 4 个 token每个 8 维为什么重要Embedding 是 LLM 理解语义的基础。相似含义的词向量距离近。核心概念 3Self-Attention自注意力这是 Transformer 的核心机制——让每个 token 关注其他 token理解上下文关系。defself_attention(x,dim8):简化的自注意力机制np.random.seed(42)# 1. 生成 Q查询、K键、V值矩阵W_qnp.random.randn(dim,dim)*0.1W_knp.random.randn(dim,dim)*0.1W_vnp.random.randn(dim,dim)*0.1Qx W_q# 查询向量Kx W_k# 键向量Vx W_v# 值向量# 2. 计算注意力分数Q 和 K 的点积scoresQ K.T/(dim**0.5)# 缩放点积# 3. Softmax 归一化exp_scoresnp.exp(scores-np.max(scores,axis-1,keepdimsTrue))attention_weightsexp_scores/np.sum(exp_scores,axis-1,keepdimsTrue)# 4. 加权求和outputattention_weights Vreturnoutput,attention_weights# 示例tokens[我,用,Python,写,代码]vectorssimple_embedding(tokens,dim8)output,weightsself_attention(vectors)print(f注意力权重矩阵:)fori,tokeninenumerate(tokens):row[f{weights[i][j]:.2f}forjinrange(len(tokens))]print(f{token}:{row})输出示例注意力权重矩阵: 我: [0.15, 0.20, 0.18, 0.25, 0.22] 用: [0.18, 0.15, 0.22, 0.23, 0.22] Python: [0.16, 0.20, 0.17, 0.25, 0.22] 写: [0.20, 0.18, 0.22, 0.18, 0.22] 代码: [0.19, 0.17, 0.21, 0.22, 0.21]解读写对Python和代码的注意力权重较高0.22, 0.22说明模型理解了写 Python 代码这个语义关系。为什么重要Attention 让 LLM 能理解上下文。“我在银行存钱和我在河边的银行坐着”银行的含义不同就是靠 Attention 来区分的。核心概念 4Feed Forward前馈网络Attention 之后每个 token 的向量会经过一个前馈网络做进一步变换。deffeed_forward(x,hidden_dim16):简化的前馈网络两层线性变换 ReLUnp.random.seed(42)input_dimx.shape[-1]# 第一层扩展维度W1np.random.randn(input_dim,hidden_dim)*0.1b1np.zeros(hidden_dim)hnp.maximum(0,x W1b1)# ReLU 激活# 第二层压缩回原维度W2np.random.randn(hidden_dim,input_dim)*0.1b2np.zeros(input_dim)outputh W2b2returnoutput核心概念 5Transformer Block完整的一层把 Attention Feed Forward 残差连接组合在一起就是一个 Transformer Blockdeftransformer_block(x,dim8):一个 Transformer Block Attention Feed Forward 残差# 1. 自注意力attn_output,_self_attention(x,dim)# 2. 残差连接xxattn_output# 3. 前馈网络ff_outputfeed_forward(x)# 4. 残差连接xxff_outputreturnxGPT-4 有约 120 个这样的 Block 堆叠在一起每个 Block 让模型对文本的理解更深一层。核心概念 6生成过程自回归LLM 生成文本的方式是一个 token 一个 token 地生成每次预测下一个最可能的 token。defsimple_generate(prompt_tokens,vocab,num_tokens5):简化的文本生成逐 token 预测generatedlist(prompt_tokens)for_inrange(num_tokens):# 1. 对当前所有 token 做 embeddingvectorssimple_embedding(generated,dim8)# 2. 过 Transformer Blockoutputtransformer_block(vectors)# 3. 取最后一个 token 的输出预测下一个 tokenlast_outputoutput[-1]# 4. 简化版用向量的 argmax 选 token实际用 softmax 采样scores{token:np.dot(last_output,np.random.randn(8))fortokeninvocab}next_tokenmax(scores,keyscores.get)generated.append(next_token)returngenerated# 示例vocab[我,用,Python,写,了,一个,自动化,脚本,。]resultsimple_generate([我,用,Python],vocab,num_tokens5)print(生成结果:,.join(result))为什么重要理解自回归生成就理解了为什么 LLM 有时会一本正经地胡说八道——它在逐 token 预测如果中间某个 token 预测错了后面会越偏越远。核心概念 7Temperature温度Temperature 控制生成的随机性。defsample_with_temperature(logits,temperature1.0):带温度的采样# logits: 每个 token 的得分# temperature: 越高越随机越低越确定scaledlogits/temperature exp_scalednp.exp(scaled-np.max(scaled))probsexp_scaled/np.sum(exp_scaled)# 按概率采样returnnp.random.choice(len(probs),pprobs)# temperature 0.1: 几乎总是选最高分的 token确定性强# temperature 1.0: 正常采样# temperature 2.0: 非常随机实用建议写代码/数学推理temperature 0确定性最高写文章/创意内容temperature 0.7-0.9有创意但不乱来头脑风暴temperature 1.5非常随机完整的简化 LLM把所有组件组合起来classSimpleLLM:简化版 LLMdef__init__(self,vocab,dim8,num_layers2):self.vocabvocab self.dimdim self.num_layersnum_layersdefforward(self,tokens):前向传播# 1. Token 化 Embeddingxsimple_embedding(tokens,self.dim)# 2. 过 N 个 Transformer Blockfor_inrange(self.num_layers):xtransformer_block(x,self.dim)returnxdefgenerate(self,prompt,max_tokens10):生成文本tokenssimple_tokenize(prompt)generatedlist(tokens)for_inrange(max_tokens):outputself.forward(generated)# 预测下一个 token简化版next_tokenself._predict_next(output[-1])ifnext_token[END]:breakgenerated.append(next_token)return.join(generated)关键参数与模型大小参数含义GPT-4 约值参数量模型的权重数量~1.8 万亿层数Transformer Block 数量~120 层隐藏维度每个 token 的向量维度~12288注意力头数多头注意力的头数~96上下文窗口能处理的最大 token 数128K模型大小 参数量 × 每个参数的存储空间7B 模型 ≈ 14GBFP1670B 模型 ≈ 140GBFP16量化后INT47B ≈ 4GB70B ≈ 35GB踩坑记录坑 1把 Token 和字搞混症状以为 3000 字 3000 tokens结果 API 费用比预期高 50%。原因中文 1 字 ≈ 1.5-2 tokens比英文贵。解决用 tokenizer 工具如 tiktoken精确计算 token 数。坑 2不理解上下文窗口症状把 10 篇文章一次性塞给 LLM结果超了 128K token 限制。原因上下文窗口 prompt 回复的总 token 数。解决长文档分块处理每次只传相关部分。坑 3Temperature 设错症状写代码时设了 temperature1.5生成的代码到处是语法错误。原因高温度增加随机性代码需要确定性。解决写代码用 temperature0 或 0.1。坑 4以为模型越大越好症状用了 70B 模型做简单分类成本是 7B 的 10 倍效果提升不到 5%。原因简单任务不需要大模型。解决按任务复杂度选模型简单任务用小模型。坑 5不理解幻觉症状LLM 说Python 3.13 支持模式匹配但 Python 3.10 就支持了。原因LLM 是概率模型不是数据库。它会编造看起来合理但不准确的信息。解决关键信息必须人工验证不能完全信任 LLM 的输出。总结3 条核心经验LLM 的核心是 Attention。它让模型能理解上下文关系是 LLM 区别于传统 NLP 的关键。LLM 是逐 token 生成的。理解自回归生成就理解了 LLM 的能力边界为什么有时胡说八道。参数量决定能力上限但不决定性价比。简单任务用小模型够了大模型只在复杂推理时才值得。你对 LLM 原理有什么疑问评论区交流。
我花 1 小时搞懂了 LLM 的核心原理:从 Token 到 Attention,用代码逐行实现
发布时间:2026/6/17 16:22:05
我花 1 小时搞懂了 LLM 的核心原理从 Token 到 Attention用代码逐行实现适合想理解大语言模型LLM底层原理的开发者不需要深度学习基础。本文用 Python 代码逐行实现 LLM 的核心组件不依赖任何深度学习框架。为什么要理解 LLM 原理用 AI 工具不需要理解原理就像开车不需要懂发动机。但如果你想调优 prompt知道为什么某个 prompt 效果好选模型知道 7B 和 70B 的区别在哪优化成本知道 token 是怎么计算的开发 Agent知道上下文窗口的限制在哪就需要理解 LLM 的核心原理。核心概念 1Token词元LLM 不是按字处理文本而是按token。defsimple_tokenize(text):简化的 token 化按空格和标点分割importre# 按空格、标点分割tokensre.findall(r\w|[^\w\s],text)returntokens# 示例text我用 Python 写了一个自动化脚本tokenssimple_tokenize(text)print(tokens)# [我, 用, Python, 写, 了, 一个, 自动化, 脚本]print(fToken 数:{len(tokens)})# Token 数: 8实际的 tokenizer如 GPT 用的 BPE更复杂会把常见词组合并# 自动化 可能被拆成 自动 化2 个 token# Python 是 1 个 token# 1 个中文字 ≈ 1.5-2 个 token为什么重要API 按 token 收费prompt 回复的总 token 数决定成本。核心概念 2Embedding向量化LLM 把每个 token 转成一个数字向量一组浮点数才能做数学运算。importnumpyasnpdefsimple_embedding(tokens,dim8):简化的 embedding把 token 映射到随机向量# 实际中这些向量是训练出来的这里用随机数演示np.random.seed(42)vocab{token:np.random.randn(dim)fortokeninset(tokens)}returnnp.array([vocab[t]fortintokens])tokens[我,用,Python,写]vectorssimple_embedding(tokens,dim8)print(f输入:{tokens})print(f向量形状:{vectors.shape})# (4, 8) - 4 个 token每个 8 维为什么重要Embedding 是 LLM 理解语义的基础。相似含义的词向量距离近。核心概念 3Self-Attention自注意力这是 Transformer 的核心机制——让每个 token 关注其他 token理解上下文关系。defself_attention(x,dim8):简化的自注意力机制np.random.seed(42)# 1. 生成 Q查询、K键、V值矩阵W_qnp.random.randn(dim,dim)*0.1W_knp.random.randn(dim,dim)*0.1W_vnp.random.randn(dim,dim)*0.1Qx W_q# 查询向量Kx W_k# 键向量Vx W_v# 值向量# 2. 计算注意力分数Q 和 K 的点积scoresQ K.T/(dim**0.5)# 缩放点积# 3. Softmax 归一化exp_scoresnp.exp(scores-np.max(scores,axis-1,keepdimsTrue))attention_weightsexp_scores/np.sum(exp_scores,axis-1,keepdimsTrue)# 4. 加权求和outputattention_weights Vreturnoutput,attention_weights# 示例tokens[我,用,Python,写,代码]vectorssimple_embedding(tokens,dim8)output,weightsself_attention(vectors)print(f注意力权重矩阵:)fori,tokeninenumerate(tokens):row[f{weights[i][j]:.2f}forjinrange(len(tokens))]print(f{token}:{row})输出示例注意力权重矩阵: 我: [0.15, 0.20, 0.18, 0.25, 0.22] 用: [0.18, 0.15, 0.22, 0.23, 0.22] Python: [0.16, 0.20, 0.17, 0.25, 0.22] 写: [0.20, 0.18, 0.22, 0.18, 0.22] 代码: [0.19, 0.17, 0.21, 0.22, 0.21]解读写对Python和代码的注意力权重较高0.22, 0.22说明模型理解了写 Python 代码这个语义关系。为什么重要Attention 让 LLM 能理解上下文。“我在银行存钱和我在河边的银行坐着”银行的含义不同就是靠 Attention 来区分的。核心概念 4Feed Forward前馈网络Attention 之后每个 token 的向量会经过一个前馈网络做进一步变换。deffeed_forward(x,hidden_dim16):简化的前馈网络两层线性变换 ReLUnp.random.seed(42)input_dimx.shape[-1]# 第一层扩展维度W1np.random.randn(input_dim,hidden_dim)*0.1b1np.zeros(hidden_dim)hnp.maximum(0,x W1b1)# ReLU 激活# 第二层压缩回原维度W2np.random.randn(hidden_dim,input_dim)*0.1b2np.zeros(input_dim)outputh W2b2returnoutput核心概念 5Transformer Block完整的一层把 Attention Feed Forward 残差连接组合在一起就是一个 Transformer Blockdeftransformer_block(x,dim8):一个 Transformer Block Attention Feed Forward 残差# 1. 自注意力attn_output,_self_attention(x,dim)# 2. 残差连接xxattn_output# 3. 前馈网络ff_outputfeed_forward(x)# 4. 残差连接xxff_outputreturnxGPT-4 有约 120 个这样的 Block 堆叠在一起每个 Block 让模型对文本的理解更深一层。核心概念 6生成过程自回归LLM 生成文本的方式是一个 token 一个 token 地生成每次预测下一个最可能的 token。defsimple_generate(prompt_tokens,vocab,num_tokens5):简化的文本生成逐 token 预测generatedlist(prompt_tokens)for_inrange(num_tokens):# 1. 对当前所有 token 做 embeddingvectorssimple_embedding(generated,dim8)# 2. 过 Transformer Blockoutputtransformer_block(vectors)# 3. 取最后一个 token 的输出预测下一个 tokenlast_outputoutput[-1]# 4. 简化版用向量的 argmax 选 token实际用 softmax 采样scores{token:np.dot(last_output,np.random.randn(8))fortokeninvocab}next_tokenmax(scores,keyscores.get)generated.append(next_token)returngenerated# 示例vocab[我,用,Python,写,了,一个,自动化,脚本,。]resultsimple_generate([我,用,Python],vocab,num_tokens5)print(生成结果:,.join(result))为什么重要理解自回归生成就理解了为什么 LLM 有时会一本正经地胡说八道——它在逐 token 预测如果中间某个 token 预测错了后面会越偏越远。核心概念 7Temperature温度Temperature 控制生成的随机性。defsample_with_temperature(logits,temperature1.0):带温度的采样# logits: 每个 token 的得分# temperature: 越高越随机越低越确定scaledlogits/temperature exp_scalednp.exp(scaled-np.max(scaled))probsexp_scaled/np.sum(exp_scaled)# 按概率采样returnnp.random.choice(len(probs),pprobs)# temperature 0.1: 几乎总是选最高分的 token确定性强# temperature 1.0: 正常采样# temperature 2.0: 非常随机实用建议写代码/数学推理temperature 0确定性最高写文章/创意内容temperature 0.7-0.9有创意但不乱来头脑风暴temperature 1.5非常随机完整的简化 LLM把所有组件组合起来classSimpleLLM:简化版 LLMdef__init__(self,vocab,dim8,num_layers2):self.vocabvocab self.dimdim self.num_layersnum_layersdefforward(self,tokens):前向传播# 1. Token 化 Embeddingxsimple_embedding(tokens,self.dim)# 2. 过 N 个 Transformer Blockfor_inrange(self.num_layers):xtransformer_block(x,self.dim)returnxdefgenerate(self,prompt,max_tokens10):生成文本tokenssimple_tokenize(prompt)generatedlist(tokens)for_inrange(max_tokens):outputself.forward(generated)# 预测下一个 token简化版next_tokenself._predict_next(output[-1])ifnext_token[END]:breakgenerated.append(next_token)return.join(generated)关键参数与模型大小参数含义GPT-4 约值参数量模型的权重数量~1.8 万亿层数Transformer Block 数量~120 层隐藏维度每个 token 的向量维度~12288注意力头数多头注意力的头数~96上下文窗口能处理的最大 token 数128K模型大小 参数量 × 每个参数的存储空间7B 模型 ≈ 14GBFP1670B 模型 ≈ 140GBFP16量化后INT47B ≈ 4GB70B ≈ 35GB踩坑记录坑 1把 Token 和字搞混症状以为 3000 字 3000 tokens结果 API 费用比预期高 50%。原因中文 1 字 ≈ 1.5-2 tokens比英文贵。解决用 tokenizer 工具如 tiktoken精确计算 token 数。坑 2不理解上下文窗口症状把 10 篇文章一次性塞给 LLM结果超了 128K token 限制。原因上下文窗口 prompt 回复的总 token 数。解决长文档分块处理每次只传相关部分。坑 3Temperature 设错症状写代码时设了 temperature1.5生成的代码到处是语法错误。原因高温度增加随机性代码需要确定性。解决写代码用 temperature0 或 0.1。坑 4以为模型越大越好症状用了 70B 模型做简单分类成本是 7B 的 10 倍效果提升不到 5%。原因简单任务不需要大模型。解决按任务复杂度选模型简单任务用小模型。坑 5不理解幻觉症状LLM 说Python 3.13 支持模式匹配但 Python 3.10 就支持了。原因LLM 是概率模型不是数据库。它会编造看起来合理但不准确的信息。解决关键信息必须人工验证不能完全信任 LLM 的输出。总结3 条核心经验LLM 的核心是 Attention。它让模型能理解上下文关系是 LLM 区别于传统 NLP 的关键。LLM 是逐 token 生成的。理解自回归生成就理解了 LLM 的能力边界为什么有时胡说八道。参数量决定能力上限但不决定性价比。简单任务用小模型够了大模型只在复杂推理时才值得。你对 LLM 原理有什么疑问评论区交流。