[AI Embedchain] 组件 评估

概览

我们为您的RAG应用提供了开箱即用的评估指标。您可以使用它们来评估您的RAG应用,并与不同设置的生产RAG应用进行比较。

目前,我们支持以下评估指标:

快速开始

这是一个运行评估的基本示例:

example.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
from embedchain import App

app = App()

# 添加数据源
app.add("https://www.forbes.com/profile/elon-musk")

# 运行评估
app.evaluate(["Elon Musk的净资产是多少?", "Elon Musk拥有多少家公司?"])
# {'answer_relevancy': 0.9987286412340826, 'groundedness': 1.0, 'context_relevancy': 0.3571428571428571}

在幕后,Embedchain执行以下操作:

  1. 在向量数据库中运行语义搜索并获取上下文
  2. 使用问题和上下文调用LLM以获取答案
  3. 在以下指标上运行评估:上下文相关性依据性答案相关性并返回结果

高级用法

我们默认使用OpenAI的gpt-4模型作为自动评估的LLM模型。因此,我们需要您将OPENAI_API_KEY设置为环境变量。

步骤1:创建数据集

为了评估您的RAG应用,您必须设置一个数据集。数据集中的一个数据点包括问题上下文答案。以下是如何为评估创建数据集的示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from embedchain.utils.eval import EvalData

data = [
    {
        "question": "Elon Musk的净资产是多少?",
        "contexts": [
            "Elon Musk PROFILEElon MuskCEO, ...",
            "一个关于记者是否...的Twitter投票",
            "2016年由Jared Birchall创立。[335]...",
        ],
        "answer": "根据提供的信息,Elon Musk的净资产是2416亿美元。",
    },
    {
        "question": "Elon Musk拥有哪些公司?",
        "contexts": [
            "截至2023年12月[更新],...",
            "ThielCofounderView ProfileTeslaHolds ...",
            "Elon Musk PROFILEElon MuskCEO, ...",
        ],
        "answer": "Elon Musk拥有几家公司,包括Tesla、SpaceX、Neuralink和The Boring Company。",
    },
]

dataset = []

for d in data:
    eval_data = EvalData(question=d["question"], contexts=d["contexts"], answer=d["answer"])
    dataset.append(eval_data)

步骤2:运行评估

一旦创建了您的数据集,您可以选择您想要运行的评估指标在数据集上运行评估。

例如,您可以使用以下代码在上下文相关性指标上运行评估:

1
2
3
4
from embedchain.evaluation.metrics import ContextRelevance
metric = ContextRelevance()
score = metric.evaluate(dataset)
print(score)

您可以选择不同的指标或编写自己的指标来运行评估。您可以查看以下链接:

指标

上下文相关性

上下文相关性是一个指标,用于确定"上下文对问题的相关性"。我们使用OpenAI的gpt-4模型来确定上下文的相关性。我们通过向模型提示问题和上下文并要求它返回上下文中的相关句子来实现这一点。然后我们使用以下公式来确定分数:

1
上下文相关性分数 = 上下文中相关句子的数量 / 上下文中句子的总数

示例

您可以使用以下简单代码运行上下文相关性评估:

1
2
3
4
5
6
from embedchain.evaluation.metrics import ContextRelevance

metric = ContextRelevance()
score = metric.evaluate(dataset)  # 'dataset' 在创建数据集部分定义
print(score)
# 0.27975528364849833

在上面的示例中,我们对评估使用了合理的默认值。然而,您也可以根据需要使用ContextRelevanceConfig类配置评估指标。

这是一个更高级的示例,展示了如何为评估上下文相关性指标传递自定义评估配置:

1
2
3
4
5
6
from embedchain.config.evaluation.base import ContextRelevanceConfig
from embedchain.evaluation.metrics import ContextRelevance

eval_config = ContextRelevanceConfig(model="gpt-4", api_key="sk-xxx", language="en")
metric = ContextRelevance(config=eval_config)
metric.evaluate(dataset)

答案相关性

答案相关性是一个指标,用于确定答案对问题的相关性。我们向模型提示答案并要求它从答案生成问题。然后我们使用生成的问题与原始问题的余弦相似度来确定分数。

1
答案相关性分数 = 生成的问题与原始问题的余弦相似度的平均值

示例

您可以使用以下简单代码运行答案相关性评估:

1
2
3
4
5
6
from embedchain.evaluation.metrics import AnswerRelevance

metric = AnswerRelevance()
score = metric.evaluate(dataset)
print(score)
# 0.9505334177461916

在上面的示例中,我们对评估使用了合理的默认值。然而,您也可以根据需要使用AnswerRelevanceConfig类配置评估指标。这是一个更高级的示例,展示了您可以提供自己的评估配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from embedchain.config.evaluation.base import AnswerRelevanceConfig
from embedchain.evaluation.metrics import AnswerRelevance

eval_config = AnswerRelevanceConfig(
    model='gpt-4',
    embedder="text-embedding-ada-002",
    api_key="sk-xxx",
    num_gen_questions=2
)
metric = AnswerRelevance(config=eval_config)
score = metric.evaluate(dataset)

依据性

依据性是一个指标,用于确定答案与上下文的依据程度。我们使用OpenAI的gpt-4模型来确定答案的依据性。我们通过向模型提示答案并要求它从答案生成主张来实现这一点。然后我们再次向模型提示上下文和生成的主张以确定主张的裁决。然后我们使用以下公式来确定分数:

1
依据性分数 = 所有裁决的总和 / 主张的总数

您可以使用以下简单代码运行依据性评估:

1
2
3
4
5
from embedchain.evaluation.metrics import Groundedness
metric = Groundedness()
score = metric.evaluate(dataset)    # 来自上面的dataset
print(score)
# 1.0

在上面的示例中,我们对评估使用了合理的默认值。然而,您也可以根据需要使用GroundednessConfig类配置评估指标。这是一个更高级的示例,展示了您可以配置评估配置:

1
2
3
4
5
6
from embedchain.config.evaluation.base import GroundednessConfig
from embedchain.evaluation.metrics import Groundedness

eval_config = GroundednessConfig(model='gpt-4', api_key="sk-xxx")
metric = Groundedness(config=eval_config)
score = metric.evaluate(dataset)

自定义

您也可以通过扩展BaseMetric类来创建自己的评估指标。您可以在embedchain.evaluation.metrics路径找到现有指标的源代码。

您必须在类的__init__方法中提供自定义指标的name。这个名称将用于在评估报告中识别您的指标。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
from typing import Optional

from embedchain.config.base_config import BaseConfig
from embedchain.evaluation.metrics import BaseMetric
from embedchain.utils.eval import EvalData

class MyCustomMetric(BaseMetric):
    def __init__(self, config: Optional[BaseConfig] = None):
        super().__init__(name="my_custom_metric")

    def evaluate(self, dataset: list[EvalData]):
        score = 0.0
        # 在这里编写您的评估逻辑
        return score