Nvidia 指标
答案准确率
答案准确性 (Answer Accuracy) 衡量模型的回应与给定问题的参考标准答案之间的一致性。这是通过两个不同的“LLM-as-a-Judge”(大语言模型即评判者)提示来完成的,每个提示都会返回一个评级(0、2 或 4)。该指标将这些评级转换为 [0,1] 的范围,然后取两位评判者分数的平均值。分数越高,表示模型答案与参考答案的匹配度越高。
- 0 → 回应不准确或与参考答案所回答的问题不一致。
- 2 → 回应与参考答案部分一致。
- 4 → 回应与参考答案完全一致。
示例
from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.metrics.collections import AnswerAccuracy
# Setup LLM
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
# Create metric
scorer = AnswerAccuracy(llm=llm)
# Evaluate
result = await scorer.ascore(
user_input="When was Einstein born?",
response="Albert Einstein was born in 1879.",
reference="Albert Einstein was born in 1879."
)
print(f"Answer Accuracy Score: {result.value}")
输出
同步用法
如果你偏好同步代码,可以使用 .score() 方法来代替 .ascore()
计算方法
步骤 1: LLM 使用两个不同的模板生成评级以确保稳健性
- 模板 1: LLM 将回应与参考答案进行比较,并按 0、2 或 4 的等级对其进行评分。
- 模板 2: LLM 再次评估相同的问题,但这次回应和参考答案的角色互换。
这种双重视角的方法保证了对答案准确性的公平评估。
步骤 2: 如果两个评级都有效,最终分数为 score1 和 score2 的平均值;否则,取有效的那一个。
计算示例
- 用户输入:“爱因斯坦什么时候出生的?”
- 回应:“阿尔伯特·爱因斯坦出生于 1879 年。”
- 参考答案:“阿尔伯特·爱因斯坦出生于 1879 年。”
假设两个模板都返回评级 4(表示完全匹配),转换如下
- 评级 4 对应 [0,1] 范围内的 1。
- 对两个分数求平均值:(1 + 1) / 2 = 1。
因此,最终的答案准确性分数为 1。
类似的 Ragas 指标
-
答案正确性 (Answer Correctness):此指标通过考虑语义和事实的相似性,衡量生成答案与标准答案相比的准确度。
-
评分准则分数 (Rubric Score):基于评分准则的评分指标允许根据用户定义的评分准则进行评估,其中每个准则都概述了具体的评分标准。LLM 根据这些自定义描述评估回应,确保评估过程的一致性和客观性。
指标比较
答案正确性 (Answer Correctness) vs. 答案准确性 (Answer Accuracy)
- LLM 调用次数: 答案正确性需要三次 LLM 调用(两次用于将回应和参考答案分解为独立陈述,一次用于对其进行分类),而答案准确性使用两次独立的 LLM 判断。
- Token 使用量: 由于其详细的分解和分类过程,答案正确性消耗的 Token 更多。
- 可解释性: 答案正确性通过提供有关事实正确性和语义相似性的详细见解,提供了高度的可解释性,而答案准确性则提供了一个直接的原始分数。
- 稳健评估: 答案准确性通过双重 LLM 评估确保一致性,而答案正确性通过深入评估回应质量提供了一个全面的视角。
答案准确性 (Answer Accuracy) vs. 评分准则分数 (Rubric Score)
- LLM 调用次数:答案准确性进行两次调用(每个 LLM 评判者一次),而评分准则分数仅需要一次。
- Token 使用量:答案准确性的 Token 使用量极少,因为它只输出一个分数,而评分准则分数会生成推理过程,从而增加了 Token 的消耗。
- 可解释性:答案准确性提供了一个没有理由的原始分数,而评分准则分数则提供了带有判决的推理过程。
- 效率:答案准确性是轻量级的,并且在较小的模型上表现非常好。
旧版指标 API
以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面显示的基于集合的 API。
弃用时间表
此 API 将在 0.4 版本中被弃用,并在 1.0 版本中被移除。请迁移到上面显示的基于集合的 API。
使用 SingleTurnSample 的示例
from ragas.dataset_schema import SingleTurnSample
from ragas.metrics import AnswerAccuracy
sample = SingleTurnSample(
user_input="When was Einstein born?",
response="Albert Einstein was born in 1879.",
reference="Albert Einstein was born in 1879."
)
scorer = AnswerAccuracy(llm=evaluator_llm) # evaluator_llm wrapped with ragas LLM Wrapper
score = await scorer.single_turn_ascore(sample)
print(score)
输出
上下文相关性
上下文相关性 (Context Relevance) 评估检索到的上下文(文本块或段落)是否与用户输入相关。这是通过两次独立的“LLM-as-a-Judge”(大语言模型即评判者)提示调用来完成的,每次调用都会按 0、1 或 2 的等级对相关性进行评分。然后将这些评级转换为 [0,1] 的范围并取平均值,得出最终分数。分数越高,表示上下文与用户的查询越吻合。
- 0 → 检索到的上下文与用户的查询完全不相关。
- 1 → 上下文部分相关。
- 2 → 上下文完全相关。
示例
from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.metrics.collections import ContextRelevance
# Setup LLM
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
# Create metric
scorer = ContextRelevance(llm=llm)
# Evaluate
result = await scorer.ascore(
user_input="When and Where Albert Einstein was born?",
retrieved_contexts=[
"Albert Einstein was born March 14, 1879.",
"Albert Einstein was born at Ulm, in Württemberg, Germany.",
]
)
print(f"Context Relevance Score: {result.value}")
输出
同步用法
如果你偏好同步代码,可以使用 .score() 方法来代替 .ascore()
实现说明
与原始论文的区别: 原始 Ragas 论文使用句子级提取来定义上下文相关性(CR = 相关句子数 / 总句子数),但当前的实现使用了一种更稳健的离散判断方法。每个 LLM 都被要求在 0-2 的等级上对整体上下文相关性进行评分,这种方法效率更高,并且更不容易出现句子边界错误。这是一个有意的设计决策,旨在提高可靠性并减少计算开销,同时保持核心评估目标。
计算方法
步骤 1: LLM 被提示使用两个不同的模板(template_relevance1 和 template_relevance2)来评估检索到的上下文与用户查询的相关性。每个提示返回一个相关性评级,为 0、1 或 2。使用两次独立的评估可以提供稳健性,并有助于减轻单个 LLM 的偏见。
步骤 2: 每个评级都通过除以 2 归一化到 [0,1] 的范围。如果两个评级都有效,最终分数为这些归一化值的平均值;如果只有一个有效,则使用该分数。
计算示例
- 用户输入:“阿尔伯特·爱因斯坦何时何地出生?”
- 检索到的上下文
- “阿尔伯特·爱因斯坦出生于 1879 年 3 月 14 日。”
- “阿尔伯特·爱因斯坦出生于德国符腾堡州的乌尔姆。”
在此示例中,两个检索到的上下文共同提供了阿尔伯特·爱因斯坦的出生日期和地点,完全回答了用户的查询。因此,两个提示都会将组合后的上下文评为 2(完全相关)。将每个分数归一化后得到 1.0 (2/2),对两个结果求平均值,最终的上下文相关性分数保持为 1。
类似的 Ragas 指标
-
上下文精确率 (Context Precision):它衡量检索到的上下文中与回答用户查询相关的部分所占的比例。它计算为所有检索到的文本块的平均 precision@k,表明检索系统对相关信息排序的准确性。
-
上下文召回率 (Context Recall):它量化了相关信息被成功检索到的程度。它计算为检索结果中找到的相关声明(或上下文)数量与参考答案中相关声明总数的比率,确保重要信息不会被遗漏。
-
评分准则分数 (Rubric Score):基于评分准则的评分指标根据用户定义的准则和可自定义的评分标准来评估回应,确保评估的一致性和客观性。评分范围可灵活调整以满足用户需求。
上下文精确率 (Context Precision) 和上下文召回率 (Context Recall) vs. 上下文相关性 (Context Relevance)
- LLM 调用次数: 上下文精确率和上下文召回率各需要一次 LLM 调用,一次用于验证上下文的有效性以获得参考(判决为“1”或“0”),一次用于将每个答案句子分类为可归因的(二进制“是”(1) 或“否”(0)),而上下文相关性则使用两次 LLM 调用以提高稳健性。
- Token 使用量: 上下文精确率和上下文召回率消耗更多的 Token,而上下文相关性在 Token 效率上更高。
- 可解释性: 上下文精确率和上下文召回率提供了带有详细推理的高度可解释性,而上下文相关性则提供了一个没有解释的原始分数。
- 稳健评估: 与上下文精确率和上下文召回率的单次调用方法相比,上下文相关性通过双重 LLM 判断提供了更稳健的评估。
旧版指标 API
以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面显示的基于集合的 API。
弃用时间表
此 API 将在 0.4 版本中被弃用,并在 1.0 版本中被移除。请迁移到上面显示的基于集合的 API。
使用 SingleTurnSample 的示例
from ragas.dataset_schema import SingleTurnSample
from ragas.metrics import ContextRelevance
sample = SingleTurnSample(
user_input="When and Where Albert Einstein was born?",
retrieved_contexts=[
"Albert Einstein was born March 14, 1879.",
"Albert Einstein was born at Ulm, in Württemberg, Germany.",
]
)
scorer = ContextRelevance(llm=evaluator_llm)
score = await scorer.single_turn_ascore(sample)
print(score)
输出
响应依据性
回应的依据性 (Response Groundedness) 衡量回应在多大程度上得到检索到的上下文的支持或“依据”。它评估回应中的每个声明是否可以在提供的上下文中全部或部分找到。
- 0 → 回应完全没有依据上下文。
- 1 → 回应部分依据上下文。
- 2 → 回应完全依据上下文(每个陈述都可以从检索到的上下文中找到或推断出来)。
示例
from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.metrics.collections import ResponseGroundedness
# Setup LLM
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
# Create metric
scorer = ResponseGroundedness(llm=llm)
# Evaluate
result = await scorer.ascore(
response="Albert Einstein was born in 1879.",
retrieved_contexts=[
"Albert Einstein was born March 14, 1879.",
"Albert Einstein was born at Ulm, in Württemberg, Germany.",
]
)
print(f"Response Groundedness Score: {result.value}")
输出
同步用法
如果你偏好同步代码,可以使用 .score() 方法来代替 .ascore()
计算方法
步骤 1: LLM 被提示使用两个不同的模板来评估回应相对于检索到的上下文的依据性。每个提示返回一个依据性评级,为 0、1 或 2。
步骤 2: 每个评级都通过除以 2 归一化到 [0,1] 的范围(即,0 变为 0.0,1 变为 0.5,2 变为 1.0)。如果两个评级都有效,最终分数为这些归一化值的平均值;如果只有一个有效,则使用该分数。
计算示例
- 回应:“阿尔伯特·爱因斯坦出生于 1879 年。”
- 检索到的上下文
- “阿尔伯特·爱因斯坦出生于 1879 年 3 月 14 日。”
- “阿尔伯特·爱因斯坦出生于德国符腾堡州的乌尔姆。”
在此示例中,检索到的上下文提供了阿尔伯特·爱因斯坦的出生日期和地点。由于回应的声明得到了上下文的支持(即使日期是部分提供的),两个提示很可能都会将依据性评为 2(完全有依据)。将评级 2 归一化得到 1.0 (2/2),对两个归一化评级求平均值,最终的回应的依据性分数保持为 1。
类似的 Ragas 指标
-
忠实度 (Faithfulness):此指标衡量回应与检索到的上下文在事实上的一致性,确保回应中的每个声明都得到所提供信息的支持。忠实度分数范围为 0 到 1,分数越高表示一致性越好。
-
评分准则分数 (Rubric Score):这是一个通用指标,根据用户定义的标准评估回应,可以通过调整评分准则以符合要求来评估答案准确性、上下文相关性或回应的依据性。
指标比较
忠实度 (Faithfulness) vs. 回应的依据性 (Response Groundedness)
- LLM 调用次数: 忠实度需要两次调用以进行详细的声明分解和判决,而回应的依据性使用两次独立的 LLM 判断。
- Token 使用量: 忠实度消耗更多 Token,而回应的依据性在 Token 效率上更高。
- 可解释性: 忠实度为每个声明提供了透明的推理过程,而回应的依据性则提供了一个原始分数。
- 稳健评估: 忠实度结合了用户输入以进行全面评估,而回应的依据性则通过双重 LLM 评估确保一致性。
旧版指标 API
以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面显示的基于集合的 API。
弃用时间表
此 API 将在 0.4 版本中被弃用,并在 1.0 版本中被移除。请迁移到上面显示的基于集合的 API。
使用 SingleTurnSample 的示例
from ragas.dataset_schema import SingleTurnSample
from ragas.metrics import ResponseGroundedness
sample = SingleTurnSample(
response="Albert Einstein was born in 1879.",
retrieved_contexts=[
"Albert Einstein was born March 14, 1879.",
"Albert Einstein was born at Ulm, in Württemberg, Germany.",
]
)
scorer = ResponseGroundedness(llm=evaluator_llm)
score = await scorer.single_turn_ascore(sample)
print(score)
输出