【大模型】大白话讲透:大模型中的 Embedding(向量嵌入)

从定义、原理、参数更新到 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 的关系

维度TokenizerEmbedding
作用把文本切成 token,转成 id把 id 转成向量
输出整数列表(token id)向量列表
是否可训练通常不可训练(训练前固定词表)可训练(嵌入矩阵是参数)
关系是 Embedding 的前置步骤依赖 Tokenizer 的输出

核心关系

  1. Tokenizer 是 Embedding 的入口:没有 tokenizer 切词并转 id,embedding 层没有输入
  2. 词表大小决定嵌入矩阵的行数:tokenizer 词表 128K,嵌入矩阵就是 128K × 维度
  3. 两者必须配对使用:A 模型的 tokenizer 切出来的 id,只能查 A 模型的嵌入矩阵,不能查 B 模型的——因为词表不一样,同一个 id 代表不同的词
  4. 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_tokensOpenAI text-embedding、BGE、M3E、GTE

大白话类比

  • 模型内的 embedding:就像你大脑里的“词汇表”——每个词在你脑子里有一个固定的“印象”,但理解一句话时,你会结合上下文调整理解。
  • 作为服务的 embedding:就像一个专门的“文本指纹生成器”——给它一段话,它输出一个代表这段话整体语义的“指纹”,用来和其他指纹比相似度。

一个常见误区

很多人以为“大模型的 embedding 可以拿来做 RAG 检索”——不行

  • 大模型内部的 token embedding 是每个词一个向量,不是整句向量
  • 它的训练目标是“预测下一个词”,不是“语义相似度”
  • 直接拿它做检索效果很差
  • RAG 必须用专门训练的 embedding 模型

七、Embedding 有哪些算法/模型?

第一代:静态词向量(每个词固定一个向量)

算法时间特点
Word2Vec2013开山之作,CBOW/Skip-gram两种模式
GloVe2014基于共现矩阵,全局统计
FastText2016考虑子词信息,适合形态丰富的语言

局限:一个词只有一个向量,不考虑上下文。“苹果”在水果和手机里是同一个向量。

第二代:上下文相关词向量

算法时间特点
ELMo2018双向LSTM,动态生成上下文相关向量
BERT2018Transformer编码器,取各层输出作为词向量

进步:同一个词在不同上下文里向量不同。

第三代:句子级 embedding(RAG 时代的主力)

模型出处特点
Sentence-BERT2019用BERT微调,专门生成句子向量
SimCSE2021对比学习,简单高效
E52022微软,多语言,效果强
BGE2023智源研究院,中文最强开源之一,有BGE-large、BGE-m3
M3E2023中文,由 Moka AI 等机构开发,支持多任务
GTE2023阿里,通用文本嵌入
text-embedding-ada-002OpenAI闭源API,工业界最常用
text-embedding-3-largeOpenAI最新,支持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 模型的向量库,能不能合并查询?

不能直接合并,但有几种解决方案:

  1. 重新编码:用同一个模型把所有文档重新转一遍向量(最稳妥)
  2. 向量空间对齐:训练一个映射矩阵,把A空间的向量转到B空间(有精度损失)
  3. 分别检索再融合:各自检索各自的库,最后把结果合并去重(可以,但复杂)

工程实践建议

  • 从一开始就选定一个 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 的第一步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值