深入理解大语言模型(LLM)的底层基石 ------ 分词(Tokenization)与向量嵌入(Embedding),从原理到实战,构建完整的知识体系。
📑 目录
- 一、学习路线图
- [1.1 理论基础 ------ 先搞懂 AI 是什么](#1.1 理论基础 —— 先搞懂 AI 是什么 "#11-%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80--%E5%85%88%E6%90%9E%E6%87%82-ai-%E6%98%AF%E4%BB%80%E4%B9%88")
- [1.2 动手用起来 ------ 把日常重复性工作交给 AI](#1.2 动手用起来 —— 把日常重复性工作交给 AI "#12-%E5%8A%A8%E6%89%8B%E7%94%A8%E8%B5%B7%E6%9D%A5--%E6%8A%8A%E6%97%A5%E5%B8%B8%E9%87%8D%E5%A4%8D%E6%80%A7%E5%B7%A5%E4%BD%9C%E4%BA%A4%E7%BB%99-ai")
- [1.3 做个人作品](#1.3 做个人作品 "#13-%E5%81%9A%E4%B8%AA%E4%BA%BA%E4%BD%9C%E5%93%81")
- [1.4 值得关注](#1.4 值得关注 "#14-%E5%80%BC%E5%BE%97%E5%85%B3%E6%B3%A8")
- [二、Token 分词(Tokenization)](#二、Token 分词(Tokenization) "#%E4%BA%8Ctoken-%E5%88%86%E8%AF%8Dtokenization")
- [2.1 什么是 Token?](#2.1 什么是 Token? "#21-%E4%BB%80%E4%B9%88%E6%98%AF-token")
- [2.2 为什么必须分词?](#2.2 为什么必须分词? "#22-%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BF%85%E9%A1%BB%E5%88%86%E8%AF%8D")
- [2.3 Token 切分原则](#2.3 Token 切分原则 "#23-token-%E5%88%87%E5%88%86%E5%8E%9F%E5%88%99")
- [三、Embedding 向量嵌入](#三、Embedding 向量嵌入 "#%E4%B8%89embedding-%E5%90%91%E9%87%8F%E5%B5%8C%E5%85%A5")
- [3.1 处理流程](#3.1 处理流程 "#31-%E5%A4%84%E7%90%86%E6%B5%81%E7%A8%8B")
- [3.2 Embedding 原理](#3.2 Embedding 原理 "#32-embedding-%E5%8E%9F%E7%90%86")
- [3.3 语义相似度 ------ 余弦相似度](#3.3 语义相似度 —— 余弦相似度 "#33-%E8%AF%AD%E4%B9%89%E7%9B%B8%E4%BC%BC%E5%BA%A6--%E4%BD%99%E5%BC%A6%E7%9B%B8%E4%BC%BC%E5%BA%A6")
- [四、动手实战 Demo](#四、动手实战 Demo "#%E5%9B%9B%E5%8A%A8%E6%89%8B%E5%AE%9E%E6%88%98-demo")
- [4.1 Demo 1:Token 编码与解码](#4.1 Demo 1:Token 编码与解码 "#41-demo-1token-%E7%BC%96%E7%A0%81%E4%B8%8E%E8%A7%A3%E7%A0%81")
- [4.2 Demo 2:Embedding 与语义相似度](#4.2 Demo 2:Embedding 与语义相似度 "#42-demo-2embedding-%E4%B8%8E%E8%AF%AD%E4%B9%89%E7%9B%B8%E4%BC%BC%E5%BA%A6")
- 五、核心概念关系总图
- 六、关键要点总结
一、学习路线图
1.1 理论基础 ------ 先搞懂 AI 是什么
| 讲师 | 课程/内容 | 说明 |
|---|---|---|
| 吴恩达 (Andrew Ng) | AI for Everyone | 面向所有人的 AI 通识课 |
| Generative AI for Everyone | 生成式 AI 入门 | |
| Prompt Engineering for Everyone | 提示工程入门 | |
| Andrej Karpathy | 3 小时大模型入门 | 前 Tesla AI 总监、OpenAI GPT-3 作者,讲透大模型原理 |
📺 推荐视频:深入 ChatGPT 这样的模型
核心理论概念:
- Transformer 架构(Google 提出)------ 现代大模型的基石
- Attention 注意力机制 ------ "Attention is All You Need"
- 微调(Fine-tuning) ------ 让大模型适配特定任务
1.2 动手用起来 ------ 把日常重复性工作交给 AI
- Claude Code / Codex:AI 编程助手,将自然语言转化为代码
- NotebookLM(Google 出品):基于 RAG 的个人知识助手
- Obsidian:打造"第二大脑",知识管理利器
1.3 做个人作品
- Vibe Coding:用自然语言描述需求,AI 生成完整项目
- 实践方向:网站、小程序、客户管理工具
- Agent 开发:构建自主智能体
1.4 值得关注
- 晓辉博士 ------ 专业深度
- 42章经 ------ 行业洞察
- 宝玉 ------ AI Prompt Engineering
- 归藏 ------ AI 产品
二、Token 分词(Tokenization)
2.1 什么是 Token?
Token 是 LLM 计价和工作的最小单位。
| 语言 | Token 换算 | 示例 |
|---|---|---|
| 英文 | 1 个字符 ≈ 0.3 token | "hello" ≈ 1.5 tokens |
| 中文 | 1 个字符 ≈ 0.6 token | "你好" ≈ 1.2 tokens |
| 价格 | 百万 token 约几元人民币 | --- |
文本输入 → Tokenizer(编码) → Token IDs → LLM 处理 → Token IDs → Detokenizer(解码) → 文本输出
2.2 为什么必须分词?
LLM 的核心工作原理是:根据上文,预测下一个词。
但神经网络只能处理数字(向量、矩阵),看不懂中文、英文等字符。这是由计算机底层运行机制和模型训练效率共同决定的。
因此,必须把文字转换成离散的数字符号 ID ------ 这就是 Token。
arduino
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 文本输入 │ ───▶ │ Tokenizer │ ───▶ │ Token │ ───▶ │ LLM │
│ "你好世界" │ │ 编码器 │ │ IDs 数组 │ │ 神经网络 │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
2.3 Token 切分原则
- 不能随意切割字符(没有意义)
- Token 可以理解为一个"单词",但不完全是单词
- 由 cl100k_base 编码表提供映射规则
- Token 数量级:约 100K 个不同的 Token ID
yaml
文本 "Hello World"
│
▼
cl100k_base 映射规则
│
▼
Token IDs: [9906, 4435] ← 两个 Token
三、Embedding 向量嵌入
3.1 处理流程
文本 → Tokenizer(分词) → Token IDs → Embedding(向量化) → 神经网络计算
大模型不能直接处理文本,必须先 Tokenizer,再 Embedding。
3.2 Embedding 原理
Embedding 将 Token 映射到高维向量空间,用数字表达语义:
| 属性 | 说明 |
|---|---|
| 维度 | 常见 1024 维 |
| 数值范围 | -1 到 1 之间的浮点数 |
| 核心意义 | 将语义相似度转化为向量空间中的距离 |
ini
Token ID: 215
│
▼ Embedding 映射
[-0.023, 0.451, -0.789, ..., 0.312] ← 1024 维向量
◀─────────────────────────────────▶
每个值在 [-1, 1] 之间
3.3 语义相似度 ------ 余弦相似度
语义相近的文本,其 Embedding 向量在空间中的方向也相近。通过**余弦相似度(Cosine Similarity)**来衡量:
CosineSimilarity(A,B)=∣∣A∣∣×∣∣B∣∣A⋅B=∑Ai2 ×∑Bi2 ∑AiBi
- 值域:-1, 1
- 越接近 1 → 语义越相似
- 越接近 -1 → 语义越相反
- 接近 0 → 语义无关
css
语义空间示意(简化为 2D)
▲ 向量 B(相似语义)
/
/ 小夹角 ≈ 高相似度
/
●──────▶ 向量 A
\
\
▼ 向量 C(无关语义)
大夹角 ≈ 低相似度
四、动手实战 Demo
项目位于 demo/ 目录,包含两个核心示例:
4.1 Demo 1:Token 编码与解码
📄 文件: index.mjs
javascript
import { getEncoding } from 'js-tiktoken';
const enc = getEncoding('cl100k_base'); // GPT 官方编码器
const text = 'Hello, tiktoken! 你好,世界!';
// 编码:文本 → Token IDs
const tokens = enc.encode(text);
console.log('Token IDs:', tokens, tokens.length);
// 解码:Token IDs → 文本
const decodedText = enc.decode(tokens);
console.log('Decoded Text:', decodedText);
核心要点:
- 使用
js-tiktoken库,调用 GPT 官方的cl100k_base编码器 encode():文本 → Token ID 数组decode():Token ID 数组 → 文本- 输入 tokens + 输出 tokens = 总 token 数(计费依据)
4.2 Demo 2:Embedding 与语义相似度
📄 文件: main.mjs
完整数据流:
scss
Text → Tokens → Embedding API → 1024维向量 → 余弦相似度计算 → 相似度得分
javascript
// 1. 获取 Embedding(调用 LLM 向量化接口)
async function getEmbedding(text) {
const res = await client.embeddings.create({
model: 'text-embedding-v4',
input: text,
dimensions: 1024
});
return res.data[0].embedding;
}
// 2. 计算余弦相似度
function cosineSimilarity(vecA, vecB) {
let dot = 0, magA = 0, magB = 0;
for (let i = 0; i < vecA.length; i++) {
dot += vecA[i] * vecB[i];
magA += vecA[i] ** 2;
magB += vecB[i] ** 2;
}
return dot / (Math.sqrt(magA) * Math.sqrt(magB));
}
// 3. 对比不同文本的语义相似度
const text1 = "Andrej Karpathy LLM Tokenization 分词原理";
const text2 = "卡帕西讲解大模型BEP 分词原理";
const text3 = "今天天气晴朗,适合出门散步";
// 结果预期:
// sim(text1, text2) → 高(都是讲分词原理)
// sim(text1, text3) → 低(语义不相关)
// sim(text2, text3) → 低
环境配置(.env):
ini
DASHSCOPE_API_KEY=your_api_key
DASHSCOPE_BASE_URL='https://dashscope.aliyuncs.com/compatible-mode/v1'
依赖包(package.json):
| 包名 | 用途 |
|---|---|
js-tiktoken |
Token 编码/解码 |
openai |
调用 Embedding API |
dotenv |
加载环境变量 |
五、核心概念关系总图
yaml
┌─────────────────────────────────────────────────────────────────────┐
│ LLM 处理全流程 │
│ │
│ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 原始文本 │───▶│ Tokenization │───▶│ Embedding│───▶│ LLM │ │
│ │ "你好世界" │ │ 分词编码 │ │ 向量嵌入 │ │ Transformer│ │
│ └──────────┘ └──────────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │
│ │ cl100k_base │ │ 1024 维向量 │ │ 下一个词 │ │
│ │ ~100K Token │ │ 值域 [-1,1] │ │ 概率分布 │ │
│ └──────────────┘ └──────────────┘ └──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────┐ │
│ │ Token IDs: │ │ 余弦相似度 │ │ 输出Token │ │
│ │ [9906, 4435] │ │ 语义匹配判断 │ │ → 解码输出 │ │
│ └──────────────┘ └──────────────┘ └──────────┘ │
└─────────────────────────────────────────────────────────────────────┘
层次关系图
css
Token 与 Embedding 知识体系
│
├── 1. 学习路线
│ ├── 理论学习(吴恩达、Karpathy)
│ ├── 动手实践(Claude Code、NotebookLM)
│ └── 项目构建(Vibe Coding、Agent 开发)
│
├── 2. Tokenization(分词)
│ ├── 定义:LLM 的最小工作单位
│ ├── 原理:文字 → 离散数字 ID
│ ├── 编码表:cl100k_base(~100K 词表)
│ ├── 计价:按 Token 数量计费
│ └── Demo:js-tiktoken 编解码
│
├── 3. Embedding(向量嵌入)
│ ├── 定义:Token → 高维语义向量
│ ├── 维度:1024 维
│ ├── 语义相似度:余弦相似度
│ └── Demo:OpenAI Embedding API + 相似度计算
│
└── 4. 知识串联
├── 文本 → Token → Embedding → LLM → 输出
└── 语义匹配、RAG、搜索等上层应用
六、关键要点总结
| 序号 | 要点 | 一句话 |
|---|---|---|
| ① | Token 是桥梁 | 将人类语言转化为机器能理解的数字 |
| ② | Embedding 是灵魂 | 将 Token 赋予语义,在向量空间中建立关系 |
| ③ | 余弦相似度是尺子 | 衡量语义距离的核心工具 |
| ④ | 1024 维是窗口 | 每个维度捕捉语义的一个侧面 |
| ⑤ | 实践是捷径 | 三个 Demo 跑一遍,胜过读十篇文章 |