大模型分词(Tokenization)与嵌入(Embedding)完全解析

文章目录

  • [一、怎么学习 LLM?](#一、怎么学习 LLM?)
    • [1.1 先搞懂 AI 是什么](#1.1 先搞懂 AI 是什么)
    • [1.2 理论进阶------三大核心概念](#1.2 理论进阶——三大核心概念)
  • 二、动手用起来
  • [三、分词 Tokenization------LLM 的"最小工作单位"](#三、分词 Tokenization——LLM 的"最小工作单位")
    • [3.1 Token 是什么?](#3.1 Token 是什么?)
    • [3.2 为什么必须分词?](#3.2 为什么必须分词?)
  • [四、Token 编解码实战------js-tiktoken](#四、Token 编解码实战——js-tiktoken)
    • [4.1 安装](#4.1 安装)
    • [4.2 编码与解码](#4.2 编码与解码)
    • [4.3 关键步骤解析](#4.3 关键步骤解析)
    • [4.4 Token 计费实战](#4.4 Token 计费实战)
  • [五、Embedding------把 Token 变成"数学语义"](#五、Embedding——把 Token 变成"数学语义")
    • [5.1 完整数据流](#5.1 完整数据流)
    • [5.2 为什么必须先 Tokenize 再 Embedding?](#5.2 为什么必须先 Tokenize 再 Embedding?)
    • [5.3 余弦相似度 vs 欧氏距离](#5.3 余弦相似度 vs 欧氏距离)
  • 六、全文总结

从零理解 LLM 如何"读懂"人类语言,含完整代码实战与避坑指南。


一、怎么学习 LLM?

1.1 先搞懂 AI 是什么

入门推荐两套免费资源:

  • 吴恩达系列AI For EveryoneGenerative AI for EveryoneAI Prompt For Everyone,从零建立 AI 全局认知,搞懂生成式 AI 原理和 Prompt 方法论。
  • Andrej Karpathy 的 深入 ChatGPT 这样的模型:Tesla 前 AI 总监、GPT-3 核心作者,3 小时讲透大模型底层原理,建议反复看。

先建立"AI 能做什么、不能做什么"的整体认知,再去深入技术细节,效率高十倍。

1.2 理论进阶------三大核心概念

  • Transformer 架构(Google 2017):现代大模型的"骨架",GPT/Claude/文心一言全部基于它。核心是用自注意力机制替代循环神经网络,实现并行训练。
  • Attention 注意力机制:Transformer 的灵魂。让模型处理每个词时能看到全文,自动判断哪些词相关------这是 LLM 理解上下文的数学基础。
  • Fine-tuning(微调):让预训练大模型适配特定任务,相当于"全科医生"进修成"专科医生"。

二、动手用起来

  • Cursor / Claude Code / Codex:不是代码补全,是能理解项目上下文、帮你重构和修 bug 的 AI Agent。
  • NotebookLM(Google RAG 工具):上传文档即可基于私有知识库问答------LLM + 你的数据的完美示范。
  • Obsidian + AI 插件:第二大脑,Markdown 笔记 + AI 自动总结、关联。

不要"学完再用",即学即用,把所有重复性工作都丢给 AI。


三、分词 Tokenization------LLM 的"最小工作单位"

3.1 Token 是什么?

Token 是 LLM 计价和工作的最小单位。 API 费用按 token 计,不是按字数或请求次数。

文本类型 换算比例 说明
1 个英文字符 ≈ 0.3 token 英文单词被拆为子词
1 个中文字符 ≈ 0.6 token 中文单字通常是独立 token
100 万 token ≈ 几元人民币 国产模型价格持续走低

面试重点:同样意思,英文 token 消耗比中文少。英文有天然空格分词边界,高频词编码更短;中文每个字是独立语义单元,BPE 后 token 数通常是英文的 1.5~2 倍。

3.2 为什么必须分词?

神经网络底层只能处理数字(向量、矩阵),不认识文字。必须把文本转为数字 ID,模型才能计算。

复制代码
人类文字 → Token ID → Embedding 向量 → 神经网络计算 → 新 Token ID → 解码回文字

如果按字符 切分,序列长度翻倍,且单个字符无意义('e' 在 "hello" 和 "eat" 里含义完全不同)。按切分,变形词("running"/"unbelievable")各占独立 token,词汇表膨胀到百万级。

折中方案------子词分词(BPE) :高频词完整保留,低频词拆成有意义的子词。如 "unbelievable"["un", "believe", "able"]

核心原理 :BPE(Byte Pair Encoding)从字符级开始,反复合并出现频率最高的字节对,直到词汇表达预设大小(cl100k_base 约 100k)。高频词完整保留,低频词用子词拼接,永不出现"未知词"。


四、Token 编解码实战------js-tiktoken

4.1 安装

bash 复制代码
npm install js-tiktoken

4.2 编码与解码

js 复制代码
import { getEncoding } from "js-tiktoken";

// cl100k_base:GPT-4 / GPT-3.5-turbo 使用的编码器,词汇表约 100k
const enc = getEncoding("cl100k_base");

const text = "Hello,tiktoken! 你好,世界!";

// 编码:文本 → Token IDs
const tokens = enc.encode(text);
console.log("Token IDs:", tokens);
// [9906, 14287, 1609, 5963, 0, 220, 57668, 53901, 3922, 3574, 244, 98220, 6447]
console.log("Token 数量:", tokens.length); // 13

// 解码:Token IDs → 文本
const decodeText = enc.decode(tokens);
console.log("解码文本:", decodeText); // Hello,tiktoken! 你好,世界!

4.3 关键步骤解析

  1. 编码器选择 :不同模型用不同编码器(cl100k_base / p50k_base / r50k_base),用错会导致计数不准甚至乱码
  2. encode 过程:文本 → UTF-8 字节序列 → BPE 与词汇表匹配 → Token ID 列表。
  3. 数量分析 :13 个字符 = 13 个 token。中文部分 "你好,世界!" 占 7 个 token,每个中文字符 ≈ 1 token,标点也算。
  4. decode:确定性逆向映射,每个 token ID 唯一对应一段文本。

易错点token 数 ≠ 字符数。GPT-4 的 128K 上下文指 128K token,换算中文约 20 万字。

4.4 Token 计费实战

js 复制代码
import { getEncoding } from "js-tiktoken";
const enc = getEncoding("cl100k_base");

const systemPrompt = "你是一个有帮助的助手。";
const userMessage = "请帮我解释什么是 Tokenization。";

// 输入 token + 预估输出 token = 总费用
const inputTokens = enc.encode(systemPrompt + userMessage).length;
const outputTokens = 150; // 预估
const totalTokens = inputTokens + outputTokens;

console.log(`预估费用: ¥${(totalTokens / 1000000 * 2).toFixed(6)}`);
// input_tokens + output_tokens = 你的账单

五、Embedding------把 Token 变成"数学语义"

Tokenization 只是把文本变成 ID,但 ID 之间没有"相似度"可言。Embedding 的作用,就是给每个 token 赋予数学化的语义表达。

5.1 完整数据流

复制代码
Prompt(文本)→ Tokenizer(编码)→ Embedding(向量化)
→ Transformer(推理)→ Detokenizer(解码)→ 输出文本
阶段 输入 输出 作用
Tokenizer 自然语言文本 Token ID 序列 文本离散化为可计算符号
Embedding Token ID 序列 浮点数向量矩阵 离散符号 → 连续语义坐标
Transformer 向量矩阵 新向量矩阵 注意力机制语义推理
Detokenizer Token ID 序列 自然语言文本 还原人类可读文字

5.2 为什么必须先 Tokenize 再 Embedding?

工程效率:不拆 token 直接 Embedding 整篇文章,需要能编码一切文本的向量维度------数学上和工程上都不可行。

语义粒度:字符太细(无意义)、整词太粗("run" 和 "running" 视为无关)。BPE 子词在二者间取最优平衡。

面试重点 :「Token 可理解为单词但不完全是」。"Hello" 是 1 个 token,"unbelievable" 可能拆成 3 个。Token 本质是 BPE 在训练数据上统计出的最优子词切分单元

关键 :Embedding 捕捉的是语义,不是字面匹配。中英文描述同一件事,向量方向接近(余弦 → 1);不同话题则方向正交(余弦 → 0)。

面试重点 :Embedding 的核心能力------将语义相似性数学化为向量空间中的距离

5.3 余弦相似度 vs 欧氏距离

度量方式 思路 适用 局限
余弦相似度 只看方向不看长度 文本语义(主流) 极长极短文本可能误判
欧氏距离 看绝对距离 图像/坐标等几何数据 受向量长度影响大

NLP 领域余弦相似度是事实标准。"我爱编程"和"我非常热爱写代码"方向接近但长度差很多------余弦只看方向,正好匹配。


六、全文总结

核心知识复盘

  1. Token:LLM 最小计价/工作单位,BPE 子词切分产物,不是字符也不是单词。
  2. Tokenization 必要性:神经网络只认数字,文本必须转 ID 再 Embedding 为连续语义向量。
  3. BPE 算法:从字符开始反复合并高频字节对,兼顾语义完整性和词汇表效率。
  4. Embedding:完成"离散符号 → 连续语义"的关键一跃,让语义相似度可计算。
  5. 余弦相似度:衡量语义相似度的标准工具,只看方向不看长度。

数据流全景

复制代码
"Hello, 你好"                     ← 人类自然语言
    ↓ Tokenization (cl100k_base)
[9906, 14287, 1609, ...]          ← 离散 Token ID
    ↓ Embedding (text-embedding-v4)
[[0.023, -0.451, ...], ...]       ← 1024 维语义向量
    ↓ Transformer (LLM 推理)
[[0.112, 0.783, ...], ...]        ← 推理后新向量
    ↓ Detokenization
"你好!很高兴见到你"               ← 模型生成文本

常见问题与避坑

Q1:不同模型能共用 tokenizer 吗? 不能。GPT-4 用 cl100k_base,LLaMA 用 sentencepiece用错会导致计数错误甚至乱码

Q2:中文为什么比英文"费" token? 英文有空格分词边界 + 训练数据量大,中文需从字符级合并且语料占比小。同义内容中文 token 数约为英文 1.5~2 倍。

Q3:Embedding 维度越大越好? 不一定。维度假高 → 计算成本增加但收益递减。1024 维性价比较高,text-embedding-3-large 支持到 3072 维,按场景选。

Q4:余弦相似度多少算"相似"? 无绝对阈值,参考经验:> 0.8 高度相关,0.5~0.8 中度相关,< 0.3 基本无关。

Q5:能直接用 Embedding 生成文本吗? 不能。Embedding 负责"理解"(文本→向量),生成靠 Transformer"推理"。Embedding 模型不具备生成能力。

Q6:怎么算费用? input_tokens + output_tokens = 账单。output 通常比 input 贵(GPT-4 约 2 倍),每次调用前用 tiktoken 预估,控制成本。


代码基于 js-tiktoken 。Embedding 使用阿里百炼 text-embedding-v4,可替换任何兼容接口。

推荐阅读:Karpathy 的 Let's build GPT: from scratch, in code ------ 从零写 GPT,搞懂每个细节。