如何评估 Embedding 模型

如何评估 Embedding 模型
2024年12月01日 14:29 InfoQ

简  介

在此前发布的文章(https://zilliz.com/learn/sparse-and-dense-embeddings)中,我们探析了当前稠密 Embedding 模型的架构,并介绍了 sentence-transformers 库的一些基础用法。虽然通过 sentence-transformers 可以使用众多预训练模型,但这些模型几乎都采用了与原始 SBERT 模型相同的架构——在 transformer 编码器上进行汇总特征的训练,并使用掩码语言模型(Masked Language Modeling,MLM)。

从构建应用的角度出发,选择一个合适的文本 Embedding 模型至关重要。这种选择通常依赖于应用的具体需求。本文将探讨选择模型时需要考虑的一些关键因素。同时,我们还将介绍如何使用 Arize Phoenix 和 Ragas 来评估不同的文本 Embedding 模型。

考量因素

现在,大多数应用都在使用 OpenAI 的 Embedding 接口来生成向量。虽然这是一个出色的通用型 Embedding 模型,适合初学者,但一旦需求开始增加,通常最明智的选择是:

a) 使用自己的 Embedding 模型

b) 使用不同的开源或闭源模型。

在评估这些 Embedding 模型时需谨慎,因为有些模型可能会出现过拟合(overfitting)的情况,不一定真正适合您的应用。因此,请一定要进行评估。

任务类型与复杂性

Embedding 模型的选择极大程度上受到任务复杂程度的影响。例如,简单的任务(如情感分析或关键词匹配等)可能适合使用 MTEB 排行榜上任何一个通用模型。但是,真实应用中有许多情况下需要采用特殊的 Embedding 模型。以下面两个英文句子为例:

"Let's eat, Chris."

"Let's eat Chris."

这两个句子除了一个逗号外几乎相同,因此大多数通用模型会认为这两个句子在高维 Embedding 空间中位置非常接近。但实际上,这两个句子应处于高维空间的两端,因为这两个句子含义的相似度较低。因此,对于问答、语言翻译或情感分析等更复杂的任务,我们需要选择能捕捉到内容细微差异的模型。

模型性能 vs. 成本

在选择模型时,我们需要在 Embedding 模型的性能和计算效率之间做出权衡。例如,e5-large-v2 这类高性能模型虽然“更准确”,但却包含更多参数且运行时间更长。这对于那些有实时需求或硬件能力受限的应用是一个制约因素。像聊天机器人或推荐系统这类实时、高吞吐量的应用通常追求迅速响应和低延时。对于这类应用,应当选择一个参数更少的模型以降低成本。相反,在公司有限的法律或财务文档库中进行语义搜索这类应用,通常追求高准确性,因此,选择一个更大的模型才是更明智的选择。

文本所属的领域

选择模型时的另一大考量因素是文本数据所属的领域。许多 Embedding 模型是基于通用语言数据训练的,因此很可能无法捕捉专业词汇或术语的微妙含义。针对特定领域数据集训练或微调的模型能够为专业领域内的文本生成更精确的 Embeddings。在医疗诊断、法律文件分析或为特定产品提供技术支持等应用中,特定领域的模型能够更深入地理解相应领域使用的专业语言,显著优于通用模型。

评估文本 Embedding 模型

现在,我们将开始介绍评估文本 Embedding 模型的两种主流方法。

Arize-Phoenix

Arize AI 的 Phoenix 库是一个非常实用的多功能工具,可用于评估 LLM 和 Embedding 模型。Phoenix 提供了一种简单且灵活的方法来记录和查看高维 Embeddings,帮助用户了解模型可能出错的地方。根据其 README 文件,“Phoenix 提供了一个 A/B 测试框架,帮助您理解 Embeddings 随时间的变化以及在模型不同版本之间的变化情况。”

现在,让我们通过具体示例来看看 Phoenix 是如何识别错误 Embeddings 的。我们需要先回顾一下之前使用的 IMDB 数据集。记得我们之前是如何使用 sentence-transformers 库生成 Embeddings 的吗?

