从定义、原理、参数更新到 RAG 跨模型共用,一次讲透所有关键问题。
一、Embedding 是什么?
一句话定义
把离散的符号(词、句子、图片、音频)转换成连续的高维向量,让“语义相似的东西,向量距离也近”。
大白话类比:翻译官 + 坐标定位
想象 AI 是一个外星人,它看不懂人类文字,但它能理解“空间坐标”。
Embedding 就是一个翻译官:
- 输入:“苹果”(人类文字)
- 输出:
[0.23, -0.45, 0.67, ...](一串数字,AI 能理解的坐标)
关键特性:
- “苹果”和“香蕉”的坐标离得近(都是水果)
- “苹果”和“汽车”的坐标离得远(语义不同)
- “苹果手机”和“iPhone”的坐标也很近(同义)
AI 不理解文字,但它能通过坐标距离判断“两个东西像不像”。
数学本质
"苹果" → [0.12, -0.34, 0.56, ..., 0.78] (比如1024维向量)
每个维度代表一个抽象的语义特征(可能是“水果程度”“科技程度”“大小”等),但具体每个维度代表什么,人类通常无法直接解释——它是模型自己学出来的。
二、Embedding 在大模型中哪些环节使用?
1. 模型内部:词嵌入层(输入层)
每个大模型的最底层都有一个词嵌入矩阵:
词表大小 × 向量维度
比如:128000个词 × 4096维
输入文本先分词,每个 token 查表得到向量,再送入后续网络。
这是大模型的“入口”——没有 embedding,文字根本进不了模型。
2. RAG 检索增强生成(最常见的外部使用)
- 文档先全部转成 embedding 向量,存入向量数据库
- 用户提问时,问题也转成 embedding
- 在向量库里找“距离最近”的文档片段
- 把找到的片段 + 用户问题一起送给大模型生成答案
3. 语义搜索
传统搜索是“关键词匹配”,embedding 搜索是“语义匹配”:
- 搜“怎么让电脑变快”,能匹配到“计算机性能优化方法”(没有共同关键词,但语义相同)
4. 推荐系统
- 用户行为转成向量,物品转成向量
- 找和用户向量最接近的物品推荐
5. 文本聚类/分类
- 大量文本转成向量后,按距离聚类
- 或者用向量做分类特征
6. 相似度计算/去重
- 判断两段文本是否相似(抄袭检测、去重)
- 计算用户问题和 FAQ 的匹配度
三、Embedding 有什么作用?
1. 解决“离散符号无法计算”的问题
文字是离散的(“苹果”和“香蕉”是两个完全不同的符号),神经网络只能处理连续数值。Embedding 把离散符号映射到连续向量空间,让数学计算成为可能。
2. 编码语义信息
好的 embedding 能让“语义相似的词向量接近”,这样模型就能理解同义词、近义词、上下文关系。
3. 降维表示
一个词用 one-hot 编码需要词表大小维(比如128000维),用 embedding 只需要几百到几千维,同时保留语义信息。
4. 作为检索的桥梁
在 RAG 和语义搜索中,embedding 是“查询”和“文档”之间的通用语言——都转成向量,就能比距离。
四、Embedding 的过程是什么?和 Tokenizer 有什么关系?
完整流程:Tokenizer → Embedding 两步走
原始文本 → 【Tokenizer分词】→ token id列表 → 【Embedding查表】→ 向量序列
第一步:Tokenizer(分词器)
把原始文本切分成一个个 token,并转换成 token id:
"我爱自然语言处理" → ["我", "爱", "自然", "语言", "处理"] → [123, 456, 789, 101, 112]
- Tokenizer 决定了“怎么切词”(按字、按词、按子词BPE)
- Tokenizer 有一个固定的词表,每个 token 对应一个唯一 id
- 词表大小通常是几万到十几万(比如 LLaMA 是 32K,GPT-4 是 128K)
第二步:Embedding(嵌入)
把每个 token id 查表,转换成向量:
[123, 456, 789, 101, 112] → [[...], [...], [...], [...], [...]]
- 查的就是嵌入矩阵的第 123 行、第 456 行……
- 每个 token 对应一个固定维度的向量
Tokenizer 和 Embedding 的关系
| 维度 | Tokenizer | Embedding |
|---|---|---|
| 作用 | 把文本切成 token,转成 id | 把 id 转成向量 |
| 输出 | 整数列表(token id) | 向量列表 |
| 是否可训练 | 通常不可训练(训练前固定词表) | 可训练(嵌入矩阵是参数) |
| 关系 | 是 Embedding 的前置步骤 | 依赖 Tokenizer 的输出 |
核心关系:
- Tokenizer 是 Embedding 的入口:没有 tokenizer 切词并转 id,embedding 层没有输入
- 词表大小决定嵌入矩阵的行数:tokenizer 词表 128K,嵌入矩阵就是 128K × 维度
- 两者必须配对使用:A 模型的 tokenizer 切出来的 id,只能查 A 模型的嵌入矩阵,不能查 B 模型的——因为词表不一样,同一个 id 代表不同的词
- Tokenizer 的质量影响 Embedding 的效果:切词不合理(比如把“自然语言”切成“自”“然”“语”“言”),embedding 学起来更难
大白话类比
- Tokenizer = 把一篇文章切成一个个字/词,给每个字/词编个号
- Embedding = 给每个编号的字/词分配一个“语义坐标”
- 关系:先切词编号,再分配坐标,两步缺一不可
两种 Embedding 的过程差异
模型内部的词嵌入(查表式)
输入文本 → Tokenizer分词 → 每个token查嵌入矩阵 → 得到向量序列
- 嵌入矩阵是模型参数的一部分,和模型一起训练
- 过程就是“查表”,非常快
- 查表得到的初始向量是固定的(不考虑上下文),但后续的 Transformer 层会通过自注意力机制融入上下文信息,因此模型实际使用的是上下文感知的向量
作为服务的句子 Embedding(编码式)
输入文本 → Tokenizer分词 → 送入embedding模型(Transformer编码器)→
经过多层自注意力计算 → 取[CLS]向量或平均池化 → L2归一化 → 输出单个向量
- 是一个独立的模型,专门用来把文本转成向量
- 会考虑上下文(“苹果”在“吃苹果”和“苹果手机”里向量不同)
- 输出通常是固定维度的单个向量(代表整个句子/段落)
五、Embedding 有哪些参数?参数是如何更新的?
1. 参数是什么?
Embedding 的参数就是一个嵌入矩阵:
矩阵形状:词表大小 × 向量维度
比如:128000个词 × 4096维 = 5.2亿个参数
每一行对应一个词的向量。
2. 维度怎么确认?
维度是超参数,人工设定,不是学出来的。
常见设定:
- 小模型:256、512、768(BERT-base)
- 中模型:1024、1536(OpenAI ada-002)
- 大模型:4096(LLaMA-7B)、8192(LLaMA-70B)
设定依据:模型越大维度越高(表达能力需求大),但维度越高参数量越大、计算越慢,是“效果 vs 成本”的权衡。同时,维度也受限于硬件(显存/内存),因为嵌入矩阵的大小 = 词表大小 × 维度。
3. 参数怎么初始化?
- 随机初始化:训练从零开始时,用正态分布或均匀分布随机初始化
- 预训练加载:微调时,加载预训练好的嵌入矩阵
- 特殊 token:[CLS]、[SEP]、[PAD] 等特殊 token 的向量也是学出来的
4. 参数怎么更新?
反向传播时,梯度会传到嵌入层,更新嵌入矩阵。
过程:
前向:token id → 查表 → 向量 → ... → 损失
反向:损失梯度 → ... → 嵌入层梯度 → 更新嵌入矩阵
具体来说:
- 每个 batch 里出现过的 token,对应的行向量会被更新
- 没出现过的 token,这一轮不更新
- 更新公式和其他参数一样:
新参数 = 旧参数 - 学习率 × 梯度
5. 可以冻结 Embedding 不更新吗?
可以,而且很常见:
- 预训练阶段:embedding 和整个模型一起训练,一起更新
- 微调阶段:有时候会冻结 embedding 层(设为 requires_grad=False),只更新后面的层
- 原因:预训练的词嵌入已经很好了,微调数据少,更新反而可能变差
- 节省显存和计算
6. 输出层投影和 Embedding 的关系
大模型的输出层有一个“隐藏状态→词表概率”的投影矩阵,形状是 维度 × 词表大小,正好是嵌入矩阵的转置。
很多模型采用权重绑定(Weight Tying):输出层投影矩阵直接用嵌入矩阵的转置,共享参数。
- 好处:减少参数量,训练更稳定
- 意味着:更新 embedding 等于更新输出投影,反之亦然
类比
- 维度 = 你给每个词分配的“描述字数”(用100个字描述一个词,还是1000个字)
- 参数 = 每个词的具体“描述内容”
- 初始化 = 先随便写一个描述
- 更新 = 根据考试反馈,不断修改每个词的描述,让描述更准确
- 冻结 = 描述已经写得很好了,不再改了
六、作为服务的 Embedding 和模型内的 Embedding 有什么区别?
这是一个非常关键的问题,两者名字一样但完全不是一回事:
| 维度 | 模型内的 Embedding | 作为服务的 Embedding |
|---|---|---|
| 本质 | 模型输入层的一个参数矩阵 | 一个独立的完整模型 |
| 输出 | 每个 token 一个向量(序列) | 整个句子/段落一个向量 |
| 是否考虑上下文 | 后续层会考虑,但查表本身是静态的 | 编码过程就考虑上下文 |
| 训练方式 | 和大模型一起端到端训练 | 专门用对比学习等方法训练 |
| 用途 | 大模型的输入入口,参与后续所有计算 | 检索、聚类、相似度计算、RAG |
| 是否独立可用 | 不能,必须和整个模型一起用 | 能,单独提供 API 服务 |
| 更新方式 | 随大模型一起更新 | 可以独立更换、微调 |
| 典型代表 | GPT 的词嵌入层、LLaMA 的 embed_tokens | OpenAI text-embedding、BGE、M3E、GTE |
大白话类比
- 模型内的 embedding:就像你大脑里的“词汇表”——每个词在你脑子里有一个固定的“印象”,但理解一句话时,你会结合上下文调整理解。
- 作为服务的 embedding:就像一个专门的“文本指纹生成器”——给它一段话,它输出一个代表这段话整体语义的“指纹”,用来和其他指纹比相似度。
一个常见误区
很多人以为“大模型的 embedding 可以拿来做 RAG 检索”——不行。
- 大模型内部的 token embedding 是每个词一个向量,不是整句向量
- 它的训练目标是“预测下一个词”,不是“语义相似度”
- 直接拿它做检索效果很差
- RAG 必须用专门训练的 embedding 模型
七、Embedding 有哪些算法/模型?
第一代:静态词向量(每个词固定一个向量)
| 算法 | 时间 | 特点 |
|---|---|---|
| Word2Vec | 2013 | 开山之作,CBOW/Skip-gram两种模式 |
| GloVe | 2014 | 基于共现矩阵,全局统计 |
| FastText | 2016 | 考虑子词信息,适合形态丰富的语言 |
局限:一个词只有一个向量,不考虑上下文。“苹果”在水果和手机里是同一个向量。
第二代:上下文相关词向量
| 算法 | 时间 | 特点 |
|---|---|---|
| ELMo | 2018 | 双向LSTM,动态生成上下文相关向量 |
| BERT | 2018 | Transformer编码器,取各层输出作为词向量 |
进步:同一个词在不同上下文里向量不同。
第三代:句子级 embedding(RAG 时代的主力)
| 模型 | 出处 | 特点 |
|---|---|---|
| Sentence-BERT | 2019 | 用BERT微调,专门生成句子向量 |
| SimCSE | 2021 | 对比学习,简单高效 |
| E5 | 2022 | 微软,多语言,效果强 |
| BGE | 2023 | 智源研究院,中文最强开源之一,有BGE-large、BGE-m3 |
| M3E | 2023 | 中文,由 Moka AI 等机构开发,支持多任务 |
| GTE | 2023 | 阿里,通用文本嵌入 |
| text-embedding-ada-002 | OpenAI | 闭源API,工业界最常用 |
| text-embedding-3-large | OpenAI | 最新,支持MRL可变维度 |
第四代:多模态 embedding
| 模型 | 特点 |
|---|---|
| CLIP | 图文对齐,图片和文字转到同一向量空间 |
| BLIP | 图文统一理解 |
| 各种多模态嵌入模型 | 同时支持文本、图片、音频 |
怎么选?
- 中文 RAG:BGE-large-zh、BGE-m3、M3E 是首选
- 英文/多语言:E5、GTE、OpenAI ada-002
- 多模态:CLIP 系列
- 企业级商用:OpenAI text-embedding-3 系列、Cohere Embed
八、RAG 中不同大模型的 Embedding 可以共用吗?
先澄清一个概念混淆
“不同大模型的 embedding”,可能指两种情况:
情况A:embedding 模型和生成大模型不同
可以,而且这是标准做法。
RAG 架构通常是:
Embedding模型(比如BGE)→ 负责把文档和问题转成向量、做检索
生成大模型(比如GPT/LLaMA/Qwen)→ 负责根据检索结果生成答案
这两个模型完全独立,可以任意组合:
- BGE 做 embedding + GPT-4 做生成 ✅
- OpenAI embedding + 开源 Qwen 做生成 ✅
- M3E 做 embedding + Claude 做生成 ✅
原因:embedding 只负责“找相关文档”,找到后把原文(不是向量)送给生成模型。生成模型看到的是文字,不是向量,所以两者不需要兼容。
情况B:用 A embedding 模型编码文档,用 B embedding 模型编码问题
绝对不行,效果会崩。
每个 embedding 模型有自己独立的向量空间:
- BGE 模型的“苹果”向量在它的空间里的某个位置
- M3E 模型的“苹果”向量在完全不同的另一个空间里
- 两个空间的坐标没有对应关系,距离计算毫无意义
类比:你用北京地图的坐标去找上海地图上的地点,完全对不上。
核心规则
RAG 中,文档和查询必须用同一个 embedding 模型编码。但 embedding 模型和生成大模型可以、而且通常是不同的。
九、可以跨模型查询吗?
什么叫“跨模型查询”?分三种情况:
情况1:用 A 模型的 embedding 向量,去查 B 模型建的向量库
不行。 向量空间不同,距离计算无意义,检索结果是随机的。
情况2:embedding 用 A 模型,生成用 B 模型
可以,标准做法。 上面已经解释过。
情况3:两个不同 embedding 模型的向量库,能不能合并查询?
不能直接合并,但有几种解决方案:
- 重新编码:用同一个模型把所有文档重新转一遍向量(最稳妥)
- 向量空间对齐:训练一个映射矩阵,把A空间的向量转到B空间(有精度损失)
- 分别检索再融合:各自检索各自的库,最后把结果合并去重(可以,但复杂)
工程实践建议
- 从一开始就选定一个 embedding 模型,不要中途换
- 如果必须换,全部重新编码,不要试图混用
- 向量库里存原始文本,换模型时重新编码即可
十、共用会影响效果吗?
混用不同 embedding 模型的向量:效果严重下降
- 检索准确率可能从 90% 降到接近随机(10%~20%)
- 因为向量空间不兼容,“最近邻”根本不是真的语义最近
- 这是 RAG 项目中最常见的低级错误之一
embedding 模型和生成模型不同:不影响
- 这是标准架构,两者解耦
- 生成模型看到的是检索到的原文,不是向量
- 只要检索质量好,生成质量就好
用弱的 embedding 模型:RAG 整体效果差
- embedding 是 RAG 的“眼睛”——眼睛不好,找不到正确的文档
- 找不到正确文档,生成模型再强也没用(垃圾进,垃圾出)
- 中文场景用通用英文 embedding,效果会明显差于中文专用模型
十一、Embedding 质量会怎么影响大模型?
1. RAG 场景:检索质量直接决定生成质量
RAG 的效果 = 检索质量 × 生成质量。
- 检索到正确文档 → 生成模型有正确素材 → 答案准确
- 检索到错误/不相关文档 → 生成模型被误导 → 答案错误甚至幻觉
- embedding 质量是 RAG 的天花板,生成模型再强也补不回来
2. 模型内部:embedding 质量影响模型理解能力
- 好的词嵌入:同义词接近、反义词远离、语义关系清晰 → 模型更容易理解语言
- 差的词嵌入:语义混乱 → 模型学起来更难,效果更差
- 大模型的 embedding 层参数量巨大(比如128K×4096≈5亿参数),是模型能力的重要组成部分
3. 语义相似度判断:差的 embedding 会“乱点鸳鸯谱”
- 把“苹果手机”和“苹果水果”匹配到一起(歧义处理差)
- 把“如何重置密码”和“密码是什么”匹配到一起(意图理解差)
- 专业领域术语匹配错误(领域适配差)
4. 长尾/专业领域:通用 embedding 效果差
- 通用 embedding 模型在通用文本上效果好
- 但在法律、医疗、代码等专业领域,术语和表达方式不同,效果会下降
- 解决方案:在领域数据上微调 embedding 模型
十二、其他重要补充
1. Embedding 需要 SoftMax 吗?
- 模型内词嵌入层(前向推理):不需要,纯查表
- Embedding模型推理(文本→向量):不需要,取编码器输出+L2归一化
- Embedding模型训练(对比学习):需要,InfoNCE损失中对相似度计算使用了SoftMax,用于区分正负样本
- 大模型输出层(预测下一个词):需要,logits→概率分布
2. Embedding 维度怎么选?
- 维度越高:表达能力越强,但存储和计算成本越高
- 常见维度:256、512、768、1024、1536、3072
- 实践建议:
- 小规模/成本敏感:512维
- 通用 RAG:1024维(BGE-large、ada-002 都是这个量级)
- 高质量需求:1536~3072维
- MRL(Matryoshka)技术:一个模型支持多种维度,高维截断成低维仍能保持较好效果(OpenAI text-embedding-3 支持)
3. 向量数据库
embedding 向量需要专门的数据库存储和检索:
- 开源:FAISS、Milvus、Qdrant、Weaviate、Chroma
- 云服务:Pinecone、阿里云向量检索、腾讯云向量数据库
- 核心能力:近似最近邻搜索(ANN),在百万/亿级向量中快速找到最近的,牺牲少量精度换取大幅速度提升
4. 向量归一化
大多数 embedding 模型输出后会做 L2 归一化(让向量长度=1):
- 归一化后,余弦相似度 = 点积
- 计算更快,距离更稳定
- 检索时通常用余弦相似度或点积
5. 微调 Embedding 模型
通用 embedding 在专业领域效果不够时,可以微调:
- 准备领域内的“相似文本对”数据
- 用对比学习继续训练
- 数据量不需要很大(几千对就能有明显提升)
- 工具:sentence-transformers 库、FlagEmbedding(BGE官方)
6. 多语言 Embedding
- 中文场景优先选中文优化的模型(BGE-zh、M3E)
- 多语言混合场景选多语言模型(BGE-m3、E5-multilingual)
- 不要用纯英文模型处理中文,效果会差很多
7. 长文本怎么 embedding?
embedding 模型有最大输入长度限制(通常512或1024 token):
- 长文档先切块(chunk),每块单独 embedding
- 切块策略:按段落、按固定长度+重叠、按语义分割
- 切块质量也会影响 RAG 效果
8. 反向传播会更新 Embedding 吗?
- 预训练阶段:一定更新,和整个模型一起训练
- 微调阶段:看情况,全参数微调会更新,冻结/LoRA通常不更新
- 反向传播也会更新注意力、FFN、LayerNorm等其他参数
十三、一句话总结
Embedding 是把文字翻译成 AI 能理解的“语义坐标”,是大模型的入口和 RAG 的眼睛。Tokenizer 负责切词编号,Embedding 负责把编号转成向量,两者必须配对使用。Embedding 的参数是嵌入矩阵,维度人工设定,反向传播时会被更新(除非冻结)。模型内的 embedding 是输入层的参数矩阵,作为服务的 embedding 是独立的向量生成模型,两者完全不同。RAG 中文档和查询必须用同一个 embedding 模型,但 embedding 模型和生成大模型可以任意组合。混用不同 embedding 模型的向量会让检索效果崩掉,而 embedding 质量直接决定 RAG 的天花板——选对模型、必要时微调,是做好 RAG 的第一步。
&spm=1001.2101.3001.5002&articleId=163831989&d=1&t=3&u=6cebb546548f4a269c4b1f0b1548cf39)
1594

被折叠的 条评论
为什么被折叠?



