彻底搞懂大语言模型:从Tokens到Transformer架构的全景解析
你是否曾好奇ChatGPT如何理解你的问题?为何一句简单的"帮我写封道歉邮件"能触发如此流畅的回应?本文将带你揭开大语言模型(LLM)的神秘面纱,从最基础的文本拆分(Tokenization)到复杂的Transformer架构,用生动案例和可视化图表拆解LLM的工作原理。读完本文,你将掌握:
- 文本如何被拆分为计算机可理解的"语言积木"(Tokens)
- 30秒看懂Transformer架构的核心组件
- 模型如何通过注意力机制理解上下文关系
- 从零开始运行你的第一个LLM推理示例
一、Tokens:大语言模型的"文字积木"
想象你正在学习一门外星语言,首要任务是掌握它的字母表。对LLM而言,这个"字母表"就是Tokens(标记) ——模型理解文本的最小单位。与人类语言不同,LLM的"词汇"是动态生成的,可能包含完整单词、词根甚至表情符号。
1.1 Tokenization:文本拆分的艺术
当你输入"Write an email apologizing to Sarah",模型首先会调用Tokenizer(分词器) 将其拆分为类似以下的序列:
[1, 14350, 385, 4876, 27746, 5281, 304, 19235, 363, 278, 25305]
这些数字对应模型词汇表中的具体Token。通过tokenizer.decode()函数可还原为:
"<s> Write an email apologizing to Sarah"
📌 关键发现:不同模型的分词策略差异巨大。BERT可能将"apologizing"拆为"apolo"和"##gizing",而GPT-4可能直接识别为完整单词。这种差异直接影响模型性能,详见Chapter 2 - Tokens and Token Embeddings.ipynb的对比实验。
1.2 可视化Token拆分过程
通过项目提供的show_tokens函数,我们可以直观对比不同模型的分词结果:
from transformers import AutoTokenizer
def show_tokens(text, model_name):
tokenizer = AutoTokenizer.from_pretrained(model_name)
tokens = tokenizer.tokenize(text)
print(f"{model_name}: {tokens}")
show_tokens("大语言模型基础教程", "bert-base-chinese")
# 输出: ['大', '语', '言', '模', '型', '基', '础', '教', '程']
show_tokens("大语言模型基础教程", "ernie-3.0-base-zh")
# 输出: ['大语言', '模型', '基础', '教程']
1.3 Token Embeddings:赋予文字数学意义
拆分后的Token需要转换为计算机可处理的向量,这个过程称为嵌入(Embedding)。在Phi-3模型中,每个Token会被映射为3072维的向量:
# 模型嵌入层定义(来自Phi-3架构)
Embedding(32064, 3072, padding_idx=32000)
这意味着模型词汇表包含32064个Token,每个Token被表示为3072个数字组成的向量。这些向量通过训练学习到语义关系,例如"君主"-"男人"+"女人"≈"女君主"的著名类比就源于此。
二、Transformer架构:LLM的"大脑"结构
2017年Google发表的《Attention Is All You Need》论文彻底改变了NLP领域。Transformer架构抛弃了传统的RNN循环结构,采用自注意力机制(Self-Attention),使模型能并行处理文本并捕捉长距离依赖关系。
2.1 核心组件解析
Phi-3-mini模型的简化架构如下(完整代码见Chapter 3 - Looking Inside LLMs.ipynb):
Phi3ForCausalLM(
(model): Phi3Model(
(embed_tokens): Embedding(32064, 3072) # Token嵌入层
(layers): ModuleList( # 32个Decoder层堆叠
(0-31): 32 x Phi3DecoderLayer(
(self_attn): Phi3Attention( # 自注意力模块
(qkv_proj): Linear(3072, 9216) # QKV投影
(o_proj): Linear(3072, 3072) # 输出投影
)
(mlp): Phi3MLP( # 前馈神经网络
(gate_up_proj): Linear(3072, 16384)
(down_proj): Linear(8192, 3072)
)
)
)
(norm): Phi3RMSNorm() # 归一化层
)
(lm_head): Linear(3072, 32064) # 语言模型头
)
2.2 自注意力机制:模型如何"思考"
当处理"猫坐在垫子上,它很舒服"这句话时,自注意力机制帮助模型理解"它"指代"猫"而非"垫子"。在Phi-3中,注意力计算通过以下步骤实现:
- QKV生成:将输入向量转换为Query(查询)、Key(键)、Value(值)
- 相似度计算:通过Q·K^T计算Token间关联强度
- 注意力权重:经Softmax归一化得到权重分布
- 加权求和:V与注意力权重相乘,聚合相关信息
📊 可视化理解:项目images目录中的
bonus_overview.png展示了注意力权重的热图分布,红色区域表示高关注度。
2.3 从输入到输出的完整流程
以下是"巴黎是法国的首都"的推理过程简化代码:
prompt = "The capital of France is"
input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to("cuda")
# 获取模型最后一层输出
last_hidden_state = model.model(input_ids)[0] # shape: (1, 6, 3072)
# 通过语言模型头预测下一个Token
logits = model.lm_head(last_hidden_state) # shape: (1, 6, 32064)
next_token_id = logits[0, -1].argmax(-1) # 找到概率最高的Token
print(tokenizer.decode(next_token_id)) # 输出: " Paris"
三、动手实践:运行你的第一个LLM
现在让我们通过项目提供的代码库,实际体验大语言模型的工作流程。以下步骤基于Chapter 1 - Introduction to Language Models.ipynb的简化版本。
3.1 环境准备
首先克隆项目仓库并安装依赖:
git clone https://gitcode.com/GitHub_Trending/ha/Hands-On-Large-Language-Models
cd Hands-On-Large-Language-Models
pip install -r requirements.txt
3.2 加载Phi-3模型
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3-mini-4k-instruct",
device_map="cuda",
torch_dtype="auto"
)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
3.3 生成文本
messages = [{"role": "user", "content": "Create a funny joke about chickens."}]
inputs = tokenizer.apply_chat_template(messages, return_tensors="pt").to("cuda")
outputs = model.generate(inputs, max_new_tokens=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))
✨ 预期输出:
"Why did the chicken join the band? Because it had the drumsticks!"
四、深入学习资源
4.1 核心章节推荐
| 主题 | 学习资源 | 难度 |
|---|---|---|
| Token嵌入原理 | Chapter 2 | ⭐⭐☆ |
| Transformer架构 | Chapter 3 | ⭐⭐⭐ |
| 注意力可视化 | images/bonus_attention.png | ⭐☆☆ |
4.2 进阶内容
项目bonus目录提供了前沿主题解析:
五、总结与展望
从文本拆分到注意力计算,大语言模型的每个组件都在解决一个核心问题:如何让计算机真正"理解"人类语言。随着Mamba等新架构的兴起(详见bonus/4_mamba.md),LLM正朝着更快推理、更低资源消耗的方向发展。
关键收获:
- Tokens是连接人类语言与机器向量的桥梁
- 自注意力机制使模型具备上下文理解能力
- 动手实践是掌握LLM原理的最佳途径
🔖 行动建议:立即运行Chapter 1中的Phi-3示例,尝试修改输入文本观察输出变化,这将帮助你直观理解模型行为。
下一篇我们将深入探讨提示工程,学习如何通过巧妙提问让LLM发挥最大潜能。收藏本文,关注项目更新,不错过AI技术前沿解析!
关于本书:本文基于《Hands-On Large Language Models》核心内容编写,完整书籍可通过O'Reilly反馈问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



