Embedding 深度解析
模型选型
| 模型 | 维度 | 语言 | 部署方式 | 适用场景 |
|---|---|---|---|---|
| BGE-large-zh | 1024 | 中文优 | 本地/API | 中文 RAG、知识库 |
| M3-embedding | 1024 | 100+ | 本地/API | 多语言、多粒度 |
| text-embedding-3 | 1536+ | 多语言 | 云端 API | 通用、易集成 |
| E5-large | 1024 | 多语言 | 本地 | 开源、高性价比 |
| GTE | 1024 | 多语言 | 本地 | 综合性能好 |
维度选择
- 768:轻量、省资源,适合简单场景
- 1024:常用,在质量与成本间平衡
- 1536+:OpenAI 等,表达力强,成本较高
选择时需与向量数据库支持的维度一致。
归一化
多数检索场景使用余弦相似度或点积(归一化后等价)。模型输出是否已归一化因模型而异,BGE 等需在提示词中加 Represent this sentence for retrieval: 以提升效果。
BGE 实践
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")
# 查询向量:加指令
query_embedding = model.encode("Represent this sentence for retrieval: 什么是RAG")
# 文档向量:可不加
doc_embedding = model.encode("RAG是检索增强生成...")
M3 实践
M3 支持多粒度(passage、sentence、word),适合长文档与多语言场景。可通过 Hugging Face 或官方 API 使用。
与 RAG 的闭环
Embedding 质量直接影响 RAG 检索效果:
- 选型:按语言、数据规模、成本选择
- 一致性:索引与查询使用同一模型
- 指令:对 BGE 等加检索指令可提升效果
- 评估:用 MTEB、自定义测试集评估
与向量数据库的配合
- 向量库存储 Embedding 结果,维度需一致
- 索引类型(IVF、HNSW 等)影响检索速度与精度
- 参考 向量数据库
评估与选型
MTEB 与自定义评估
- MTEB(Massive Text Embedding Benchmark):多任务评估,包含检索、聚类、分类等
- 自定义测试集:在业务数据上构建 query-doc 对,计算 Recall@K、MRR
- 与 RAG 效果挂钩:检索质量直接影响 RAG 回答,建议将 RAG 端到端效果作为最终指标
分块策略对 Embedding 的影响
- 块大小:太小丢失上下文,太大噪声多、检索精度下降。常用 256–512 tokens 或 128–256 字符
- 重叠(Overlap):相邻块重叠 10–20% 可避免语义断裂
- 检索粒度:按块检索后,可扩展上下文(前后块)再送入 LLM
多向量与 ColBERT
- 多向量:同一文档生成多个向量(如按句、按段),检索时融合
- ColBERT:Token 级向量,匹配更精细,适合高精度场景,但存储与计算成本更高
总结
Embedding 是 RAG 与语义检索的基石。合理选型、正确使用归一化与指令,可显著提升检索质量,进而提升 RAG 整体效果。结合 MTEB 与业务评估、优化分块策略,可系统提升 RAG 链路效果。