项目模型库:从 BERT 到 TTS 的全家福

一句话理解

所有语言模型 = 权重(学到的知识)+ 分词器(文字↔数字的翻译官)+ 配置(模型参数说明)。缺一不可。


模型库总览

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(理解型)

模型: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(生成型 LLM)

模型: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(多模态 LLM)

模型: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 交替

Ollama GGUF 模型(边缘部署)

模型: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(语音合成)

模型: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/多语言用的):
  直接在原始字节上训练
  特点:不需要预分词,适合无空格语言(中日韩)

BPE 词表里的"乱码":字节级编码

问题:为什么 DeepSeek 词表里看不到中文?

打开 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 字节

中文字符 → 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 要用字节?

字节级 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

相关笔记