LLM 基础概念
人工智能 (AI)
└── 机器学习 (ML)
├── 传统机器学习 (决策树、SVM等)
└── 深度学习 (DL)
└── 神经网络 (NN)
├── 卷积神经网络 (CNN)
└── Transformer
└── 大语言模型 (LLM)
严格来说是基础模型:参数多、训练数据量大
参数量单位
参数量(parameter count)用英文数字缩写表示数量级:
| 缩写 | 英文 | 数值 | 中文 |
|---|---|---|---|
| M | Million | 10⁶ | 百万 |
| B | Billion | 10⁹ | 十亿 |
| T | Trillion | 10¹² | 万亿 |
换算:1 T = 1000 B。例如 GPT-3 为 175 B(约 1750 亿参数),DeepSeek-V3 为 671 B(约 6710 亿参数)。
蒸馏
减少模型参数
量化
降低大模型的参数精度
稠密模型
每次推理时所有参数都被激活使用。参数量越大,计算量和显存占用成比例上涨。
-
例子:GPT-3(175B)、Llama 2(70B)、Llama 3(405B)
稀疏模型
每次推理时只激活一部分参数。"稀疏"其实可指几种不同含义:
| 类型 | 含义 | 代表 |
|---|---|---|
| 激活稀疏 | 每次只激活部分参数 | 混合专家模型(MoE) |
| 权重稀疏 | 很多权重为 0(剪枝得到) | 剪枝后的模型 |
| 稀疏注意力 | 只计算部分位置的注意力 | Longformer、BigBird |
混合专家模型
稀疏模型的一种(激活稀疏)。把网络中的某些层拆成多个"专家"(expert),每次处理一个 token 时由门控网络(router)只挑选少数几个专家计算,其余不参与。因此总参数很大,但每次只激活一小部分。
-
总参数(Total Parameters):模型全部参数加起来
-
激活参数(Active Parameters):单个 token 实际用到的参数
例:DeepSeek-V3 总参数 671B,但激活参数只有约 37B——用接近小模型的推理成本,获得大模型的能力。
注:每个"专家"内部仍是稠密的小网络,所以可理解为"稀疏激活 + 稠密子网络"。
本机部署
-
Ollama
-
LM Studio
-
Cherry Studio
Token与字符
通常在说模型支持10K的上下文,是指模型一次最大可处理10K个token。token和我们平时使用的字词是不同的,一个token可以是一个单词、一个汉字或者一个词组,甚至一个标点符号。
为什么用"子词"切分?
按单词切:英文变体无穷(run / runs / running),词表会爆炸,生词没法处理;按单字符切:序列太长、效率低、单字符语义弱。所以现代模型用子词(subword)切分——把常见片段合并成 token,既控制词表大小,又能拼出新词。
主流切分算法
| 算法 | 原理 | 使用者 |
|---|---|---|
| BPE(字节对编码) | 反复合并"出现频率最高"的相邻字符对 | GPT、DeepSeek、Llama |
| WordPiece | 合并"最能提升模型似然"的对 | BERT |
| Unigram | 先建大候选表,再逐步删掉最没用的 | T5、部分多语言模型 |
| SentencePiece | 工具框架,不依赖空格,对中文/日文友好 | Llama、Mistral |
词表(Vocabulary)是怎么来的?
词表是训练模型之前预先构建的固定"token ↔ ID"对照表(以 BPE 为例):
-
把文本拆成单个字符或字节;
-
反复统计并合并"出现频率最高"的相邻片段,产生新 token;
-
直到词表达到目标大小(比如 10 万个 token)就停止。
最终保存词表 + 合并规则两样东西,供训练和推理统一使用。
遇到词表里没有的词怎么办?
现代模型靠"逐级降级"解决,几乎没有真正的生词问题:
不常见的整词 → 拆成已知子词 → 拆成单字符 → 拆成 UTF-8 字节(绝对兜底)
字节级分词能把任意字符表示出来(任何字符最终都是字节),所以理论上没有无法表示的输入,代价只是拆得越碎、token 越多。
另外,不同的模型采用的分词(Tokenizer)方式不同,token和字符间对应关系也不同:
import transformers chat_tokenizer_dir = "./" tokenizer = transformers.AutoTokenizer.from_pretrained( chat_tokenizer_dir, trust_remote_code=True ) token_ids = tokenizer.encode("大模型是未来的趋势") for tid in token_ids: print(tid, tokenizer.decode([tid]))
也可以在
参考:
上下文
简单来说,上下文指的是提供给模型的信息(以”输入令牌”的形式),模型随后使用这些信息来预测后续信息(以”输出令牌”的形式)
上下文窗口(Context Window)
模型在单次请求里能处理的 token 总数(输入 + 输出),可以理解为"模型一次对话的短期记忆容量"。
-
限制的是"输入 + 输出"的总和,不是单独某一边:输入和输出共享同一个预算;
-
输出通常还有一个更小的独立上限(
max_tokens),防止输出占满窗口; -
所以真正留给输入的空间 ≈ 窗口大小 − 最大输出 token 数。
达到上限、输出还没结束会怎样?
-
撞到最大输出上限 → 模型直接停止生成,回复停在半句话;
-
API 返回
finish_reason = "length"标记,表示"是截断,不是自然说完"; -
结果是不完整的回复(内容不损坏),而不是错误回复;
-
解决办法:调大
max_tokens、缩短输入、或让模型"继续"续写。
训练与推理
训练阶段
原始语料 ↓ ① 分词器(预先建好的词表) token ID 序列 ↓ ② 嵌入层查表:每个 ID → 一个向量 向量序列 ↓ ③ Transformer 层 隐藏状态向量 ↓ ④ 输出投影层 → logits(长度 = 词表大小) 词表里每个 token 的"分数" ↓ ⑤ softmax → 与真实下一个 token 对比 → 算 loss → 反向传播 更新模型参数
推理阶段(用户使用)
用户输入文字 ↓ ① 用同一套分词器 + 词表 → token ID ↓ ② 嵌入层查表 → 向量 ↓ ③ Transformer 层 ↓ ④ 输出投影 → logits(覆盖整个词表) ↓ ⑤ softmax → 每个 token 的概率 ↓ ⑥ 采样/选概率最高的 token → 下一个 token ↓ ⑦ 把 token 接回去,重复 ②~⑥(自回归)
三个关键点
-
词表是预先固定的,不是训练时攒出来的;
-
输入端:文本 → 分词器查表成 ID → 嵌入层查表成向量(不是"匹配词表");
-
输出端:模型产出一个长度 = 词表大小的 logits,softmax 后采样下一个 token("和词表对齐"发生在这里)。
MCP
参考:

浙公网安备 33010602011771号