事实正确性
事实正确性
FactualCorrectness 是一个比较和评估生成响应与参考事实准确性的指标。此指标用于确定生成响应与参考对齐的程度。事实正确性分数范围从 0 到 1,分数越高表示性能越好。
为了衡量响应与参考之间的对齐程度,该指标使用 LLM 首先将响应和参考分解为声明,然后使用自然语言推理来确定响应和参考之间的事实重叠。事实重叠使用精确率、召回率和 F1 分数进行量化,可以通过 mode 参数进行控制。
示例
python
from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.metrics.collections import FactualCorrectness
# Setup LLM
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
# Create metric
scorer = FactualCorrectness(llm=llm)
# Evaluate
result = await scorer.ascore(
response="The Eiffel Tower is located in Paris.",
reference="The Eiffel Tower is located in Paris. It has a height of 1000ft."
)
print(f"Factual Correctness Score: {result.value}")
输出:
text
Factual Correctness Score: 0.67
默认情况下, mode 设置为 f1 。您可以通过设置 mode 参数将模式更改为 precision 或 recall :
python
# Precision mode - measures what fraction of response claims are supported by reference
scorer = FactualCorrectness(llm=llm, mode="precision")
result = await scorer.ascore(
response="The Eiffel Tower is located in Paris.",
reference="The Eiffel Tower is located in Paris. It has a height of 1000ft."
)
print(f"Precision Score: {result.value}")
输出:
text
Precision Score: 1.0
您还可以使用 atomicity 和 coverage 参数配置声明分解的粒度:
python
# High granularity - more detailed claim decomposition
scorer = FactualCorrectness(
llm=llm,
mode="f1",
atomicity="high", # More atomic claims
coverage="high" # Comprehensive coverage
)
同步用法
如果你更喜欢同步代码,可以使用 .score() 方法代替 .ascore() :
python
result = scorer.score(
response="The Eiffel Tower is located in Paris.",
reference="The Eiffel Tower is located in Paris. It has a height of 1000ft."
)
计算方式
计算真阳性(TP)、假阳性(FP)和假阴性(FN)的公式如下:

计算精确率、召回率和 F1 分数的公式如下:

控制声明数量
响应和参考中的每个句子都可以分解为一个或多个声明。从单个句子生成的声明数量由应用程序所需的原子性和覆盖级别决定。
示例
python
scorer = FactualCorrectness(mode="precision",atomicity="low")
输出:
1.0
理解原子性和覆盖
在声明分解中,两个重要参数影响输出:
- 原子性
- 覆盖
这些参数有助于控制生成声明的粒度和完整性。
原子性
原子性指句子被分解为其最小、有意义组件的程度。可以根据是否需要高度详细的声明或更整合的视图进行调整。
- 高原子性 :句子被分解为其基本、不可分割的声明。这会产生多个较小的声明,每个代表一条独特的信息。
示例 :
- 原始句子 :"阿尔伯特·爱因斯坦是一位德国理论物理学家,他发展了相对论并对量子力学做出了贡献。"
- 分解的声明 :
- "阿尔伯特·爱因斯坦是一位德国理论物理学家。"
- "阿尔伯特·爱因斯坦发展了相对论。"
- "阿尔伯特·爱因斯坦对量子力学做出了贡献。"
- 低原子性 :句子保持更完整,产生较少的声明,可能包含多条信息。
示例 :
- 原始句子 :"阿尔伯特·爱因斯坦是一位德国理论物理学家,他发展了相对论并对量子力学做出了贡献。"
- 分解的声明 :
- "阿尔伯特·爱因斯坦是一位德国理论物理学家,他发展了相对论并对量子力学做出了贡献。"
覆盖
覆盖指声明代表原始句子中信息的全面程度。可以调整为包含所有细节或概括内容。
- 高覆盖 :分解的声明捕获原始句子中存在的所有信息,保留每个细节。
示例 :
- 原始句子 :"玛丽·居里是一位波兰裔和归化法国的物理学家和化学家,她进行了关于放射性的开创性研究。"
- 分解的声明 :
- "玛丽·居里是一位波兰裔物理学家。"
- "玛丽·居里是一位归化法国的物理学家。"
- "玛丽·居里是一位化学家。"
- "玛丽·居里进行了关于放射性的开创性研究。"
- 低覆盖 :分解的声明仅覆盖主要要点,省略一些细节以提供更概括的视图。
示例 :
- 原始句子 :"玛丽·居里是一位波兰裔和归化法国的物理学家和化学家,她进行了关于放射性的开创性研究。"
- 分解的声明 :
- "玛丽·居里是一位物理学家。"
- "玛丽·居里进行了关于放射性的研究。"
组合原子性和覆盖
通过调整原子性和覆盖,您可以自定义细节级别和完整性以满足特定用例的需求。
高原子性 & 高覆盖 :产生高度详细和全面的声明,覆盖原始句子的所有方面。
示例 :
- 原始句子 :"查尔斯·巴贝奇是一位英国数学家、哲学家、发明家和机械工程师。"
- 分解的声明 :
- "查尔斯·巴贝奇是一位英国数学家。"
- "查尔斯·巴贝奇是一位哲学家。"
- "查尔斯·巴贝奇是一位发明家。"
- "查尔斯·巴贝奇是一位机械工程师。"
- 低原子性 & 低覆盖 :产生较少的声明且细节较少,总结主要思想而不深入具体细节。
示例 :
- 原始句子 :"查尔斯·巴贝奇是一位英国数学家、哲学家、发明家和机械工程师。"
- 分解的声明 :
- "查尔斯·巴贝奇是一位英国数学家。"
- "查尔斯·巴贝奇是一位发明家。"
实际应用
- 当您需要详细和全面的分解以进行深入分析或信息提取时,使用 高原子性和高覆盖 。
- 当仅需要关键信息时,使用 低原子性和低覆盖 ,例如用于摘要。
这种控制声明数量的灵活性有助于确保信息以适合您应用程序需求的粒度级别呈现。
旧版指标 API
以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面展示的基于集合(collections)的 API。
弃用时间表
此 API 将在 0.4 版本中弃用,并在 1.0 版本中移除。请迁移到上面展示的基于集合的 API。
使用 SingleTurnSample 的示例
python
from ragas.dataset_schema import SingleTurnSample
from ragas.metrics._factual_correctness import FactualCorrectness
sample = SingleTurnSample(
response="The Eiffel Tower is located in Paris.",
reference="The Eiffel Tower is located in Paris. I has a height of 1000ft."
)
scorer = FactualCorrectness(llm = evaluator_llm)
await scorer.single_turn_ascore(sample)
输出:
text
0.67
更改模式
默认情况下,模式设置为 F1 ,您可以通过设置 mode 参数将模式更改为 precision 或 recall 。
python
scorer = FactualCorrectness(llm = evaluator_llm, mode="precision")
输出:
text
1.0
控制原子性
python
scorer = FactualCorrectness(mode="precision", atomicity="low")
输出:
text
1.0