模型背后:词元与嵌入
一、词元(Token)与分词器(Tokenizer)
1. 为什么需要分词
神经网络只能处理数字,不能直接处理文字。因此需要把文本切成一个个小单元(词元/Token),再把每个单元映射成数字 ID。做这件事的工具就叫分词器(Tokenizer)。
Token 不等于一个词。一个 Token 可能是完整的词、词的一部分、标点,甚至空格。这也是为什么大模型用"多少 Token"而不是"多少字"来描述上下文长度。
2. 三种分词粒度
| 粒度 | 方式 | 优点 | 缺点 |
|---|---|---|---|
| 按词 | “I love apple” → [I, love, apple] | 直观 | 词表巨大,无法处理新词 |
| 按字符 | 每个字母/汉字一个 Token | 词表极小 | 序列太长,单字符无语义 |
| 子词(Subword) | 常见词保持完整,生僻词拆分 | 兼顾两者 | 实现较复杂 |
子词切分是现代模型普遍采用的方案,例如:
"unhappiness" → ["un", "happiness"]
"tokenization" → ["token", "ization"]
"我爱吃苹果" → ["我", "爱", "吃", "苹", "果"]
3. 主流分词算法
BPE(字节对编码):GPT 系列使用。从字符出发,把高频字符组合不断合并,直到词表达到预设大小。
WordPiece:BERT 使用。思路与 BPE 相似,但合并标准是"最大提升语言模型概率"而非纯频率。子词片段用 ## 前缀标记:
"playing" → ["play", "##ing"]
SentencePiece:T5、LLaMA 使用。直接在原始文本上操作,不依赖空格预切分,对中文、日文等无空格语言天然友好。
字节级 BPE(Byte-level BPE):GPT-2/3/4 使用。从 256 个 UTF-8 字节出发做 BPE,理论上能处理任何字符,彻底消灭未知词问题。
4. 分词器流程
原始文本
↓ 文本清洗
↓ 切分成 Token
↓ 映射成数字 ID
↓ 添加特殊标记([CLS]、[SEP]、[MASK] 等)
数字序列 → 输入模型
以 BERT 为例,“我爱苹果” 处理后大致为:
[101, 2769, 4263, 5741, 3362, 102]
CLS 我 爱 苹 果 SEP
5. 各大模型分词器对比
| 模型 | 分词器 | 算法 | 词表大小 | 中文效率 |
|---|---|---|---|---|
| BERT | WordPiece | 子词BPE | 3万 | 差(单字) |
| GPT-2 | tiktoken | 字节级BPE | 5万 | 较差 |
| GPT-4 | tiktoken (cl100k) | 字节级BPE | 10万 | 中等 |
| Claude 3 | 自研字节级BPE | 字节级BPE | ~10万+ | 中等 |
| LLaMA 1/2 | SentencePiece | BPE | 3.2万 | 很差 |
| LLaMA 3 | tiktoken | 字节级BPE | 12.8万 | 良好 |
| Qwen | tiktoken改进版 | 字节级BPE | 15万 | 优秀 |
| ChatGLM | SentencePiece | BPE | 6.4万 | 良好 |
6. 中文分词的特殊性
中文没有空格,边界完全模糊,是分词器设计的难点。
- 字级别分词:最简单,BERT中文版采用,每个汉字一个Token,但语义粒度粗。
- SentencePiece:对中文最友好的通用方案,能自然把高频词组合为整体Token。
- 扩充中文词表的BPE:国产模型(Qwen、ChatGLM、Baichuan)的主流做法,专项加入大量中文词语和短语。
Token 效率对比示例:
"今天天气很好"
字级分词: 今/天/天/气/很/好 → 6 tokens
优化中文BPE: 今天/天气/很好 → 3 tokens
7. tiktoken 改进版(以 Qwen 为例)
Qwen 在 OpenAI tiktoken 基础上做了以下改进:
- 扩充中文词表:从约 10 万扩展到约 15 万,大量新增中文单字、常用词和高频短语。
- 保留字节级回退:词表之外的罕见字符仍回退到字节级,不出现未知词。
- 多语言优化:日文、韩文及常见编程语言关键字也做了扩充。
效果:同等中文内容,Token 消耗约为原版 tiktoken 的 1/2~1/3,在相同上下文窗口内能处理更多中文。
二、嵌入模型(Embedding Model)
1. 核心思想
把文本映射到高维连续向量空间,让语义相近的文本在空间中距离也相近:
"我喜欢吃苹果" → [0.23, -0.17, 0.85, ...] (768维)
"我爱吃水果" → [0.21, -0.15, 0.83, ...] (768维,与上句接近)
"今天股市大涨" → [-0.45, 0.62, -0.31, ...] (768维,距离远)
2. 与生成模型的区别
生成模型:文本 → 模型 → 文本(输出语言)
嵌入模型:文本 → 模型 → 向量(输出数字)
嵌入模型通常只用编码器,对整段输入做一次编码,取 [CLS] 位置的向量作为全文表示。
3. 训练方式:对比学习
构造三元组进行训练:
锚点: "苹果是一种水果"
正样本:"苹果属于水果类别" ← 向量要靠近
负样本:"苹果公司发布新手机" ← 向量要远离
目标是让锚点与正样本距离最小化,与负样本距离最大化。
4. 相似度计算:余弦相似度
similarity=a⃗⋅b⃗∣a⃗∣∣b⃗∣\text{similarity} = \frac{\vec{a} \cdot \vec{b}}{|\vec{a}||\vec{b}|}similarity=∣a∣∣b∣a⋅b
- 结果范围:-1 到 1
- 大于 0.8:通常认为语义高度相关
- 接近 0:语义无关
- 接近 -1:语义相反
5. 向量维度的选择
| 维度 | 特点 | 适用场景 |
|---|---|---|
| 256~512 | 存储小,检索快 | 大规模粗排 |
| 768~1024 | 效果与效率平衡 | 主流选择 |
| 2048~3072 | 语义最丰富 | 精排或高质量场景 |
6. 主流嵌入模型对比
| 模型 | 开发方 | 向量维度 | 最大输入 | 特点 |
|---|---|---|---|---|
| text-embedding-3-large | OpenAI | 3072 | 8191 tokens | 效果强,闭源 |
| text-embedding-3-small | OpenAI | 1536 | 8191 tokens | 轻量,性价比高 |
| bge-large-zh | BAAI | 1024 | 512 tokens | 中文最强之一 |
| bge-m3 | BAAI | 1024 | 8192 tokens | 多语言,支持长文 |
| GTE | 阿里 | 1024 | 8192 tokens | 中英双语 |
| embedding-v3 | 智谱 | 2048 | 8192 tokens | 中文优化 |
中文 RAG 场景推荐:bge-m3,在中英双语和长文本处理上表现突出,是目前中文 RAG 场景下最常用的开源选择。
7. 典型应用场景
- 语义搜索:文档转向量存入向量库,查询时找余弦相似度最高的文档
- RAG(检索增强生成):检索最相关知识片段喂给生成模型
- 文本聚类/分类:利用向量空间分布自动归类
- 相似度计算:查重、推荐、问答匹配
三、RAG(检索增强生成)
1. 解决的问题
大语言模型有两个天然局限:训练数据有截止日期、无法记住私有知识。RAG 的思路是在回答时实时检索相关知识,再让模型参考这些知识来回答。
没有RAG:问题 → 模型 → 回答(只靠训练时记住的知识)
有了RAG: 问题 → 检索相关文档 → 问题+文档 → 模型 → 回答
2. 完整架构
┌──────────────────────────────────┐
│ 知识库建立(离线) │
│ 文档 → 切块 → 嵌入模型 → 向量库 │
└──────────────────────────────────┘
↕
用户提问 → 嵌入模型 → 向量检索 → Top-K文档片段
↓
问题 + 文档片段 → 生成模型 → 回答
嵌入模型在流程中出现两次:建库时对文档编码,查询时对问题编码。两次必须用同一个嵌入模型,才能在同一向量空间里计算距离。
3. 嵌入模型质量决定 RAG 上限
常见失败模式:
- 召回错误:正确文档没被检索到,模型只能凭空回答或幻觉
- 召回噪声:检索到相关度不高的文档,干扰模型判断
4. RAG 的局限
- 跨文档推理弱:答案分散在多个文档时,难以同时召回并关联
- 分块损失:文档切块破坏上下文连贯性
- 检索失败风险:语义相似度不等于真正相关
四、RAG 的改进与替代方案
1. 各方案对比
| 方案 | 核心思路 | 优点 | 缺点 |
|---|---|---|---|
| RAG | 检索相关片段喂给模型 | 工程成本低,知识可实时更新 | 跨文档推理弱,有检索失败风险 |
| 长上下文模型 | 把整个知识库塞进上下文 | 无检索误差 | 成本极高,"迷失在中间"问题 |
| GraphRAG | 构建知识图谱,沿图推理 | 多跳推理能力强 | 构建和维护成本高 |
| 微调 | 把知识训练进模型参数 | 回答流畅,无需检索 | 更新困难,训练成本高 |
| RAG + 微调 | 两者结合,分工协作 | 兼顾能力和实时知识 | 工程复杂度高 |
2. RAG + 微调结合
核心分工:
微调解决:怎么说(领域语言、回答格式、推理方式)
RAG解决: 说什么(具体事实、最新信息、私有数据)
典型微调方式:
- 全量微调:更新所有参数,效果最好,成本极高
- LoRA 微调:只训练少量附加参数,效果接近全量,成本低一个数量级,目前最流行
- 提示词微调:只训练软提示向量,成本最低,效果有限
适用场景: 知识库庞大且频繁更新,同时对回答质量和风格有较高要求。
3. 场景选择建议
| 场景 | 推荐方案 |
|---|---|
| 知识频繁更新 | RAG |
| 需要跨文档推理 | GraphRAG |
| 知识固定、追求流畅 | 微调 |
| 文档量小、预算充足 | 长上下文 |
| 复杂推理任务 | Test-Time Compute |
| 大规模生产系统 | RAG + 微调结合 |
五、表示模型与嵌入模型的关系
1. 嵌入模型(Embedding Model)
专门用来把文本转成向量的模型,目标是让语义相近的文本在向量空间里距离也相近。输出是一个固定长度的向量,代表整段文本的语义。bge、text-embedding 系列都属于这类。
2. 表示模型(Representation Model)
这是一个更宽泛的概念,指所有以学习数据的有效表示为目标的模型。嵌入模型是表示模型的一种,但表示模型不止于此:
- 句子表示:把一句话压缩成一个向量 → 这就是嵌入模型做的事
- 词级表示:给序列中每个词都输出一个向量,而不是整段文本一个向量 → BERT 主要做这个
- 跨模态表示:把图片、文字、音频映射到同一个向量空间 → 如 CLIP 模型
3. BERT 是哪种模型?
BERT 是容易引起混淆的典型例子。
BERT 本质上是表示模型——它对输入序列中每个 Token 都输出一个向量,可用于分类、问答、命名实体识别等下游任务。
但 BERT 也常被用作嵌入模型——取 [CLS] 位置的向量作为整句话的表示。不过原始 BERT 直接这样用效果不好,需要经过专门的对比学习微调(如 Sentence-BERT)才能成为高质量的嵌入模型。
4. 一句话总结
表示模型是大概念,嵌入模型是其中专注于"整段文本 → 单一向量"这个子任务的小概念。所有嵌入模型都是表示模型,但不是所有表示模型都是嵌入模型。
六、与 AI Agent 开发的关系
1. AI Agent 是什么
Agent 的核心是让模型不只是"回答问题",而是能自主规划、调用工具、多步执行任务。典型的 Agent 循环是:
感知输入 → 思考下一步 → 调用工具 → 观察结果 → 继续思考 → … → 任务完成
前面学的每一个概念,在这个循环里都有具体的落脚点。
2. 分词器和词元:决定 Agent 的信息容量上限
Agent 执行任务时,上下文窗口里需要放很多东西:系统提示、对话历史、工具调用结果、检索到的文档……这些全都消耗 Token。
分词效率直接影响 Agent 的实际能力边界。同样是 128K 的上下文窗口,中文 Token 效率高的模型能装下更长的对话历史和更多的工具返回结果,Agent 执行复杂任务的能力也就更强。这也是为什么国产 Agent 框架更倾向于用 Qwen 或 ChatGLM 作为底座——Token 效率的差异在长任务中会被放大。
3. 嵌入模型:Agent 的记忆与工具检索系统
嵌入模型在 Agent 里主要承担两个职责:
记忆检索:Agent 执行长任务时会积累大量中间信息,不可能全放进上下文。嵌入模型把历史信息向量化存储,Agent 需要某段记忆时,用当前状态做向量检索,把最相关的记忆召回放进上下文。本质上就是 RAG,只不过检索对象从"知识文档"变成了"Agent 的历史经验"。
工具选择:当 Agent 可用的工具很多时(几十甚至上百个),不可能把所有工具描述都塞进提示词。嵌入模型可以把工具描述向量化,根据当前任务语义检索最相关的工具子集,再放进上下文让模型决策。
4. RAG:Agent 获取外部知识的标准管道
单纯的 RAG 是一次性的:用户问一个问题,检索一次,生成一个回答。而 Agent 里的 RAG 是动态的、多轮的:Agent 在执行任务过程中会多次触发检索,每次检索的 Query 是 Agent 当前的思考状态,而不是用户的原始问题。
5. 表示模型:Agent 理解和推理的深度基础
Agent 的"思考"本质上是模型在向量空间里的运算。模型对任务的理解、对工具的判断、对下一步的规划,都依赖于内部表示的质量。表示模型训练得越好,Agent 的决策质量也就越高。
6. 一个完整的 Agent 任务流程
以"帮我调研竞品并写一份报告"为例:
用户输入(Token 化)
↓
Agent 规划:需要搜索、阅读、总结三个步骤
↓
调用搜索工具 → 返回大量网页内容
↓
嵌入模型对网页内容向量化,检索最相关片段(RAG)
↓
把相关片段放入上下文(消耗 Token,依赖分词效率)
↓
Agent 思考:内容够了吗?需要再搜索吗?
↓
生成报告草稿
↓
存入外部记忆(嵌入模型向量化),供后续任务复用
7. 一句话总结
分词器决定 Agent 的信息容量上限,嵌入模型是 Agent 的记忆和工具检索系统,RAG 是 Agent 获取外部知识的标准管道,表示模型的质量决定了 Agent 理解和推理的深度。这些基础概念共同构成了 Agent 能力的底层基础设施。
七、知识关联图
文本输入
↓
分词器(Tokenizer)
├── BPE / WordPiece / SentencePiece / 字节级BPE
└── 输出:Token ID 序列
↓
模型处理
├── 生成模型(GPT、Claude)→ 输出文字
└── 嵌入模型(bge、text-embedding)→ 输出向量
↓
向量数据库
↓
RAG 检索
↓
生成模型 + 检索结果 → 最终回答
笔记整理时间:2026年4月21日
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)