文章目录
- [一、怎么学习 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 Everyone → Generative AI for Everyone → AI 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 关键步骤解析
- 编码器选择 :不同模型用不同编码器(
cl100k_base/p50k_base/r50k_base),用错会导致计数不准甚至乱码。 - encode 过程:文本 → UTF-8 字节序列 → BPE 与词汇表匹配 → Token ID 列表。
- 数量分析 :13 个字符 = 13 个 token。中文部分
"你好,世界!"占 7 个 token,每个中文字符 ≈ 1 token,标点也算。 - 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 领域余弦相似度是事实标准。"我爱编程"和"我非常热爱写代码"方向接近但长度差很多------余弦只看方向,正好匹配。
六、全文总结
核心知识复盘
- Token:LLM 最小计价/工作单位,BPE 子词切分产物,不是字符也不是单词。
- Tokenization 必要性:神经网络只认数字,文本必须转 ID 再 Embedding 为连续语义向量。
- BPE 算法:从字符开始反复合并高频字节对,兼顾语义完整性和词汇表效率。
- Embedding:完成"离散符号 → 连续语义"的关键一跃,让语义相似度可计算。
- 余弦相似度:衡量语义相似度的标准工具,只看方向不看长度。
数据流全景
"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,搞懂每个细节。