向量 Embedding 是目前检索增强生成(RAG)应用程序的核心。它们捕获数据对象(如文本、图像等)的语义信息,并以数字数组表示。在时下的生成式 AI 应用中,这些向量 Embedding 通常由 Embedding 模型生成。如何为 RAG 应用程序选择合适的 Embedding 模型呢?总体来说,这取决于具体用例以及具体需求。接下来,让我们拆分步骤来分别来看。
01. 确定具体用例
我们基于 RAG 应用程序需求考虑以下问题:
首先,通用模型是否足以满足需求? 其次,是否有特定的需求?例如模态(如仅文本或图片,关于多模态 Embedding 选择需参考相关文档)、特定领域(如法律、医学等)。
在大多数情况下,针对所需模态,通常选择通用模型即可满足基础需求。
02. 选择通用模型
如何选择通用模型呢?HuggingFace 中 Massive Text Embedding Benchmark(MTEB)排行榜罗列了当前各种专有和开源文本 Embedding 模型。对于每个 Embedding 模型,MTEB 列出了各种指标,包括模型参数、内存、Embedding 维度、最大 token 数量,以及其在检索、摘要等任务中的得分。
在为 RAG 应用程序选择 Embedding 模型的时候,需要考虑以下因素:
任务:在 MTEB 排行榜顶部,我们会看到各种任务选项卡。对于一个 RAG 应用程序,我们可能需要更关注'检索'任务,我们可以选择 Retrieval 这个选项卡。
语言:基于 RAG 应用的数据集语言来选择对应语言的 Embedding 模型。
得分:表示模型在特定基准数据集或多个基准数据集上的表现。根据任务的不同,使用不同的评估指标。通常,这些指标的取值范围在 0 到 1 之间,值越高表示性能越好。
模型规模和内存用量:这些指标让我们了解模型运行时所需的计算资源。虽然检索性能随着模型规模的增加而提高,但需要注意的是,模型规模也直接影响延迟。此外,较大的模型可能会过拟合,其泛化性能低,从而在生产中表现不佳。因此,我们需要在生产环境中寻求性能和延迟之间的平衡。一般来说,我们可以先从一个小的、轻量级的模型开始,先快速构建 RAG 应用。在应用的基础流程正常运行之后,我们可以切换到更大、性能更高的模型,来对应用做进一步优化。
Embedding 维度:这是 Embedding 向量的长度。虽然更大的 Embedding 维度可以捕获数据中更细微的细节,但是效果不一定是最佳。例如,我们是否真的需要 8192 维度来处理文档数据呢?可能不需要。另一方面,较小的 Embedding 维度提供了更快的推理速度,并且在存储和内存方面更高效。因此,我们需要在捕获数据内容和执行效率之间寻求良好的平衡。
最大 token 数量:表示单个 Embedding 的最大 token 数量。对于常见的 RAG 应用程序,Embedding 较好的分块大小通常是单个段落,此时,最大 token 为 512 的 Embedding 模型应该足够。然而,在某些特殊情况下,我们可能需要 token 数量更大的模型来处理更长的文本。
03. 在 RAG 应用中评估模型
虽然我们可以从 MTEB 排行榜找到通用模型,但我们需要谨慎对待其结果。谨记,这些结果是模型的自我报告,有可能某些模型产生了夸大其性能的分数,因为它们可能在训练数据中包含了 MTEB 数据集,毕竟这些是公开的数据集。另外,模型使用基准的数据集可能无法准确代表我们应用里使用的数据。因此,我们需要在自己的数据集上评估 Embedding 模型。
3.1 数据集
我们可以从 RAG 应用使用的数据中,生成一个小型标记数据集。我们以如下数据集为例。
| Language | Description |
|---|---|
| C/C++ | A general-purpose programming language known for its performance and efficiency. It provides low-level memory manipulation capabilities and is widely used in system/software development, game development, and applications requiring high performance. |
| Java | A versatile, object-oriented programming language designed to have as few implementation dependencies as possible. It is widely used for building enterprise-scale applications, mobile applications (especially Android), and web applications due to its portability and robustness. |


