上下文实体召回率
上下文实体召回率
ContextEntityRecall 指标基于 reference(参考答案)和 retrieved_contexts(检索到的上下文)中共同存在的实体数量,与仅存在于 reference 中的实体数量进行比较,从而衡量检索到的上下文的召回率。简而言之,它衡量的是从 reference 中召回了多少比例的实体。此指标在基于事实的用例中非常有用,例如旅游咨询、历史问答等。该指标可以通过与 reference 中存在的实体进行比较,来帮助评估检索机制在实体召回方面的表现,因为在实体很重要的场景下,我们需要 retrieved_contexts 能够覆盖这些实体。
为了计算此指标,我们使用两个集合
- \(RE\): 参考答案中的实体集合。
- \(RCE\): 检索到的上下文中的实体集合。
我们计算两个集合中共同实体的数量 (\(RCE \cap RE\)),然后除以参考答案中实体的总数 (\(RE\))。公式如下
示例
from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.metrics.collections import ContextEntityRecall
# Setup LLM
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
# Create metric
scorer = ContextEntityRecall(llm=llm)
# Evaluate
result = await scorer.ascore(
reference="The Eiffel Tower is located in Paris.",
retrieved_contexts=["The Eiffel Tower is located in Paris."]
)
print(f"Context Entity Recall Score: {result.value}")
输出
同步用法
如果你偏好同步代码,可以使用 .score() 方法来代替 .ascore()
计算方法
示例
reference (参考答案): 泰姬陵是一座象牙白色的大理石陵墓,位于印度城市阿格拉的亚穆纳河右岸。它由莫卧儿王朝皇帝沙贾汗于1631年下令建造,用于安放其爱妻蒙塔兹·玛哈的陵墓。High entity recall context (高实体召回率上下文): 泰姬陵是位于印度阿格拉的爱情象征和建筑奇迹。它由莫卧儿王朝皇帝沙贾汗为纪念其爱妻蒙塔兹·玛哈而建造。该建筑以其复杂的大理石工艺和周围美丽的花园而闻名。Low entity recall context (低实体召回率上下文): 泰姬陵是印度的标志性纪念碑。它是联合国教科文组织世界遗产,每年吸引数百万游客。其复杂的雕刻和令人惊叹的建筑使其成为必游之地。
让我们来看一下上面给出的参考答案和检索到的上下文。
- 第一步: 找出参考答案中存在的实体。
- 基准真相中的实体 (RE) - ['泰姬陵', '亚穆纳河', '阿格拉', '1631', '沙贾汗', '蒙塔兹·玛哈']
- 第二步: 找出检索到的上下文中存在的实体。
- 上下文中的实体 (RCE1) - ['泰姬陵', '阿格拉', '沙贾汗', '蒙塔兹·玛哈', '印度']
- 上下文中的实体 (RCE2) - ['泰姬陵', '联合国教科文组织', '印度']
-
第三步: 使用上述公式计算实体召回率
\[ \text{上下文实体召回率 1} = \frac{| RCE1 \cap RE |}{| RE |} = 4/6 = 0.666 \]\[ \text{上下文实体召回率 2} = \frac{| RCE2 \cap RE |}{| RE |} = 1/6 \]我们可以看到,第一个上下文具有较高的实体召回率,因为它相对于参考答案有更好的实体覆盖。如果这两个检索到的上下文是由两个不同的检索机制在同一组文档上获取的,那么在实体至关重要的用例中,我们可以说第一个机制优于第二个机制。
旧版指标 API
以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面显示的基于集合的 API。
弃用时间表
此 API 将在 0.4 版本中被弃用,并在 1.0 版本中被移除。请迁移到上面显示的基于集合的 API。
使用 SingleTurnSample 的示例
from ragas import SingleTurnSample
from ragas.metrics import ContextEntityRecall
sample = SingleTurnSample(
reference="The Eiffel Tower is located in Paris.",
retrieved_contexts=["The Eiffel Tower is located in Paris."],
)
scorer = ContextEntityRecall(llm=evaluator_llm)
await scorer.single_turn_ascore(sample)