from datasets import load_dataset

from sentence_transformers import SentenceTransformer

# load the IMDB dataset

dataset = load_dataset("imdb", split="test")

# instantiate the model

model = SentenceTransformer("intfloat/e5-small-v2")

def generate_embeddings(dataset):

"""Generates embeddings for the input dataset. """

global model

return model.encode([row["text"] for row in dataset])

# generate embeddings

embeddings = generate_embeddings(dataset)

将数据集加载到 pandas dataframe 中。

import pandas as pd

# create the pandas dataframe

df = pd.DataFrame({"embedding": embeddings.tolist()})

df["text"] = [row["text"] for row in dataset]

df["label"] = [row["label"] for row in dataset]

直接在 Phoenix 中使用加载完毕的数据。

! pip install -U arize-phoenix

import phoenix as px

# create the schema

schema = px.Schema(

feature_column_names=["text"],

actual_label_column_name="label",

embedding_feature_column_names={

"text_embedding": px.EmbeddingColumnNames(

vector_column_name="embedding",

#link_to_data_column_name="text",

),

},

)

ds = px.Dataset(df, schema)

session = px.launch_app(primary=ds)

session.url

我们首先创建了一个 Schema 对象。Schema 定义了与每个 Embedding 相关联的数据,也就是文本和标签。这一步完成后,我们指定了之前创建的 dataframe 及 Schema 以供 Phoenix 使用。接着,启动应用。

在浏览器中打开 URL,界面如下所示:

本示例中仅展示 IMDB 数据集中的前 100 条数据。此外,我们还插入了一条“错误” Embedding。该 Embedding 不是电影影评的向量。从下图中,我们不难发现 Phoenix 成功将这条“错误” Embedding 识别了出来。

Ragas

虽然 LlamaIndex 或 Haystack 等现有工具支持构建 RAG(检索增强生成)Pipeline,但如何测试它们的性能是非常棘手的问题。Ragas 能够帮助我们轻松完成这项任务。Ragas(检索增强生成评估)是一个开源库,提供了评估 LLM 生成文本的工具,帮助我们了解 RAG Pipeline 的性能。此外,Ragas 还与 CI/CD 流程集成,允许定期检查性能,从而维持并提升 RAG 生成的质量。

现在,让我们看看如何使用 Ragas 评估 Embedding 模型的性能。本示例中,我们将使用一个不同的数据集。我们还需要先添加 OpenAI 密钥,以便 Ragas 访问 OpenAI 的 Embedding 模型。

import os

os.environ["OPENAI_API_KEY"] = "your-openai-key"

!pip install ragas

from ragas.metrics import context_recall, context_precision

在此,我们会引入一些与我们的 Embedding 模型质量相关的指标。Huggingface 数据集上专为 Ragas 创建的 amnesty_qa 数据集包含二十行数据,每行包括四列:向 LLM 提出的问题、一个基准真相(Ground-truth)答案、LLM 的回答,以及使用 Embedding 模型和向量数据库检索得到的相关上下文。

amnesty_qa = load_dataset("explodinggradients/amnesty_qa", "english_v2")

amnesty_qa

DatasetDict({

eval: Dataset({

features: ['question', 'ground_truth', 'answer', 'contexts'],

num_rows: 20

})

})

from ragas import evaluate

result = evaluate(

amnesty_qa["eval"],

metrics=[

context_precision,

context_recall,

],

)

result

对于 IMDB 数据集,我们也可以采用类似的方法,将所有数据集的向量保存在一个向量数据库中,创建一些样本问题,并按照之前同样的流程插入数据并执行搜索。

总  结

本文介绍了评估 Embedding 模型的一些方法。正确选择合适的文本 Embedding 模型需要考量众多因素——您需要了解每个模型的训练数据和训练方法。在详细了解底层任务的需求后,您可以利用可视化 Embeddings 的工具(例如 Arize-Phoenix 或 Ragas)提升 Embeddings 的质量。

财经自媒体联盟更多自媒体作者

新浪首页 语音播报 相关新闻 返回顶部