一句话理解
所有语言模型 = 权重(学到的知识)+ 分词器(文字↔数字的翻译官)+ 配置(模型参数说明)。缺一不可。
attachments/models/
├── BERT/ ← 理解型(Encoder-only)
│ ├── bert-base-chinese/ ← 原始预训练模型(110M 参数)
│ └── output_onnx/ ← 微调后导出的 ONNX 分类模型
│
├── DeepSeek/ ← 生成型 LLM(Decoder-only)
│ └── DeepSeek-R1-Distill-Qwen-1.5B/ ← 蒸馏版(1.5B 参数)
│
├── Qwen/ ← 多模态 LLM(Decoder-only)
│ ├── Qwen3.5-0.8B/ ← 原始模型(0.8B 参数,支持图文视频)
│ └── Qwen3.5-0.8B-HXXedge-20260907/ ← HXXedge 微调版
│
├── Ollama/ ← GGUF 量化模型(边缘部署)
│ ├── qwen2.5-1.5b-instruct-q4_k_m.gguf
│ └── qwen2.5-3b-instruct-q4_k_m.gguf
│
└── TTS/ ← 语音合成模型
└── moss-tts/
├── MOSS-Audio-Tokenizer-Nano/ ← 音频分词器
└── MOSS-TTS-Nano/ ← 文本→语音生成模型
语言模型 = 权重 + 分词器 + 配置
权重(weights):
模型学到的知识,本质是巨大的数字矩阵
文件名:model.safetensors / pytorch_model.bin / model.onnx
分词器(tokenizer):
把文字转成数字(推理时),把数字还原成文字(生成时)
文件名:tokenizer.json + tokenizer_config.json
配置(config):
描述模型结构(层数、维度、头数等)
文件名:config.json
模型:bert-base-chinese
类型:Encoder-only(只能理解,不能生成)
参数量:110M(1.1 亿)
文件清单:
├── config.json ← 模型配置(12层/768维/12头)
├── model.safetensors ← PyTorch 权重
├── pytorch_model.bin ← PyTorch 权重(旧格式)
├── tf_model.h5 ← TensorFlow 权重
├── flax_model.msgpack ← JAX/Flax 权重
├── tokenizer.json ← 词表 + 分词规则(21,128 词条)
├── tokenizer_config.json ← 分词配置(23 个参数)
└── vocab.txt ← 纯文本词表
分词算法:WordPiece
词表大小:21,128
特点:中文逐字切分,英文子词切分
模型:DeepSeek-R1-Distill-Qwen-1.5B
类型:Decoder-only(生成型,能对话)
参数量:1.5B(15 亿)
文件清单:
├── config.json ← 模型配置(28层/1536维/12头)
├── configuration.json ← HuggingFace Hub 配置
├── generation_config.json ← 生成参数(温度、top_p 等)
├── model.safetensors ← 权重(bfloat16)
├── tokenizer.json ← 词表 + 分词规则(151,936 词条)
└── tokenizer_config.json ← 分词配置
分词算法:BPE(继承自 Qwen)
词表大小:151,936
特殊 token:
<|end▁of▁sentence|> ← 句子结束(ID: 151643)
<|User|> ← 用户标记(ID: 151644)
<|Assistant|> ← 助手标记(ID: 151645)
模型:Qwen3.5-0.8B
类型:多模态(文本 + 图像 + 视频)
参数量:0.8B(8 亿)
文件清单:
├── config.json ← 模型配置(24层/1024维/8头)
├── chat_template.jinja ← 对话模板(Jinja2 格式)
├── model.safetensors-00001-of-00001.safetensors ← 权重
├── model.safetensors.index.json ← 权重索引
├── tokenizer.json ← 词表 + 分词规则(248,320 词条)
├── tokenizer_config.json ← 分词配置
├── merges.txt ← BPE 合并规则
├── vocab.json ← 词表(JSON 版)
├── preprocessor_config.json ← 图像预处理配置
└── video_preprocessor_config.json ← 视频预处理配置
分词算法:BPE
词表大小:248,320
特点:
├── 支持图像 token(image_token_id: 248056)
├── 支持视频 token(video_token_id: 248057)
└── 混合注意力:linear_attention + full_attention 交替
模型:qwen2.5-1.5b-instruct / qwen2.5-3b-instruct
格式:GGUF(llama.cpp 专用格式)
文件清单:
├── qwen2.5-1.5b-instruct-q4_k_m.gguf ← 量化模型(Q4_K_M)
└── qwen2.5-3b-instruct-q4_k_m.gguf ← 量化模型(Q4_K_M)
特点:
├── 分词器内置在 .gguf 文件里(不需要单独文件)
├── 量化到 4-bit(体积缩小 4-6 倍)
└── 专为 CPU/NPU 边缘推理优化
模型:MOSS-TTS-Nano + MOSS-Audio-Tokenizer-Nano
类型:TTS(文本→语音)
文件清单:
MOSS-TTS-Nano/
├── config.json ← 模型配置
├── pytorch_model.bin ← 权重
├── tokenizer.model ← SentencePiece 模型(分词器)
├── tokenizer_config.json ← 分词配置
├── gpt2_decoder.py ← GPT-2 解码器实现
├── modeling_moss_tts_nano.py ← 模型定义
└── prompting.py ← 提示词处理
MOSS-Audio-Tokenizer-Nano/
├── config.json ← 音频分词器配置
├── model-00001-of-00001.safetensors ← 权重
└── modeling_moss_audio_tokenizer.py ← 模型定义
分词算法:SentencePiece
特殊标记:<unk>, <s>, </s>, <pad>
特点:
├── 文本分词器:把文字转成 token
└── 音频分词器:把音频转成 token(语音的"分词器")
模型 分词算法 词表大小 切分方式
─────────────────────────────────────────────────────────
BERT WordPiece 21,128 中文逐字 / 英文子词
DeepSeek-R1 BPE 151,936 子词切分
Qwen3.5 BPE 248,320 子词切分(多模态)
Ollama (GGUF) BPE ~150,000 内置在模型文件中
MOSS-TTS SentencePiece ~32,000 统一分词
三种主流分词算法:
WordPiece(BERT 用的):
合并标准 = PMI(统计关联度最高)
特点:用 ## 标记子词延续
BPE(GPT/Qwen 用的):
合并标准 = 出现频率最高
特点:简单快速,词表通常更大
SentencePiece(TTS/多语言用的):
直接在原始字节上训练
特点:不需要预分词,适合无空格语言(中日韩)
打开 DeepSeek 的 tokenizer.json,看到的是:
"Ġsimple": 4285
"Ġempty": 4287
"ĠCreated": 4290
").Ċ": 4292
没有中文!全是奇怪的符号?
原因:BPE 在"字节"层面工作
中文字符 → UTF-8 字节 → 显示为"乱码"
Ġ = 空格标记(表示"这个词前面有空格")
Ċ = 换行符(\n)
例子:
"Ġsimple" → 实际是 " simple"(前面有空格)
").Ċ" → 实际是 ").\n"(右括号+换行)
"ĠCreated" → 实际是 " Created"(前面有空格)
为什么要区分?
"simple" → 词中间的 simple(如 "mysimple")
"Ġsimple" → 词开头的 simple(如 "a simple")
→ 让模型知道词边界在哪里
中文字符 → UTF-8 编码(3 字节)→ 显示为拉丁字符
例子:
"的" 的 UTF-8 = E7 9A 84
在词表里显示为 "çĽĸ"(每个字节对应一个拉丁字符)
"海" 的 UTF-8 = E6 B5 B7
在词表里可能显示为 "æµ·"
实际在 DeepSeek tokenizer.json 第 100000 行附近:
"çĥŁ": 99752 ← 某个中文字的 UTF-8 字节
"éģ¿": 99753 ← 某个中文字的 UTF-8 字节
"ä»į": 99754 ← 某个中文字的 UTF-8 字节
BERT tokenizer.json(WordPiece,字符级):
"海": 3330 ← 直接存中文字符,直观
"洋": 3982 ← 直接存中文字符,直观
"monitoring": 10258 ← 英文单词
DeepSeek tokenizer.json(BPE,字节级):
"æµ·": 某个ID ← "海"的 UTF-8 字节,看起来像乱码
"æ´ĭ": 某个ID ← "洋"的 UTF-8 字节
"Ġsimple": 4285 ← 英文(Ġ=空格)
字节级 BPE 的优势:
├── 通用性强(任何语言都能处理,不需要特殊处理中文)
├── 没有未登录字符(最差逐字节切分,永远不会 [UNK])
└── 词表设计统一(不需要为每种语言单独设计)
代价:
└── 人类看不懂词表(中文变成"乱码")
但模型不需要"看懂",只需要查表转换数字
用户输入:"海洋"
↓
分词器内部:
"海" → UTF-8 字节 E6 B5 B7 → 查词表 → token IDs
"洋" → UTF-8 字节 E6 B4 8B → 查词表 → token IDs
↓
模型处理:token IDs → 输出
↓
分词器还原:token IDs → UTF-8 字节 → 解码 → "海洋"
整个过程对用户透明,输入中文,输出还是中文
模型是"文盲"——只认识数字,不认识文字
推理流程:
用户输入:"海洋监测"
↓
分词器:文字 → 数字 [3330, 3982, 2990, 1762]
↓
模型:数字 → 处理 → 输出数字
↓
分词器:数字 → 文字(如果是生成模型)
没有分词器 → 模型无法处理任何文字输入
权重文件:
model.safetensors ← 最常用(HuggingFace 推荐格式)
pytorch_model.bin ← PyTorch 旧格式
model.onnx ← ONNX 格式(跨平台推理)
*.gguf ← llama.cpp 量化格式
分词器文件:
tokenizer.json ← 完整词表 + 分词规则(必须有)
tokenizer_config.json ← 分词器配置参数(必须有)
tokenizer.model ← SentencePiece 专用
vocab.json / vocab.txt ← 纯词表(部分模型有)
merges.txt ← BPE 合并规则(部分模型有)
配置文件:
config.json ← 模型结构配置(必须有)
generation_config.json ← 生成参数(LLM 特有)
configuration.json ← HuggingFace Hub 配置
所有语言模型 = 权重 + 分词器 + 配置
权重 = 模型学到的知识(数字矩阵)
分词器 = 文字↔数字的翻译官
配置 = 模型结构的说明书
没有分词器,模型就是"文盲"
看得见数字,看不懂文字
不同模型用不同分词算法:
BERT → WordPiece(21K 词条)
DeepSeek/Qwen → BPE(150K-250K 词条)
TTS → SentencePiece(音频+文本双分词)
📝 创建:2026-09-11
🔄 标签:模型库、Tokenizer、分词器、词表、BERT、DeepSeek、Qwen、TTS