RAG-Embedding 详解
Embedding 是什么?
Embedding(向量化/嵌入) 是把文本(或图片、音频等)转换成一串固定长度的数字向量的过程。
"苹果公司发布了新 iPhone" → [0.12, -0.34, 0.56, 0.78, ..., 0.23] (1536 个数字)
"Apple 推出最新款手机" → [0.11, -0.33, 0.55, 0.77, ..., 0.22] (1536 个数字)
"今天吃了一个苹果" → [0.67, 0.23, -0.41, 0.15, ..., 0.89] (1536 个数字)
这串数字不是随机的——它是对文本语义的数学表达。
核心特性:语义相近的文本,向量在空间中也相近。
向量空间的直觉理解
可以把每个向量想象成空间中的一个坐标点(只不过是几百上千维的空间,人类无法直接可视化)。
用二维空间做简化示意:
科技话题区域
●"Apple推出新手机"
●"苹果公司发布iPhone"
●"三星Galaxy上市"
食物话题区域
●"今天吃了苹果"
●"水果沙拉真好吃"
●"超市买了香蕉"
天气话题区域
●"今天天气晴朗"
●"气温25度"
- “苹果公司”和”Apple推出新手机”:距离很近(语义相同)
- “苹果公司”和”今天吃了苹果”:距离很远(虽然都有”苹果”,但语义完全不同)
这就是 Embedding 厉害的地方:它理解的是语义,而不是字面。
相似度怎么计算?
两个向量之间的”距离”最常用余弦相似度来衡量:
余弦相似度 = 1 → 两段文字语义完全一致
余弦相似度 = 0 → 语义完全无关
余弦相似度 = -1 → 语义完全相反
"苹果公司发布新iPhone" vs "Apple推出最新手机" → 余弦相似度 0.94 ✅ 非常相关
"苹果公司发布新iPhone" vs "今天吃了一个苹果" → 余弦相似度 0.21 ❌ 不相关
RAG 里为什么要 Embedding?
RAG 的核心问题是:用户提了一个问题,怎么从几万个文本块里找到最相关的那几个?
有三种思路:
方案一:关键词匹配(传统搜索)
用户问:"手机电池怎么保养?"
关键词匹配结果:
✅ 找到含"手机"和"电池"的文档
❌ 找不到含"移动设备蓄电池维护"的文档 ← 语义相同但关键词不同
❌ 找不到含"smartphone battery care"的文档 ← 跨语言
缺点:只认字面,不认语义。
方案二:让大模型逐一阅读所有文档
把 10 万个文本块都塞给 LLM,让它找相关的...
→ token 成本爆炸(每次查询花费几百元)
→ 速度极慢(每次查询需要几分钟)
→ 完全不可用 ❌
方案三:Embedding + 向量检索(RAG 的做法)✅
离线阶段(一次性):
把所有文本块都转成向量,存入向量数据库
→ 10 万个块 = 10 万个向量,一次算好,永久复用
在线阶段(每次查询):
把用户的问题也转成向量
→ 在向量数据库中找"距离最近"的 Top-K 个向量
→ 返回对应的文本块
→ 速度:毫秒级 ✅ 成本:极低 ✅ 语义理解:强 ✅
Embedding 解决了什么核心问题?
问题:文字无法直接比较”远近”
计算机只认数字,不认文字。你没办法直接让计算机判断”手机电池保养”和”移动设备蓄电池维护”有多相似。
Embedding 的解法:把文字变成数字,再比较数字的距离
"手机电池保养" → 向量A ┐
"移动设备蓄电池维护" → 向量B ┤→ 计算余弦相似度 → 0.91 非常相关!
"今天吃了苹果" → 向量C ┘→ 计算余弦相似度 → 0.08 不相关
文字比较相似度:❌ 计算机不会 向量比较距离:✅ 计算机最擅长
Embedding 就是架在”人类语言”和”计算机数学计算”之间的桥梁。
Embedding 模型是怎么训练出来的?
Embedding 模型是用大量文本对训练的,核心目标是:
- 语义相似的句子 → 向量距离近
- 语义不相关的句子 → 向量距离远
训练数据示例:
正例(语义相似,应该距离近):
("苹果发布新iPhone", "Apple推出最新手机")
("如何退款", "申请退货流程是什么")
负例(语义不相关,应该距离远):
("苹果发布新iPhone", "今天天气很好")
("如何退款", "公司成立于1990年")
训练完成后,模型就学会了把”语义”编码进向量的位置。
常用的 Embedding 模型
| 模型 | 提供方 | 向量维度 | 特点 |
|---|---|---|---|
text-embedding-3-small | OpenAI | 1536维 | 成本低,效果好,最常用 |
text-embedding-3-large | OpenAI | 3072维 | 效果更好,成本更高 |
bge-large-zh | 北京智源 | 1024维 | 中文效果优秀,可本地部署 |
m3e-base | 开源 | 768维 | 中文,轻量,适合资源有限场景 |
jina-embeddings-v3 | Jina AI | 1024维 | 多语言,开源可部署 |
注意:索引时用什么 Embedding 模型,查询时必须用同一个模型,否则向量空间不一致,检索结果会完全乱掉。
一图总结 Embedding 在 RAG 中的位置
【离线索引】
文本块1 ──→ Embedding模型 ──→ 向量1 ──┐
文本块2 ──→ Embedding模型 ──→ 向量2 ──┤──→ 向量数据库
文本块3 ──→ Embedding模型 ──→ 向量3 ──┘
... ↑
同一个模型
【在线查询】
用户问题 ──→ Embedding模型 ──→ 查询向量 ──→ 在向量数据库中
↑ 找距离最近的 Top-K
必须是同一个模型 ──→ 返回相关文本块
──→ 送给 LLM 生成回答
一句话总结
Embedding 把文字变成向量,让计算机能用数学来比较”语义的远近”。 RAG 用它来解决”从海量文档中快速找到语义相关内容”的核心问题——既比关键词搜索更智能,又比让 LLM 读所有文档便宜得多。