答案正确性
Answer Correctness (答案正确性)
评估答案正确性,指的是将生成答案与真实答案(ground truth)进行比较,以衡量其准确性。此评估依赖于ground truth和answer,得分范围为 0 到 1。分数越高,表示生成答案与真实答案越一致,即正确性越好。
答案正确性包含两个关键方面:生成答案与真实答案之间的语义相似性,以及事实相似性。这两个方面通过加权方案结合起来,形成最终的答案正确性分数。如果需要,用户还可以使用一个“阈值”将结果分数四舍五入为二进制值。
嵌入模型要求
答案正确性(AnswerCorrectness)需要使用嵌入模型来计算语义相似度。当使用evaluate()函数而未明确提供嵌入模型时,Ragas将自动匹配与您的LLM提供商相对应的嵌入模型提供商。例如,如果您使用Gemini作为您的LLM,系统将自动使用Google的嵌入模型(无需OpenAI API密钥)。您也可以明确提供嵌入模型以实现完全控制。
示例
真实答案 (Ground truth): 爱因斯坦于1879年出生在德国。
高正确性答案: 1879年,爱因斯坦出生于德国。
低正确性答案: 爱因斯坦于1879年出生在西班牙。
示例
from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.embeddings.base import embedding_factory
from ragas.metrics.collections import AnswerCorrectness
# Setup LLM and embeddings
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
embeddings = embedding_factory("openai", model="text-embedding-3-small", client=client)
# Create metric
scorer = AnswerCorrectness(llm=llm, embeddings=embeddings)
# Evaluate
result = await scorer.ascore(
user_input="When was the first super bowl?",
response="The first superbowl was held on Jan 15, 1967",
reference="The first superbowl was held on January 15, 1967"
)
print(f"Answer Correctness Score: {result.value}")
输出
同步用法
如果你偏好同步代码,可以使用 .score() 方法来代替 .ascore()
计算
让我们来计算一下那个低正确性答案的得分。该分数是事实正确性与给定答案和真实答案之间的语义相似度之和。
事实正确性量化了生成答案与真实答案之间的事实重叠程度。这是通过以下概念来完成的: - TP (真阳性): 同时出现在真实答案和生成答案中的事实或陈述。 - FP (假阳性): 出现在生成答案中但未出现在真实答案中的事实或陈述。 - FN (假阴性): 出现在真实答案中但未出现在生成答案中的事实或陈述。
在第二个示例中: - TP: [爱因斯坦出生于1879年] - FP: [爱因斯坦出生于西班牙] - FN: [爱因斯坦出生于德国]
现在,我们可以使用F1分数的公式,根据这些列表中每个陈述的数量来量化正确性。
接下来,我们计算生成答案和真实答案之间的语义相似度。点击此处阅读更多相关信息。
一旦我们得到语义相似度,我们就会将它与上面计算出的事实相似度进行加权平均,从而得出最终分数。您可以通过修改weights参数来调整这个权重。
旧版指标 API
以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面显示的基于集合的 API。
弃用时间表
此 API 将在 0.4 版本中被弃用,并在 1.0 版本中被移除。请迁移到上面显示的基于集合的 API。
使用数据集的示例
from datasets import Dataset
from ragas.metrics import answer_correctness
from ragas import evaluate
data_samples = {
'question': ['When was the first super bowl?', 'Who won the most super bowls?'],
'answer': ['The first superbowl was held on Jan 15, 1967', 'The most super bowls have been won by The New England Patriots'],
'ground_truth': ['The first superbowl was held on January 15, 1967', 'The New England Patriots have won the Super Bowl a record six times']
}
dataset = Dataset.from_dict(data_samples)
score = evaluate(dataset,metrics=[answer_correctness])
score.to_pandas()