从"你好"到矩阵: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 的工作流程:

  1. 初始化:把每个词拆成字符,统计字符对频次
    • "low" → l, o, w, </w>
    • "lowest" → l, o, w, e, s, t, </w>
    • (</w> 表示词尾)
  2. 找最常出现的字符对 → "o" + "w" 出现2次
    → 合并成新符号:ow

  3. 更新词表
    • "low" → l, ow, </w>
    • "lowest" → l, ow, e, s, t, </w>
  4. 继续找:下一轮,"e" + "s" 出现1次,合并为 es
    → "lowest" → l, ow, es, t, </w>

  5. 重复直到达到目标词表大小(比如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 会这样处理:

  1. 分词(Tokenize):
    • "The" → [452]
    • " capital" → [123] (注意空格是token的一部分)
    • " of" → [78]
    • " France" → [912]
    • " is" → [201]
    • " Paris." → [678] ("." 与 "Paris" 合并)
  2. 最终输出:
    [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,都会做:

  1. 矩阵乘法Q = X @ Wq (计算查询向量)
  2. 点积相似度scores = Q @ K.T (哪个词和当前词最相关?)
  3. Softmax:把分数变成概率(注意力权重)
  4. 加权求和output = attention_weights @ V (融合上下文)
  5. 残差连接 + 归一化:让信号稳定传递
  6. 前馈网络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"懂语言",
其实它只是:

  1. 把文字 → 切成Token(分词)
  2. 把Token → 映射成向量(Embedding)
  3. 把向量 → 用数学变换不断融合(Transformer)
  4. 把最终向量 → 映射回Token(输出层)
  5. 选概率最高的 → 输出文字

它没有"理解""意思""意图"
但它完美模拟了语言的统计规律

就像一个精通围棋的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科普 #从文字到数字