RAG系统 进阶 RAG Embedding 向量化 模型选型

Embedding模型选型:从text-embedding-3到开源模型全面对比

AIEng Hub
阅读约 25 分钟

引言

Embedding 模型是 RAG 系统的核心组件之一——它将文本转换为向量表示,决定了检索阶段能否找到最相关的内容。选错 Embedding 模型,后续的检索优化再努力也事倍功半。

用户查询 → Embedding模型 → 查询向量 → 向量检索 → 相关文档

                    Embedding质量决定检索天花板

本文将全面对比主流 Embedding 模型,帮助你在不同场景下做出最优选择。

一、什么是 Embedding 模型?

Embedding 模型将文本映射到高维向量空间,使得语义相似的内容在向量空间中的距离更近。

from openai import OpenAI

client = OpenAI()
response = client.embeddings.create(
    model="text-embedding-3-small",
    input="RAG系统的核心组件"
)
embedding = response.data[0].embedding
# 输出: [0.0123, -0.0456, ..., 0.0789]  (1536维)

核心特性

特性说明
维度(Dimensions)向量的长度,越高越精确但存储/计算成本也越高
上下文长度模型一次能编码的最大 token 数
语言支持是否支持中文、多语言
归一化输出向量是否为单位向量(影响相似度计算方式)

二、主流 Embedding 模型对比

2.1 商业模型

模型提供商维度最大输入语言价格(/1M tokens)MTEB
text-embedding-3-largeOpenAI30728191多语言$0.1364.6
text-embedding-3-smallOpenAI15368191多语言$0.0262.3
text-embedding-ada-002OpenAI15368191多语言$0.1061.0
embed-english-v3.0Cohere1024512英语$0.1064.5
embed-multilingual-v3.0Cohere1024512多语言$0.1065.0
voyage-2VoyageAI15364096多语言$0.1064.1
voyage-large-2-instructVoyageAI153616000多语言$0.1265.3

2.2 开源模型

模型维度最大输入语言模型大小MTEB
BAAI/bge-large-zh-v1.51024512中文优化1.3GB64.0
BAAI/bge-large-en-v1.51024512英文1.3GB64.2
intfloat/multilingual-e5-large1024512多语言2.2GB65.0
Alibaba-NLP/gte-large-zh1024512中文优化1.3GB63.8
hkunlp/instructor-xl2048512英文4.5GB64.7
sentence-transformers/all-mpnet-base-v2768384英文420MB61.6

2.3 中文优化模型

对于中文场景,以下模型经过了针对性优化:

模型维度说明适用场景
BAAI/bge-large-zh-v1.51024中文检索最佳选择之一通用中文文档检索
Alibaba-NLP/gte-large-zh1024阿里出品,中文效果好电商、企业文档
shibing624/text2vec-base-chinese768轻量级中文Embedding资源受限环境
moka-ai/m3e-base768中等规模中文模型综合场景平衡

三、维度与性能的权衡

3.1 维度影响

维度存储空间(100万文档)检索速度精度
384~1.5 GB极快较低
768~3 GB中等
1024~4 GB中等较高
1536~6 GB中等
3072~12 GB较慢最高

3.2 维度压缩

OpenAI text-embedding-3 系列支持输出维度压缩:

# 将 3072 维压缩为 256 维
response = client.embeddings.create(
    model="text-embedding-3-large",
    input="需要索引的文本内容",
    dimensions=256  # 关键参数!
)

压缩效果:

  • 3072→1024:精度损失约 0.5%
  • 3072→512:精度损失约 1.5%
  • 3072→256:精度损失约 3-5%

四、MTEB 基准解读

MTEB(Massive Text Embedding Benchmark)是当前最权威的 Embedding 评估基准,涵盖 8 个任务类型:

任务类别说明评估指标
分类(Classification)文本分类准确率Accuracy / F1
聚类(Clustering)文本聚类质量V-Measure
配对分类(Pair Classification)判断文本对相似度Accuracy / F1
重排序(Reranking)重排序准确率MAP / MRR
检索(Retrieval)检索召回率NDCG@10 / Recall@100
STS(语义相似度)句子对相似度打分Spearman
摘要(Summarization)摘要与原文相似度Spearman
排序(Ranking)文本排序质量Spearman

