Nvidia Metrics(Nvidia 指标)
Answer Accuracy(答案准确性)
Answer Accuracy 衡量模型对给定问题的回答与 reference ground truth 之间的一致程度。这通过两个不同的 "LLM-as-a-Judge" prompt 完成,每个 prompt 返回一个评分(0、2 或 4)。该指标将这些评分转换为 [0,1] 尺度,然后取两位评委分数的平均值。分数越高表示模型答案与 reference 越接近。
- 0 → response 不准确,或未处理与 reference 相同的问题。
- 2 → response 与 reference 部分对齐。
- 4 → response 与 reference 完全对齐。
示例
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}")
输出:
Answer Accuracy Score: 1.0
同步用法
如果你更喜欢同步代码,可以使用 .score() 方法代替 .ascore():
result = scorer.score(
user_input="When was Einstein born?",
response="Albert Einstein was born in 1879.",
reference="Albert Einstein was born in 1879."
)
计算方式
步骤 1: LLM 使用两个不同的模板生成评分,以确保稳健性:
- Template 1: LLM 将 response 与 reference 比较,并按 0、2 或 4 的尺度评分。
- Template 2: LLM 再次评估同一问题,但这次 response 和 reference 的角色对调。
这种双视角方法保证对答案准确性进行公平评估。
步骤 2: 如果两个评分都有效,最终分数是 score1 和 score2 的平均值;否则取有效的那个。
示例计算:
- User Input: "When was Einstein born?"
- Response: "Albert Einstein was born in 1879."
- Reference: "Albert Einstein was born in 1879."
假设两个模板都返回评分 4(表示完全匹配),转换如下:
- 评分 4 对应于 [0,1] 尺度上的 1。
- 对两个分数取平均:(1 + 1) / 2 = 1。
因此,最终 Answer Accuracy 分数为 1。
类似的 Ragas 指标
- Answer Correctness:该指标通过同时考虑语义相似度和事实相似度,衡量生成答案与 ground truth 相比的准确性。
- Rubric Score:The Rubric-Based Criteria Scoring Metric 允许基于用户定义的量规进行评估,每个量规概述具体评分标准。LLM 根据这些自定义描述评估回答,确保评估过程一致且客观。
指标比较
Answer Correctness vs. Answer Accuracy
- LLM 调用: Answer Correctness 需要三次 LLM 调用(两次用于将 response 和 reference 分解为独立陈述,一次用于分类),而 Answer Accuracy 使用两次独立的 LLM 评判。
- Token 用量: Answer Correctness 由于其详细的分解和分类过程会消耗更多 token。
- 可解释性: Answer Correctness 通过提供事实正确性和语义相似度的详细洞察,具有高可解释性,而 Answer Accuracy 提供直接的原始分数。
- 稳健评估: Answer Accuracy 通过双重 LLM 评估确保一致性,而 Answer Correctness 通过深入评估回答质量提供整体视图。
Answer Accuracy vs. Rubric Score
- LLM 调用:Answer Accuracy 进行两次调用(每位 LLM 评委一次),而 Rubric Score 只需要一次。
- Token 用量:Answer Accuracy 用量最小,因为它只输出一个分数,而 Rubric Score 会生成推理,增加 token 消耗。
- 可解释性:Answer Accuracy 提供没有理由的原始分数,而 Rubric Score 提供带有 verdict 的推理。
- 效率:Answer Accuracy 轻量,与较小模型配合得很好。
旧版 Metrics API
以下示例使用旧版 metrics API 模式。对于新项目,我们建议使用上文所示的 collections-based API。
弃用时间表
此 API 将在 0.4 版本中弃用,并在 1.0 版本中移除。请迁移到上文所示的 collections-based 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)
输出:
1.0
Context Relevance(上下文相关性)
Context Relevance 评估 retrieved_contexts(块或段落)是否与 user_input 相关。这通过两次独立的 "LLM-as-a-Judge" prompt 调用完成,每次按 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}")
输出:
Context Relevance Score: 1.0
同步用法
如果你更喜欢同步代码,可以使用 .score() 方法代替 .ascore():
result = scorer.score(
user_input="When and Where Albert Einstein was born?",
retrieved_contexts=[...]
)
实现说明
与原始论文的差异: 原始 Ragas 论文使用句子级提取定义 Context Relevance(CR = 相关句子数 / 总句子数),但当前实现使用更稳健的离散评判方法。每个 LLM 被要求按 0-2 尺度评估整体上下文相关性,这更高效,也更不容易出现句子边界错误。这是一个有意的设计决策,旨在提高可靠性、减少计算开销,同时保持核心评估目标。
计算方式
步骤 1: 使用两个不同的模板(template_relevance1 和 template_relevance2)提示 LLM,评估检索到的上下文相对于用户查询的相关性。每个 prompt 返回 0、1 或 2 的相关性评分。使用两次独立评估提供稳健性,并有助于减轻单个 LLM 的偏差。
步骤 2: 每个评分通过除以 2 归一化到 [0,1] 尺度。如果两个评分都有效,最终分数是这些归一化值的平均值;如果只有一个有效,则使用该分数。
示例计算:
- 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."
在此示例中,两个检索到的上下文合在一起通过提供 Albert Einstein 的出生日期和地点,完全处理了用户查询。因此,两个 prompt 都会将组合上下文评为 2(完全相关)。将每个分数归一化得到 1.0(2/2),对两个结果取平均使最终 Context Relevance 分数保持为 1。
类似的 Ragas 指标
- Context Precision:它衡量检索到的上下文中与回答用户查询相关的比例。它计算为所有检索块的 mean precision@k,表明检索系统对相关信息排序的准确程度。
- Context Recall:它量化相关信息被成功检索的程度。它计算为检索结果中找到的相关 claim(或上下文)数量与 reference 中相关 claim 总数之比,确保重要信息不被遗漏。
- Rubric Score:The Rubric-Based Criteria Scoring Metric 根据带有可自定义评分标准的用户定义量规评估回答,确保评估一致且客观。评分尺度可灵活适应用户需求。
Context Precision 和 Context Recall vs. Context Relevance
- LLM 调用: Context Precision 和 Context Recall 各需要一次 LLM 调用,一次验证上下文有用性以得到 reference(verdict "1" 或 "0"),一次将每个答案句子分类为可归因(二元 'Yes' (1) 或 'No' (0)),而 Context Relevance 使用两次 LLM 调用以提高稳健性。
- Token 用量: Context Precision 和 Context Recall 消耗更多 token,而 Context Relevance 更节省 token。
- 可解释性: Context Precision 和 Context Recall 通过详细推理提供高可解释性,而 Context Relevance 提供没有解释的原始分数。
- 稳健评估: Context Relevance 通过双重 LLM 评判提供更稳健的评估,相比 Context Precision 和 Context Recall 的单次调用方法。
旧版 Metrics API
以下示例使用旧版 metrics API 模式。对于新项目,我们建议使用上文所示的 collections-based API。
弃用时间表
此 API 将在 0.4 版本中弃用,并在 1.0 版本中移除。请迁移到上文所示的 collections-based 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)
输出:
1.0
Response Groundedness(回答接地性)
Response Groundedness 衡量回答被检索到的上下文支持或"接地"的程度。它评估回答中的每条 claim 是否可以全部或部分地在所提供的上下文中找到。
- 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}")
输出:
Response Groundedness Score: 1.0
同步用法
如果你更喜欢同步代码,可以使用 .score() 方法代替 .ascore():
result = scorer.score(
response="Albert Einstein was born in 1879.",
retrieved_contexts=[...]
)
计算方式
步骤 1: 使用两个不同的模板提示 LLM,评估回答相对于检索到的上下文的接地性。每个 prompt 返回 0、1 或 2 的接地评分。
步骤 2: 每个评分通过除以 2 归一化到 [0,1] 尺度(即 0 变为 0.0,1 变为 0.5,2 变为 1.0)。如果两个评分都有效,最终分数计算为这些归一化值的平均值;如果只有一个有效,则使用该分数。
示例计算:
- 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."
在此示例中,检索到的上下文提供了 Albert Einstein 的出生日期和地点。由于回答的 claim 被上下文支持(即使日期只是部分提供),两个 prompt 都很可能将接地性评为 2(完全接地)。将分数 2 归一化得到 1.0(2/2),对两个归一化评分取平均使最终 Response Groundedness 分数保持为 1。
类似的 Ragas 指标
- Faithfulness:该指标衡量回答与检索到的上下文在事实上的一致程度,确保回答中的每条 claim 都由所提供的信息支持。Faithfulness 分数范围为 0 到 1,分数越高表示一致性越好。
- Rubric Score:这是一种通用指标,根据用户定义的标准评估回答,可以通过将量规与需求对齐,适配为评估 Answer Accuracy、Context Relevance 或 Response Groundedness。
指标比较
Faithfulness vs. Response Groundedness
- LLM 调用: Faithfulness 需要两次调用进行详细的 claim 分解和 verdict,而 Response Groundedness 使用两次独立的 LLM 评判。
- Token 用量: Faithfulness 消耗更多 token,而 Response Groundedness 更节省 token。
- 可解释性: Faithfulness 为每条 claim 提供透明的推理,而 Response Groundedness 提供原始分数。
- 稳健评估: Faithfulness 纳入用户输入以进行全面评估,而 Response Groundedness 通过双重 LLM 评估确保一致性。
旧版 Metrics API
以下示例使用旧版 metrics API 模式。对于新项目,我们建议使用上文所示的 collections-based API。
弃用时间表
此 API 将在 0.4 版本中弃用,并在 1.0 版本中移除。请迁移到上文所示的 collections-based 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)
输出:
1.0