Embedding 模型选型指南:中文场景下的开源 Embedding 怎么选
Embedding 模型选型指南:中文场景下的开源 Embedding 怎么选
搭 RAG 系统时,开发者通常花大量时间选 LLM,却很少认真选 Embedding 模型。但 RAG 的效果 70% 取决于检索质量,而检索质量的上限由 Embedding 决定——如果 Embedding 不能把「意思相近的文本」映射到向量空间中相近的位置,再强的 LLM 也救不回来。本文讲清 Embedding 在 RAG 中的角色、中文场景的开源模型选型逻辑、以及怎么用自己的数据实测效果。
30 秒版本
Embedding 把文本转成向量,让语义相近的文本在向量空间中距离相近。选型三要素:中文支持(必须)、维度(影响存储和速度)、模型大小(影响 Embedding 速度)。本地方案用 Ollama 或 Sentence Transformers 加载开源模型;选型不看排行榜,用自己的数据实测。
Embedding 在 RAG 中扮演什么角色
RAG 的流程是:把文档切成片段 → 每个片段用 Embedding 模型转成向量 → 存入向量库。用户提问时,把问题也转成向量,在向量库里找「距离最近」的片段,把这些片段拼进提示词让 LLM 回答。
Embedding 模型的质量决定了「距离最近的片段」是否真的是语义最相关的片段。如果两个意思相同但措辞不同的文本被映射到相距很远的向量位置,检索就会失败——LLM 收到不相关的片段,回答自然不准。
Embedding 和 LLM 是两个独立的模型
Embedding 模型把文本转成固定长度的向量(如 768 维或 1024 维),它不生成文本。LLM 生成文本,它不做向量检索。两者是流水线中不同环节的组件,可以独立选择和替换——这是 RAG 架构灵活性的来源。
中文场景的选型要求
中文 Embedding 的核心挑战是语义理解:中文没有空格分词、一词多义普遍、成语和缩写语义密度高。英文 Embedding 模型直接用在中文上效果通常较差。
选型时的三个硬性要求:
1. 中文训练数据。 模型的训练数据必须包含中文语料,否则它对中文语义的理解不够深。看模型卡上的训练数据描述即可确认。
2. 对称或非对称匹配。 有些 Embedding 模型针对「问题→答案」的非对称检索优化(query 和 document 的处理方式不同),有些针对「文本→文本」的对称匹配优化。RAG 场景通常需要非对称匹配——用户的问题短,文档的片段长。
3. 最大序列长度。 Embedding 模型有最大输入长度限制(如 512 token),超过会被截断。如果文档片段切得比这个长,超出部分的信息会丢失。
主流开源 Embedding 模型
以下是中文场景常用的开源 Embedding 模型家族(以模型卡发布信息为准,本文不引用具体排行榜分数):
| 模型家族 | 维护方 | 特点 |
|---|---|---|
| BGE 系列 | 北京智源(BAAI) | 中文优化,社区使用广泛,多尺寸可选 |
| GTE 系列 | 阿里达摩院 | 多语言支持,长文本版本 |
| Jina Embedding | Jina AI | 多语言,有专门的长文本变体 |
| E5 系列 | 微软研究院 | 多语言,训练方法论文公开 |
| Conan | 上海交通大学等 | 中文 embedding + reranking |
不要只看 MTEB 排行榜
MTEB 是常用的 Embedding 基准测试,但排行榜的测试数据和你的真实场景往往不同。排行榜靠前的模型在你的文档集合上不一定表现最好。排行榜可以用来缩小候选范围,但最终选择必须用自己的数据实测。
本地部署方案
方案一:Ollama Embedding
最简单的方式,如果已经用 Ollama 跑 LLM:
# 拉取一个 Embedding 模型(以 Ollama 实际可用为准)
ollama pull nomic-embed-text
from langchain_community.embeddings import OllamaEmbeddings
embeddings = OllamaEmbeddings(
base_url="http://127.0.0.1:11434",
model="nomic-embed-text",
)
Ollama Embedding 的优势是零额外部署——如果 Ollama 已经在跑 LLM,Embedding 只是多调一个接口。局限是可选模型范围受 Ollama 生态限制,中文专用 Embedding 模型可能不在其中。
方案二:Sentence Transformers
更灵活的方案,可以直接加载 HuggingFace 上的任意 Embedding 模型:
# pip install sentence-transformers
from sentence_transformers import SentenceTransformer
# 加载中文优化的 Embedding 模型(模型名以 HF 实际发布为准)
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")
# 编码文本
texts = ["什么是上下文窗口", "如何选择 Embedding 模型"]
embeddings = model.encode(texts)
print(embeddings.shape) # (2, 1024) — 两个文本,每个 1024 维向量
Sentence Transformers 的优势是模型选择完全自由——HuggingFace 上的所有 Embedding 模型都能加载,包括最新的中文优化版本。
方案三:云端 API
如果不想管理本地 Embedding 模型,云端 API 是最省心的选择,按调用量计费:
# 以实际平台的 Embedding API 为准
# EXAIV 的 Embedding 可用性以 /models 目录实时为准
用自己的数据实测
这是选型最重要的一步。方法:
1. 准备测试集。 从你的真实文档中挑 20-50 个片段,为每个片段手写 2-3 个用户可能会问的问题。
2. 跑检索测试。 把所有片段用候选 Embedding 模型编码入库,然后用测试问题做检索,看「是否检索到了正确的片段」。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")
# 你的文档片段
chunks = ["片段1的内容...", "片段2的内容...", "..."]
chunk_embeddings = model.encode(chunks)
# 测试问题
query = "用户可能问的问题"
query_embedding = model.encode([query])
# 找最相似的片段
import numpy as np
similarities = np.dot(query_embedding, chunk_embeddings.T)[0]
top_3 = np.argsort(similarities)[-3:][::-1]
print("最相关的 3 个片段索引:", top_3)
3. 对比多个模型。 用同一组测试数据跑不同的 Embedding 模型,比较检索命中率。命中率高且稳定的模型就是你的选择。
用自己的数据,不是公开数据集
公开数据集(如 MTEB)的测试数据和你的真实文档在领域、格式、语言风格上可能完全不同。在公开数据集上表现最好的模型,换到你的领域可能表现平庸。实测是唯一可靠的选型方法。
维度与速度的取舍
Embedding 向量的维度影响存储和检索速度:
| 维度 | 存储开销(百万片段) | 检索速度 | 精度 |
|---|---|---|---|
| 384 | ~1.5GB | 最快 | 较低 |
| 768 | ~3GB | 快 | 良好 |
| 1024 | ~4GB | 中等 | 较好 |
| 1536 | ~6GB | 较慢 | 好 |
多数场景 768 或 1024 维就够用了。如果文档量不大(百万以下),维度对速度的影响可以忽略,优先选精度更好的高维模型。
常见误区
误区一:Embedding 模型越大越好。 不一定。大 Embedding 模型精度更高但速度更慢,对百万级文档的批量编码会很耗时。选择标准是「在你的数据上检索命中率够高」且「编码速度可接受」。
误区二:换 LLM 不需要换 Embedding。 如果换了 LLM 但检索没变,回答质量的上限仍然由检索决定。LLM 和 Embedding 是独立的两个组件,升级一个不代表另一个也升级了。
误区三:中文场景用英文 Embedding 就够了。 英文 Embedding 模型对中文语义的理解不如中文优化的模型。这不是「能不能用」的问题,而是「效果差多少」的问题——在语义检索任务上差距可能很大。
误区四:一旦选定就不需要重新评估。 Embedding 模型也在持续迭代。如果你的 RAG 系统运行了几个月后检索质量下降,可能不是 LLM 的问题,而是新文档的类型超出了当前 Embedding 模型的能力范围。
FAQ
Embedding 模型和 LLM 用同一个可以吗?
中文 RAG 必须用中文专用的 Embedding 吗?
BGE 和 GTE 怎么选?
Embedding 模型的最大序列长度不够怎么办?
Embedding 模型可以微调吗?
价格在哪里看?
相关阅读
- RAG 知识库搭建实战 — Embedding 的应用场景
- Qwen GGUF 本地部署入门 — 本地 LLM 部署
- 本地算力硬件选购指南 — 硬件规划
- LangChain 接入 EXAIV — LangChain 完整接入
- 定价 — 云端方案实时价格