注意: MTEB 分数高并不一定代表在你的特定场景上表现好。建议:

  1. 用 MTEB 做初步筛选
  2. 用自己的数据做二次验证
  3. 关注 Retrieval 子分数而非总分

五、模型选型决策框架

你的场景是什么?

    ├── 仅有英文 → Cohere embed-english-v3.0 或 bge-large-en-v1.5

    ├── 多语言/中文
    │   ├── 预算充足 → text-embedding-3-large 或 voyage-large-2
    │   ├── 自托管可行 → bge-large-zh-v1.5 或 multilingual-e5-large
    │   └── 资源受限 → m3e-base 或 text2vec-base-chinese

    └── 特殊场景
        ├── 长文档(>512 tokens) → voyage-large-2-instruct(16K上下文)
        ├── 代码检索 → code-search-* 或 instructor-xlm
        ├── 高吞吐低延迟 → text-embedding-3-small(最快+最便宜)
        └── 最高精度 → text-embedding-3-large 或 voyage-large-2

代码示例:使用 HuggingFace 开源模型

from sentence_transformers import SentenceTransformer
import torch

# 加载中文模型
model = SentenceTransformer(
    'BAAI/bge-large-zh-v1.5',
    device='cuda' if torch.cuda.is_available() else 'cpu'
)

# BGE 模型需要添加指令前缀
queries = ['查询:RAG系统的工作原理']
passages = ['文档:RAG通过检索外部知识...']

# 编码
query_embeddings = model.encode(
    queries,
    normalize_embeddings=True,
    show_progress_bar=True
)

passage_embeddings = model.encode(
    passages,
    normalize_embeddings=True,
    show_progress_bar=True
)

# 计算相似度
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity(query_embeddings, passage_embeddings)
print(f"相似度: {similarity[0][0]:.4f}")

代码示例:使用 Cohere API

import cohere

co = cohere.Client("your-api-key")

# 编码
response = co.embed(
    texts=["RAG系统的核心是检索与生成的结合"],
    model="embed-multilingual-v3.0",
    input_type="search_document"
)

embeddings = response.embeddings
print(f"维度: {len(embeddings[0])}")

六、中文场景特别考量

6.1 分词差异

中文没有空格分隔,Embedding 模型对中文的 tokenization 处理差异很大:

模型中文 token 化方式中文字数/token
OpenAI text-embedding-3BPE(字节对编码)~1.5 字/token
bge-large-zh-v1.5WordPiece~2 字/token
multilingual-e5SentencePiece~1.8 字/token

6.2 实际测试建议

# 在自己的数据上测试模型效果
def evaluate_retrieval(
    model_name: str,
    queries: list[str],
    relevant_docs: list[list[int]],
    candidates: list[str]
) -> float:
    model = SentenceTransformer(model_name)
    q_emb = model.encode(queries, normalize_embeddings=True)
    c_emb = model.encode(candidates, normalize_embeddings=True)

    hits = 0
    for i, q in enumerate(queries):
        scores = cosine_similarity([q_emb[i]], c_emb)[0]
        top_k = scores.argsort()[-3:][::-1]
        if any(doc in top_k for doc in relevant_docs[i]):
            hits += 1

    return hits / len(queries)

七、最佳实践总结

场景推荐模型原因
快速原型text-embedding-3-small最便宜,速度快,效果好
中文生产环境bge-large-zh-v1.5免费自托管,中文最优之一
多语言生产multilingual-e5-large多语言支持最好
最高精度voyage-large-2-instructMTEB 最高分,支持指令
数据隐私敏感bge-large-zh-v1.5完全本地部署

关键原则:

  1. 在自己数据上测试 — MTEB 分数只是参考
  2. 维度不是越高越好 — 平衡精度、存储、速度
  3. 考虑总成本 — API 调用的长期费用 vs 自托管的维护成本
  4. 留意输入长度限制 — 确保文档分块适配模型的上下文窗口

相关资源: