🧲 RAG 核心第三步:向量化(Embedding)通俗演义与面试指南

在 RAG(检索增强生成)的流程中,如果说“文档分块(Chunking)”是把大块的肉切成小块,那么向量化(Embedding) 就是给每一块肉贴上“风味标签”,方便大模型在海量数据中瞬间找到最对味的那一块。

对于准备面试的同学来说,Embedding 相关的考点往往集中在原理解释、模型选型、多语言处理以及底层相似度计算上。

今天我们就用大白话,带你吃透 Embedding 的底层逻辑,并附带可以直接跑的面试加分代码!


一、 💡 什么是文本嵌入(Embedding)?(大白话秒懂)

大白话解释
计算机是不认识汉字和英文的,它只认识数字。Embedding 就是把一段文字变成一串固定长度的数字(稠密向量)
你可以把它想象成在茫茫宇宙中给这段文字定了一个**“三维坐标”**。意思是相近的句子,在宇宙中的坐标也离得越近;意思八竿子打不着的句子,坐标离得十万八千里。

底层原理详解

  • 数学本质:把离散文本映射为固定维度的稠密向量(Dense Vector)。
  • 训练目标:主流的 Embedding 模型大多采用“对比学习(Contrastive Learning)”训练。目标就是:同义句拉近,无关句推远
  • 如何比较距离?:在工程上,我们最常使用**余弦相似度(Cosine Similarity)内积(Dot Product)**来计算两个向量的距离。

二、 🏆 主流 Embedding 模型大盘点(面试常问选型)

面试官经常会问:“你们项目中用的是什么 Embedding 模型?为什么选它?”

在企业真实落地中,常见的选择有这几大派系:

模型系列 代表模型 💡 核心特点与适用场景
OpenAI 系 text-embedding-3-small/large 生态最成熟,多语言能力极强。缺点是需要 API 费用,且数据必须出境,对私密性要求极高的军工/金融企业不适用。
BAAI (智源) 系 bge-large-zh-v1.5 中文开源界的扛把子!不仅开源免费,而且可以本地私有化部署。强烈推荐国内企业级项目首选。
Moka 系 M3E 中文句向量王者。体积轻量,非常适合算力有限的本地化部署,在中短文本检索上表现极佳。
Jina 系 jina-embeddings 长文本领域的专家。支持高达 8K 甚至更长的上下文窗口,在超长文档和多语言混合场景下有显著优势。

三、 ⚖️ 面试必考:如何做 Embedding 选型与权衡?

面试官不仅想听你知道几个模型名字,更想看你的架构权衡(Trade-off)能力

在选型时,你需要综合考虑以下 4 个标准:

  1. 语言与领域:如果是纯中文业务,优先选中文强化过的模型(如 BGE、M3E);如果是医疗、法律这种专业名词多的领域,最好找针对该领域微调过的版本。
  2. 序列长度:如果你的 Chunk 切得很大(比如 2000 tokens),就必须选支持长上下文的模型;否则超出的部分会被强行截断,导致语义丢失。
  3. 许可证与部署限制:评估公司是否允许数据上云。不能上云就只能选开源模型做本地私有化部署。
  4. 与生成模型的匹配:有时候为了生态省心,会采用同一厂商的链路(非强制要求,但能减少多平台调用的网络波动风险)。

🔥 核心权衡:维度、速度与效果

  • 维度高:表达能力更强,能区分更细微的语义差别。代价是向量数据库的索引会变得极其庞大,近似最近邻(ANN)搜索的速度会变慢。
  • 速度优化:为了加速,工程上常采用 GPU 批量推理,或者对向量模型进行量化(INT8)。
  • 效果评估:不要盲信官方跑分(榜单),必须在你们自己业务的数据集上看 检索召回率(Recall@K) 和最终的端到端问答准确率!

四、 🎯 高频面试 Q&A 实战演练

Q1:同一个 Embedding 模型,如果用于中英文混合文档,需要注意什么?

标准答案

  1. 必须选择**跨语言(Multilingual)**能力强的模型(比如 OpenAI 的 text-embedding-3 或针对中英双语优化过的开源模型)。
  2. 如果使用单语言模型,极易导致跨语言的语义空间不一致(比如查英文 “Apple”,搜不到中文的 “苹果” 文档)。
  3. 如果找不到完美的多语言模型,工程落地上可以考虑:分别建立中文和英文的两套索引,或者在检索时引入 BM25(关键词检索) 作为混合检索的补充,以此来弥补纯向量检索的跨语言短板。

在这里插入图片描述

五、 💻 面试加分代码:手写 Embedding 与向量计算

在面试中如果能口述出如何使用 sentence-transformers 库加载本地模型,并解释清楚**“归一化(Normalize)”**的作用,面试官会认为你基础极其扎实。

# 运行前需安装: pip install sentence-transformers
from sentence_transformers import SentenceTransformer
import numpy as np

# 1. 加载本地开源模型 (以智源的 BGE 为例,首次运行会自动下载)
# 在企业内网环境,通常会把模型下载到本地,这里填入本地绝对路径
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")

# 2. 准备需要向量化的文本
sentences = [
    "RAG 是检索增强生成的缩写,能有效缓解大模型幻觉。",
    "大模型在企业落地时,通常需要挂载外部知识库。"
]

# 3. 执行向量化 (Encoding)
# 🌟 面试极其加分的参数:normalize_embeddings=True
# 归一化的作用是把所有向量的长度(模)变成 1。
# 这样在计算向量相似度时,直接计算“内积 (Dot Product)”就等价于计算“余弦相似度 (Cosine Similarity)”。
# 内积的计算速度比余弦相似度快得多,这是向量数据库底层加速的核心技巧!
embeddings = model.encode(sentences, normalize_embeddings=True)

# 打印向量的形状 (输出应为 2 个句子,每个句子被映射为了特定维度的浮点数数组)
# bge-large 默认维度通常是 1024 维
print("向量的形状 (Batch, Dimension):", embeddings.shape) 

# ---------------------------------------------------------
# 验证:证明 归一化后的内积 == 余弦相似度
# ---------------------------------------------------------
vec_a = embeddings[0]
vec_b = embeddings[1]

# 计算内积
dot_product = np.dot(vec_a, vec_b)

# 计算余弦相似度
norm_a = np.linalg.norm(vec_a)
norm_b = np.linalg.norm(vec_b)
cosine_sim = np.dot(vec_a, vec_b) / (norm_a * norm_b)

print(f"内积结果: {dot_product:.4f}")
print(f"余弦相似度: {cosine_sim:.4f}")
# 面试时告诉面试官:因为 norm_a 和 norm_b 都是 1,所以分母为 1,两者结果完全一致!
Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