RAG应用选择最佳Embedding模型完整指南
首先,需要明确一个关键问题:在 RAG 应用中,Embedding 模型扮演着“翻译官”的角色,它将文本、图像等数据对象转化为数值向量,从而让机器能够理解语义。然而,面对市面上众多模型,如何挑选出最适合的那一个?答案非常直接:取决于你的具体业务场景和实际需求。接下来,我们将一步步深入分析这一过程。
首先,需要明确一个关键问题:在 RAG 应用中,Embedding 模型扮演着“翻译官”的角色,它将文本、图像等数据对象转化为数值向量,从而让机器能够理解语义。然而,面对市面上众多模型,如何挑选出最适合的那一个?答案非常直接:取决于你的具体业务场景和实际需求。接下来,我们将一步步深入分析这一过程。
01. 确定具体用例
在着手选择模型之前,先理清以下几个问题:
- 通用模型能否满足我的需求?
- 或者,是否存在特殊诉求?比如数据处理上是否只涉及文本、图片这类单一模态,还是需要多模态?另外,数据是否集中在某个特定领域,例如法律、医学这类专业性极强的场景。
坦诚而言,大多数情况下,针对你所需要的模态,选择一个通用模型就已足够。不必一开始就把问题复杂化。
02. 选择通用模型
那么,通用模型该如何挑选?HuggingFace 上的 MTEB 排行榜是一个不错的参考入口。该榜单列出了市面上各类开源和专有文本 Embedding 模型,每个模型都附带参数规模、内存占用、向量维度、最大 token 数等硬性指标,以及在检索、摘要等任务上的具体得分。
在为 RAG 应用选择模型时,需要重点关注以下几个维度:
任务:MTEB 排行榜顶部提供了多种任务选项卡。由于 RAG 的核心是检索(Retrieval),直接点击该标签即可。
语言:必须与你的数据集语言完全对齐,这一点无需赘述。
得分:它反映了模型在特定基准上的表现。不同任务采用的评估指标不同,但总体范围都在 0 到 1 之间,分数越高越好。
模型规模与内存:这是一个硬性约束。模型越大,检索性能通常越好,但延迟也会更高。而且,有时大模型可能出现过拟合,在生产环境中表现反而不如小模型。一个务实的做法是:先用一个轻量级的小模型快速搭建 RAG 原型,待整套流程跑通后,再更换更大、性能更强的模型进行精调。
向量维度:维度越长,理论上能捕获的数据细节越丰富。但真的有必要将文档数据用 8192 维来表示吗?大概率不需要。相反,维度小一些,推理速度更快,存储也更节省。关键在于信息捕获与运行效率之间找到平衡点。
最大 token 数量:对于多数 RAG 场景来说,将分块粒度控制在单个段落即可,512 token 的模型基本能满足需求。只有在处理超长文本的特殊场景时,才需要 token 数量更大的模型。
03. 在 RAG 应用中评估模型
MTEB 排行榜的参考价值很大,但需要谨慎使用。因为那些结果是由模型方自行报告的,不排除有些模型将 MTEB 数据集纳入训练数据,导致分数虚高。更关键的是,基准数据集与你的真实业务数据往往存在偏差。因此,最终判断必须基于你自己的数据进行评估。
3.1 数据集
从 RAG 应用的数据中,抽取一小部分制作成标注好的数据集。例如下面这个示例:
| Language | Description |
|---|---|
| C/C++ | A general-purpose programming language known for its performance and efficiency... |
| Java | A versatile, object-oriented programming language designed to have as few implementation dependencies as possible... |
| Python | A high-level, interpreted programming language known for its readability and simplicity... |
| JavaScript | A high-level, dynamic programming language primarily used for creating interactive and dynamic content on the web... |
| C# | A modern, object-oriented programming language developed by Microsoft... |
| SQL | A domain-specific language used in programming and managing relational databases... |
| PHP | A server-side scripting language designed primarily for web development... |
| Golang | A statically typed, compiled programming language designed by Google... |
| Rust | A systems programming language focused on safety and concurrency... |
3.2 创建 Embedding
接下来,利用 PyMilvus 中的模型工具,为这些数据生成向量。代码示例如下:
def gen_embedding(model_name):
openai_ef = model.dense.OpenAIEmbeddingFunction(
model_name=model_name,
api_key=os.environ["OPENAI_API_KEY"]
)
docs_embeddings = openai_ef.encode_documents(df['description'].tolist())
return docs_embeddings, openai_ef
然后将生成的 Embedding 存入 Milvus 的 collection 中:
def sa ve_embedding(docs_embeddings, collection_name, dim):
data = [
{"id": i, "vector": docs_embeddings[i].data, "text": row.language}
for i, row in df.iterrows()
]
if milvus_client.has_collection(collection_name=collection_name):
milvus_client.drop_collection(collection_name=collection_name)
milvus_client.create_collection(collection_name=collection_name, dimension=dim)
res = milvus_client.insert(collection_name=collection_name, data=data)
3.3 查询
定义好查询函数,便于后续检索:
def query_results(query, collection_name, openai_ef):
query_embeddings = openai_ef.encode_queries(query)
res = milvus_client.search(
collection_name=collection_name,
data=query_embeddings,
limit=4,
output_fields=["text"],
)
result = {}
for items in res:
for item in items:
result[item.get("entity").get("text")] = item.get('distance')
return result
3.4 评估 Embedding 模型性能
我们以 OpenAI 的两个模型——text-embedding-3-small 和 text-embedding-3-large——进行一次对比。评估指标很多,这里重点看两个最基本且直观的:准确率(Precision)和召回率(Recall)。
准确率:检索结果中,真正相关的内容占比。
Precision = TP / (TP + FP)
召回率:从整个数据集中,成功检索出多少真正相关的内容。
Recall = TP / (TP + FN)
查询 1:auto garbage collection
相关项:Java, Python, JavaScript, Golang
| Rank | text-embedding-3-small | text-embedding-3-large |
|---|---|---|
| 1 | ❎ Rust | ❎ Rust |
| 2 | ❎ C/C++ | ❎ C/C++ |
| 3 | ✅ Golang | ✅ Java |
| 4 | ✅ Java | ✅ Golang |
| Precision | 0.50 | 0.50 |
| Recall | 0.50 | 0.50 |
查询 2:suite for web backend server development
相关项:Java, JavaScript, PHP, Python(此处存在一定主观判断)
| Rank | text-embedding-3-small | text-embedding-3-large |
|---|---|---|
| 1 | ✅ PHP | ✅ JavaScript |
| 2 | ✅ Java | ✅ Java |
| 3 | ✅ JavaScript | ✅ PHP |
| 4 | ❎ C# | ✅Python |
| Precision | 0.75 | 1.0 |
| Recall | 0.75 | 1.0 |
通过这两个查询的对比,结果已能看出一定差异。当然,这仅仅是一个起点。要使评估结果具有说服力,还需要扩大数据量,增加查询数量。数据集越大、测试样例越多,评估结论才越可靠。
04. 总结
在 RAG 应用中,选择正确的 Embedding 模型是决定检索质量的关键环节。正确的路径是:从业务需求出发,在 MTEB 等排行榜上筛选出通用候选模型,然后利用自己的数据集进行真实评估,重点关注准确率和召回率。只有这样挑选出来的 Embedding 模型,才能真正提升 RAG 应用的召回准确率。

