中文 RAG 系统 Embedding 模型选型技术文档
文档信息
| 项目 | 内容 |
|---|---|
| 文档版本 | v3.0 |
| 创建日期 | 2025-06-10 |
| 更新日期 | 2025-11-01 |
| 适用场景 | 中文检索增强生成(RAG)系统 |
| 技术领域 | 信息检索、表示学习、向量数据库 |
1. 选型背景
1.1 核心问题
在 RAG 流水线中,Embedding 决定了召回的上限:文档向量化时丢失的语义信息,后续的 rerank、prompt engineering 都无法补救。选型的失误会体现为——用户查询命中不了相关 chunk、相关 chunk 排在十名开外、长文档被截断导致关键段落丢失。
1.2 关键权衡
中文场景的选型本质是在三个维度上做妥协:
- 质量:在真实业务语料上的
ndcg@10/recall@k表现 - 成本:单次推理延迟、显存占用、TCO
- 覆盖:最大序列长度、跨语言能力、跨领域泛化
没有一个模型能同时最优——BGE-M3 质量好但 568M 参数推理慢,text2vec-base-chinese 轻但最大 512 token,闭源 API 开箱即用但数据出境且长期价格不可控。
1.3 选型目标
产出一套可落地的决策依据:给定业务规模、预算、质量要求,能明确指向一个候选模型;并给出后续调优(微调、rerank、混合检索)的升级路径。
2. 评估维度
2.1 指标体系与权重
| 维度 | 权重 | 评估口径 |
|---|---|---|
| 中文适配性 | 30% | C-MTEB 综合得分、领域数据覆盖、tokenizer 友好度 |
| 语义表达能力 | 30% | 向量维度、长文本处理、查询-文档非对称性 |
| 开源可控性 | 10% | 许可协议、是否支持本地化、社区活跃度 |
| 推理性能 | 15% | 单卡 QPS、P99 延迟、显存占用 |
| 部署成本 | 10% | 硬件门槛、运维复杂度、是否可量化/蒸馏 |
| 生态成熟度 | 5% | 推理框架支持、向量库适配、微调工具链 |
权重按业务调整:强合规场景可把开源可控性提至 20%;API 驱动的原型阶段可把部署成本降至 5%。
2.2 C-MTEB 基准解读
C-MTEB 由 BAAI 维护,覆盖 35 个中文数据集、6 类任务:
| 任务类型 | 数据集示例 | 核心指标 | RAG 相关性 |
|---|---|---|---|
| Retrieval | T2Retrieval、MMarcoRetrieval、CmedQA | ndcg@10 | ★★★★★ 直接对应 RAG |
| Reranking | T2Reranking、MMarcoReranking | MAP | ★★★★☆ rerank 阶段 |
| STS | ATEC、BQ、STS-B | Spearman | ★★★☆☆ 近义匹配 |
| Pair-Class. | Cmnli、Ocnli | AP | ★★☆☆☆ 蕴含判断 |
| Clustering | CLSClusteringS2S | V-measure | ★★☆☆☆ 文档聚类 |
| Classification | TNews、IFlyTek | Accuracy | ★☆☆☆☆ 参考价值低 |
常见误区:直接看 C-MTEB 总榜做决策而忽略任务分布。开放域问答应重点看 Retrieval 子榜,同义句改写应重点看 STS。动态榜单以 MTEB Leaderboard 的 zh 标签页为准。
2.3 业务场景试金石
仅看 C-MTEB 不够,真实落地前必须在自有数据上跑三组对照:
- 领域外术语:行业黑话、产品代号、专有名词——检验 tokenizer 是否整词切分还是切成碎片
- 长文档首段偏置:截断 512 / 1024 / 8192 token 时召回率的下降幅度
- 查询-文档长度非对称:短 query(10–30 token)对长 doc(几百 token)的匹配能力,是 RAG 的主战场
3. 候选模型
3.1 主流国产 Dense 模型
3.1.1 BGE 系列(BAAI)
- 开源协议:MIT
- 代码仓库:FlagEmbedding
- 家族谱系:v1.5(2023-09)→ M3(2024-01)→ ICL(2024-09)→ VL(多模态)
| 模型 | 参数量 | 向量维度 | 最大长度 | 关键能力 |
|---|---|---|---|---|
| bge-m3 | 568M | 1024 | 8192 | 三路输出(dense + sparse + multi-vector) |
| bge-large-zh-v1.5 | 326M | 1024 | 512 | 生产首选,稳定性经过广泛验证 |
| bge-base-zh-v1.5 | 102M | 768 | 512 | 性价比最高 |
| bge-small-zh-v1.5 | 24M | 384 | 512 | CPU / 边缘可跑 |
选型要点:
- 绝大多数中文 RAG 场景下,bge-large-zh-v1.5 是风险最小的默认值
- 需要长文档(>512 token)或多语言——选 bge-m3,并启用 sparse 分量做混合检索
- 小模型 bge-small 适合 MVP 或嵌入式部署
3.1.2 Qwen3-Embedding(阿里)
- 发布:2025 年中
- 协议:Apache 2.0
- 规格:0.6B / 4B / 8B 三档(向量维度分别 1024 / 2560 / 4096,支持 MRL)
继承 Qwen3 基座的多语言能力,8B 版本在 MTEB 多语言榜单上一度登顶。中文任务上 0.6B 版本即可达到 BGE-large 水准,4B 起在长文本和跨语言上有明显优势。适合已有 Qwen 技术栈、追求 SOTA 的团队,代价是推理成本线性增长。
3.1.3 Conan-Embedding(腾讯 BAC)
- 协议:CC BY-NC 4.0(仅限非商业使用)
- 来源:腾讯业务安全与内容合规部(TencentBAC),模型卡
TencentBAC/Conan-embedding-v1 - 特点:通过 Cross-Lingual Hard Negative Mining 和迭代 hard negative 策略,在 C-MTEB Retrieval 子榜长期保持前列
⚠ 当前许可证为 CC BY-NC 4.0,禁止商用。仅适合研究 / 评测 / 内部原型。商业落地应选 BGE / gte-Qwen2 / Qwen3-Embedding 等 Apache-2.0 或 MIT 模型。
3.1.4 gte-Qwen2(阿里达摩院)
- 基座:Qwen2-1.5B / 7B
- 协议:Apache 2.0
基于通用 LLM 做对比学习适配,自然语言理解能力强,适合语义复杂的法律、医疗长文本场景。代价是推理成本显著高于传统 encoder-only 模型。
3.2 轻量级国产模型
3.2.1 text2vec(shibing624)
- 协议:MIT
- 代表:text2vec-large-chinese(330M / 1024d / 512 token)、text2vec-base-chinese(110M / 768d / 512 token)
基于 CoSENT 训练的 SBERT 风格模型,部署门槛低、推理快。生态以个人项目为主,企业级支持有限;Retrieval 任务上整体落后 BGE 3–5 个百分点。
3.2.2 M3E(MokaAI)
- 协议:MIT
- 特色:multi-domain 数据混合训练,泛化均衡
训练语料覆盖电商、新闻、百科、法律等多领域;自 2024 年起更新节奏放缓,被 BGE / Qwen3 赶超。新项目不再推荐作为首选,仅作为存量迁移对照基线。
3.3 闭源 API 服务
| 供应商 | 模型 | 向量维度 | 中文质量 | 单价(每百万 token) |
|---|---|---|---|---|
| OpenAI | text-embedding-3-large | 3072(支持 MRL 裁剪) | ★★★★☆ | $0.13 |
| OpenAI | text-embedding-3-small | 1536(支持 MRL 裁剪) | ★★★☆☆ | $0.02 |
| Cohere | embed-multilingual-v3 | 1024 | ★★★★☆ | ~$0.10 |
| Jina | jina-embeddings-v3 | 1024(MRL) | ★★★★☆ | ~$0.02–0.05(以官网最新报价为准) |
| NVIDIA | NV-Embed-v2 | 4096 | ★★★☆☆ | 自托管 |
闭源 API 的两大风险:数据出境合规、长期价格不可控。企业生产环境优先考虑开源自托管;闭源 API 更适合原型验证和跨境业务。
3.4 模型能力矩阵(总览)
| 模型 | 参数 | 维度 | 最大 token | MRL | 稀疏输出 | 多语言 | 定位 |
|---|---|---|---|---|---|---|---|
| bge-large-zh-v1.5 | 326M | 1024 | 512 | ✗ | ✗ | 弱 | 生产首选 |
| bge-m3 | 568M | 1024 | 8192 | ✗ | ✓ | 强 | 长文本 |
| Qwen3-Embedding-4B | 4B | 2560 | 32K | ✓ | ✗ | 强 | SOTA 场景 |
| gte-Qwen2-1.5B | 1.5B | 1536 | 32K | ✓ | ✗ | 中 | 语义复杂 |
| text2vec-base-chinese | 110M | 768 | 512 | ✗ | ✗ | 弱 | 轻量原型 |
| m3e-base | 110M | 768 | 512 | ✗ | ✗ | 弱 | 存量兼容 |
| text-embedding-3-large | API | 3072 | 8191 | ✓ | ✗ | 强 | 原型验证 |
4. 进阶:从单模型到检索系统
Embedding 选型不是终点。真正能把召回率从 80% 推到 95%+ 的,是以下四组组合拳。
4.1 混合检索(Dense + Sparse)
纯向量检索对精确术语(产品型号、数字、专名)失效,纯 BM25 对语义改写失效。主流实践是两路并行 + RRF(Reciprocal Rank Fusion)融合:
query
├── dense 通路:BGE 编码 → Milvus/Qdrant ANN → top-k1
└── sparse 通路:BM25(或 bge-m3 的 sparse 输出)→ Elasticsearch → top-k2
└── RRF 融合 → top-k
BGE-M3 的独特价值:单模型同时输出 dense / sparse / multi-vector(ColBERT 风格)三路,避免维护两个独立索引。
4.2 Matryoshka 表示学习(MRL)
MRL 训练时对 [d/2]、[d/4]、[d/8] 等截断后的向量也施加对比损失,使得截断后的向量仍然可用。工程价值:
- 索引统一存 3072d,查询时截断到 768d 做粗排,再用完整向量精排
- 冷数据压缩到 256d 存储,存储成本下降 12×
- 当前支持:text-embedding-3 系列、Jina v3、Qwen3-Embedding、gte-Qwen2
4.3 Embedding 与 Rerank 的分工
Embedding 是双塔(bi-encoder)——编码快但精度有限;Rerank 是交叉编码器(cross-encoder)——精度高但只能对候选做精排。典型流水线:
top-100 召回(bge-large,双塔,毫秒级)
→ top-20 精排(bge-reranker-v2-m3 或 Cohere Rerank v3,交叉编码器)
→ top-5 送入 LLM
常见误区是「换更大 Embedding 模型」来提升质量,收益曲线很快饱和;加一层 rerank 往往能带来 5–10 个点的 ndcg 提升,成本收益比远高于升级基础 Embedding。
4.4 领域微调
通用 Embedding 在垂直领域黑话(医疗术语、法条引用、金融专名)上召回率会显著下降。微调方式按成本递增:
- LoRA + 硬负样本挖掘:少量 GPU 时,挖掘 BM25 排名 5–20 的文档作为 hard negative
- 全参数精调:需要 10 万量级标注对,配 InfoNCE 或 CoSENT 损失
- 检索-生成联合训练(RAG-specific):把 LLM 的下游反馈信号回传到 Embedding(RAG-end2end)
4.5 量化与推理优化
| 优化手段 | 召回率损失 | 吞吐收益 | 实施难度 |
|---|---|---|---|
| FP16 | <0.1% | 1.5–2× | ★ 默认开启 |
| INT8(动态量化) | 0.5–1.5% | 2–3× | ★★ |
| INT4(GPTQ/AWQ) | 2–5% | 3–4× | ★★★ |
| ONNX + TensorRT | 可忽略 | 2–5× | ★★★ |
| 蒸馏到小模型 | 3–8% | 5–10× | ★★★★ |
生产建议:FP16 无脑开;INT8 需在自有验证集上跑前后对比;INT4 仅在严格成本约束下启用。蒸馏适合 QPS 极高的场景,需要独立的训练 pipeline。
5. 基准测试
5.1 测试条件与可复现性声明
以下数据在 NVIDIA A100 40GB / CUDA 12.1 / PyTorch 2.3 / batch=32 / seq_len=128 / FP16 条件下测得。实际性能受硬件代际、批大小、序列长度分布、并发数影响显著,请在目标环境重跑。C-MTEB 分数以 MTEB Leaderboard 的 zh 标签页为准。
5.2 效果基准(C-MTEB 中文 Retrieval 子榜)
| 模型 | C-MTEB 综合 | Retrieval 子榜 ndcg@10 |
|---|---|---|
| Qwen3-Embedding-8B | 73+ | 77+ |
| Conan-Embedding-v1 | 72+ | 76+ |
| bge-m3 | 71.4 | 73.9 |
| bge-large-zh-v1.5 | 68.6 | 71.5 |
| bge-base-zh-v1.5 | 67.5 | 70.2 |
| text2vec-large-chinese | 65.2 | 68.1 |
| m3e-base | 61.5 | 64.3 |
数字随榜单更新会变化,相对排序比绝对数字更值得参考。
5.3 推理性能基准
| 模型 | QPS(A100,FP16) | 显存占用 | 单条向量存储(float32) |
|---|---|---|---|
| bge-m3 | ~800 | 3.2 GB | 4.0 KB |
| bge-large-zh-v1.5 | ~1,200 | 2.1 GB | 4.0 KB |
| bge-base-zh-v1.5 | ~2,800 | 0.8 GB | 3.0 KB |
| text2vec-base-chinese | ~3,200 | 0.6 GB | 3.0 KB |
| Qwen3-Embedding-0.6B | ~1,500 | 1.4 GB | 10.0 KB(2560d) |
存储成本推导:
float32 × 维度 / 1024;启用 INT8 量化后再缩小 4×;MRL 截断按比例缩小。
6. 选型决策
6.1 决策矩阵(数据驱动)
| 模型 | 中文质量(30%) | 语义能力(30%) | 开源可控(10%) | 推理性能(15%) | 部署成本(10%) | 生态(5%) | 综合 |
|---|---|---|---|---|---|---|---|
| bge-large-zh-v1.5 | A(68.6) | A(1024 / 512) | A(MIT) | A(1200 QPS) | B(需 GPU) | A | A |
| bge-m3 | A+(71.4) | A+(8192 / 三路) | A | B(800 QPS) | C(高显存) | A | A |
| Qwen3-Embedding-4B | A+(72+) | A+(32K + MRL) | A | C(4B 参数) | C(需高端 GPU) | B | A- |
| bge-base-zh-v1.5 | B+(67.5) | B+(768 / 512) | A | A+(2800 QPS) | A(中端 GPU) | A | A- |
| text2vec-base-chinese | B(63.8) | B(768 / 512) | A | A+(3200 QPS) | A+(CPU 可跑) | B | B+ |
| text-embedding-3-large | A(API 稳定) | A(3072 + MRL) | D(闭源+出境) | N/A | B(按量付费) | A | B |
| m3e-base | B-(61.5) | B(768 / 512) | A | A(3500 QPS) | A+ | C | C+ |
综合评级原则:中文质量 < 60 直接降一档;开源性为 D 的额外扣一档;推理 QPS < 500 扣一档。
6.2 场景化选型
| 业务场景 | 推荐模型 | 核心理由 |
|---|---|---|
| 生产级通用 RAG(默认首选) | bge-large-zh-v1.5 | 质量-成本-生态三角平衡最优 |
| 长文档 / 多语言 / 混合检索 | bge-m3 | 8K 长度 + dense/sparse/multi-vec |
| 追求 SOTA 质量,预算充裕 | Qwen3-Embedding-4B / 8B | 2025 年开源第一梯队 |
| 成本敏感 / 边缘侧部署 | bge-small-zh-v1.5 / text2vec-base-chinese | CPU 可跑,量化后可 INT8 |
| 原型验证 / 数据合规宽松 | text-embedding-3-small | 无须运维,MRL 支持降维 |
| 已有 Qwen 技术栈 | gte-Qwen2-1.5B / Qwen3 | 复用 LLM 基建,推理栈共享 |
| 垂直领域(医疗 / 法律 / 金融) | bge-large + LoRA 微调 | 通用模型 + 领域 hard-negative 微调 |
6.3 决策树
是否允许数据出境 / 闭源依赖?
├── 否(企业主流)
│ ├── 单次查询 ≤ 512 token?
│ │ ├── 是
│ │ │ ├── 预算充裕 + 追求 SOTA → Qwen3-Embedding-4B
│ │ │ └── 否 → bge-large-zh-v1.5 ★ 最常见落点
│ │ └── 否(长文档 / 多语言)→ bge-m3
│ └── 需要 CPU / 边缘部署 → text2vec-base-chinese 或 bge-small-zh-v1.5
└── 是(数据出境 OK / 跨境业务)
└── text-embedding-3-large / Cohere v3 / Jina v3
7. 部署实施
7.1 参考架构
┌─────────────────────────────────────────────────┐
│ 应用层(RAG Orchestrator / LangChain / LlamaIndex)│
└──────────────────┬──────────────────────────────┘
│
┌──────────┴──────────┐
│ │
┌───────▼────────┐ ┌────────▼─────────┐
│ Embedding 服务 │ │ Reranker 服务 │
│(FastAPI+TEI) │ │(bge-reranker) │
└───────┬────────┘ └──────────────────┘
│
┌───────▼─────────────────────────────────┐
│ 向量库(Milvus / Qdrant / Weaviate) │
│ ├── dense 索引(HNSW / IVF-PQ) │
│ └── sparse 索引(BM25 / SPLADE) │
└─────────────────────────────────────────┘
推荐推理框架:Text Embeddings Inference (TEI) —— Rust 实现,支持 ONNX / FP16 / Flash Attention / 动态 batch 合并,实测相对朴素 Transformers Python 推理通常可达 2–3× 加速(具体倍数依赖模型大小、batch、硬件,需自行基准)。
7.2 硬件规划参考
| 文档规模 | 最小配置 | 推荐配置 |
|---|---|---|
| <100 万 | RTX 4090 + 32 GB RAM | A100 40GB |
| 100 万–1000 万 | A100 40GB × 1 + 64 GB RAM | A100 80GB × 2 |
| >1000 万 | A100 80GB × N + 128 GB+ RAM | H100 × N + 10G 内网 |
上表针对在线 embedding 推理;离线构建索引可以用更低配额 + 更长时间完成。
7.3 关键监控指标
- 性能:P95/P99 推理延迟、QPS、batch 命中率
- 质量:召回率@k、ndcg@10、用户点击率、「零召回率」日志
- 资源:GPU 利用率、显存、P99 队列长度
- 稳定性:错误率、模型版本漂移告警、向量库一致性
7.4 常见性能陷阱
- padding 浪费:变长序列不做 sorted-batch,长序列拖累整批——TEI 默认解决
- 冷启动:首次加载模型权重 >10s,生产必须 warm-up
- 向量库参数失配:HNSW 的
efConstruction过小导致召回断崖,典型值 200–400 - 归一化遗漏:余弦相似度前必须 L2-normalize;许多模型输出已归一化,重复归一化无害,但忘做会造成灾难
- 版本混用:训练期和推理期使用不同 tokenizer 版本,向量空间漂移不可感知
8. 风险与规避
| 风险类别 | 具体表现 | 规避策略 |
|---|---|---|
| 模型漂移 | 升级新版本导致线上指标下降 | A/B 灰度 + 版本化索引 + 可回滚 |
| 领域外效果差 | 垂直术语召回率骤降 | 准备领域评测集 + LoRA 微调路径 |
| 成本失控 | 调用量猛增导致 GPU 池打满 | 自动扩缩容 + 缓存热点查询向量 + 量化降档 |
| 数据合规 | 使用闭源 API 导致敏感数据出境 | 本地化部署 + 敏感字段预处理脱敏 |
| 向量库耦合 | 维度 / 距离度量变更引发全库重建 | 索引设计预留迁移窗口 + 双写过渡期 |
9. 参考资料
9.1 基准与榜单
- MTEB Leaderboard(动态更新)
- C-MTEB 仓库
9.2 模型与论文
- BGE 系列 / FlagEmbedding
- BGE-M3 论文(2024)
- Qwen3 技术报告
- text2vec
- M3E / uniem
- Matryoshka Representation Learning(2022)
- MTEB: Massive Text Embedding Benchmark(2022)
- Sentence-BERT(2019)