从"你好"到矩阵:LLM如何把人类语言,变成机器能算的数字?
你有没有想过——
当你说"今天天气真好",
AI 读到的,不是"天""气""真""好"这四个字,
而是一串数字:
[1243, 892, 501, 733]
它看不见文字,听不到声音,
它只认识数字。
那问题来了:
人类的语言,是怎么变成这些数字的?
这不是魔法,也不是玄学。
这是大语言模型(LLM)最基础、也最精妙的第一步:
文本编码(Tokenization)。
今天,我们就来彻底拆解:
LLM 是如何把"文字",变成"数字",
并让它们在神经网络里"跑起来"的。
🌟 第一步:文字 ≠ 数字,但机器只认数字
计算机的底层,只有0和1。
哪怕你发一条微信、写一篇论文,
最终都会被转成二进制——
但LLM的输入,不是"二进制",而是整数序列。
为什么?
因为直接把"天""气"映射成数字(比如"天"=1,"气"=2)
会带来灾难性问题:
| 文字 | 数字 | 问题 |
|---|---|---|
| 天 | 1 | 与"地"=2,但"天地"≠"天"+"地" |
| 地 | 2 | "天气"=1+2=3,但"三"=3 → 语义错乱 |
| 三 | 3 | 模型会误以为"天气"="三" |
所以,LLM不能用"字典映射"。
它需要一种既能保留语义,又能处理无限词汇的编码方式。
这就是——分词(Tokenization)。
🧩 第二步:分词的智慧 —— BPE:把词"切碎"再重组
LLM 用的不是"一个字一个编号",也不是"一个词一个编号",
而是Byte-Pair Encoding(BPE)——一种"聪明的切碎术"。
✅ 举个例子:
假设我们有以下语料:
"low"
"lowest"
"newer"
"wider"
"wide"
BPE 的工作流程:
- 初始化:把每个词拆成字符,统计字符对频次
- "low" → l, o, w, </w>
- "lowest" → l, o, w, e, s, t, </w>
- (</w> 表示词尾)
-
找最常出现的字符对 → "o" + "w" 出现2次
→ 合并成新符号:ow - 更新词表:
- "low" → l, ow, </w>
- "lowest" → l, ow, e, s, t, </w>
-
继续找:下一轮,"e" + "s" 出现1次,合并为
es
→ "lowest" → l, ow, es, t, </w> - 重复直到达到目标词表大小(比如50,000个Token)
最终,你的词表可能长这样:
| Token | 含义 |
|---|---|
| l | 字母 l |
| ow | 字母组合 "ow" |
| es | 字母组合 "es" |
| t | 字母 t |
| </w> | 词尾 |
| new | 新词 |
| er | 后缀 "er" |
| wide | 完整词 |
| wider | 完整词 |
✅ 你会发现:
"wider" = "wide" + "er"
"lowest" = "low" + "est" = "ow" + "es" + "t"
语义单元被拆解、复用,效率极高!
🔢 第三步:把句子变成数字序列 —— Tokenizer 的魔法
现在,我们输入一句话:
"The capital of France is Paris."
Tokenizer 会这样处理:
- 分词(Tokenize):
- "The" →
[452] - " capital" →
[123](注意空格是token的一部分) - " of" →
[78] - " France" →
[912] - " is" →
[201] - " Paris." →
[678]("." 与 "Paris" 合并)
- "The" →
- 最终输出:
[452, 123, 78, 912, 201, 678]
这就是LLM真正"看到"的输入——
一串整数,没有字母,没有标点,只有编号。
💡 你可以把Tokenizer想象成一个"翻译官":
把中文/英文 → 翻译成"AI语言"
而AI语言,就是这50,000个Token组成的"词典"。
🧠 第四步:数字如何"变成语义"?—— Embedding层登场
数字本身没有意义。
但LLM有一个神奇的层,叫 Embedding Layer(词嵌入层)。
它的作用是:
给每一个Token,分配一个高维向量(比如4096维),
这个向量,编码了这个词的语义、语法、上下文关系。
假设:
- Token
[452]= "The" → 嵌入向量E[452] = [0.23, -1.12, 0.87, ..., 0.51](共4096个数) - Token
[123]= "capital" →E[123] = [0.41, 0.98, -0.33, ..., 0.19]
那么,输入序列 [452, 123, 78, 912, 201, 678]
就变成了一个6×4096的矩阵:
[
[0.23, -1.12, 0.87, ...], ← "The"
[0.41, 0.98, -0.33, ...], ← "capital"
[0.11, 0.05, 1.22, ...], ← "of"
[0.67, -0.45, 0.77, ...], ← "France"
[0.33, 0.21, -0.91, ...], ← "is"
[0.89, 0.14, 0.55, ...] ← "Paris."
]
这个矩阵,就是LLM的"输入世界"。
✅ 这个向量不是随便给的,而是通过训练学出来的。
"capital"和"city"的向量会很接近,
"France"和"Germany"会靠近欧洲区域,
"is"和"was"会靠近动词区域。
语义,藏在向量的几何空间里。
这就是为什么:
"king - man + woman ≈ queen"
不是巧合,而是向量空间的线性关系。
⚙️ 第五步:数字开始"运算"——从Embedding到Transformer
现在,LLM拿到了一个6×4096的数字矩阵。
接下来,它做的,就是用数学运算,不断重构这些数字。
每一层Transformer,都会做:
- 矩阵乘法:
Q = X @ Wq(计算查询向量) - 点积相似度:
scores = Q @ K.T(哪个词和当前词最相关?) - Softmax:把分数变成概率(注意力权重)
- 加权求和:
output = attention_weights @ V(融合上下文) - 残差连接 + 归一化:让信号稳定传递
- 前馈网络:
x → W1 → GELU → W2(非线性变换)
每一步,都是纯数学运算:
- 矩阵乘法
- 指数函数
- 加法、除法、激活函数
没有"理解",没有"意识",
只有数字在高维空间里跳舞。
但奇妙的是——
当这些数字被反复变换、叠加、融合后,
输出的最后一个向量,
恰好能预测下一个最可能的Token:
输入:"The capital of France is" →
输出:[0.01, 0.02, ..., 0.85, ..., 0.001]
最大值在Token[678]= "Paris."
→ 所以AI说:"Paris."
🧪 真实演示:用Python模拟一次Tokenization + Embedding
# 伪代码:模拟LLM的前两步
tokenizer = {
"The": 452,
" capital": 123,
" of": 78,
" France": 912,
" is": 201,
" Paris.": 678
}
# 输入文本
text = "The capital of France is Paris."
# Step 1: Tokenize
tokens = [452, 123, 78, 912, 201, 678]
# Step 2: Embedding (简化版)
embedding_dim = 4
embedding_table = {
452: [0.23, -1.12, 0.87, 0.51],
123: [0.41, 0.98, -0.33, 0.19],
78: [0.11, 0.05, 1.22, 0.44],
912: [0.67, -0.45, 0.77, -0.21],
201: [0.33, 0.21, -0.91, 0.66],
678: [0.89, 0.14, 0.55, 0.88]
}
# 转换成矩阵
x = [embedding_table[t] for t in tokens]
print("输入序列的嵌入向量(6×4):")
for row in x:
print(row)
# 输出:
# [0.23, -1.12, 0.87, 0.51]
# [0.41, 0.98, -0.33, 0.19]
# [0.11, 0.05, 1.22, 0.44]
# [0.67, -0.45, 0.77, -0.21]
# [0.33, 0.21, -0.91, 0.66]
# [0.89, 0.14, 0.55, 0.88]
🌟 你看到的,不是文字,
而是6个4维的数字向量,
它们承载了"首都""国家""系动词"等语义关系。
AI,就是靠这些数字,推理世界的。
🧭 为什么这如此重要?
很多人以为LLM"懂语言",
其实它只是:
- 把文字 → 切成Token(分词)
- 把Token → 映射成向量(Embedding)
- 把向量 → 用数学变换不断融合(Transformer)
- 把最终向量 → 映射回Token(输出层)
- 选概率最高的 → 输出文字
它没有"理解""意思""意图",
但它完美模拟了语言的统计规律。
就像一个精通围棋的AI,
它不理解"胜负""艺术",
但它知道:哪一步赢的概率最高。
✅ 总结:LLM的"语言翻译器"三步曲
| 步骤 | 输入 | 输出 | 关键技术 |
|---|---|---|---|
| 1. 分词 | "The capital of France is Paris." | [452, 123, 78, 912, 201, 678] | BPE(Byte-Pair Encoding) |
| 2. 嵌入 | Token序列 | 6×4096 的数字矩阵 | 学习型词嵌入(Learned Embedding) |
| 3. 运算 | 数字矩阵 | 更高阶的数字矩阵 | Transformer(Attention + FFN) |
🚫 LLM 不认识"字"
✅ LLM 只认识"编号"
💡 它的"语言",是数学的语言
🌌 最后一句:AI的"语言",是你看不见的宇宙
你看到的"对话",是AI输出的文字。
你没看到的,是数万维空间里,数十亿个数字的精密舞蹈。
每一个字的背后,
是成千上万次矩阵乘法,
是数万亿参数的协同演化,
是人类用数学,为语言建模的壮举。
下一次,当你对AI说"帮我写一首诗",
请记住:
它听到的,不是诗意,
是一串编号,
和一串在高维空间里,
悄悄旋转的向量。
📌 动手实验建议:
用 Hugging Face 的 transformers 试试:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-chat-hf")
print(tokenizer.encode("Hello, world!"))
# 输出:[1, 15043, 11, 13]
你看到的,就是LLM眼中的"世界"。
#LLM #AI原理 #Tokenization #词嵌入 #Transformer #人工智能 #深度学习 #AI科普 #从文字到数字