跳到内容

事实准确性

事实准确性

`FactualCorrectness` 是一种衡量生成 `response` 与 `reference` 事实准确性的指标。此指标用于确定生成回复与参考资料的一致程度。事实准确性得分范围为 0 到 1,得分越高表示性能越好。为了衡量回复与参考资料之间的一致性,该指标首先使用LLM将回复和参考资料分解为声明,然后使用自然语言推理来确定回复和参考资料之间的事实重叠。事实重叠使用精确率(precision)、召回率(recall)和F1分数进行量化,可以通过 `mode` 参数控制。

计算真阳性 (TP)、假阳性 (FP) 和假阴性 (FN) 的公式如下:

\[ \text{真阳性 (TP)} = \text{回应中存在于参考中的信息点数量} \]
\[ \text{假阳性 (FP)} = \text{回应中不存在于参考中的信息点数量} \]
\[ \text{假阴性 (FN)} = \text{参考中不存在于回应中的信息点数量} \]

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

\[ \text{精确率} = {TP \over (TP + FP)} \]
\[ \text{召回率} = {TP \over (TP + FN)} \]
\[ \text{F1 分数} = {2 \times \text{精确率} \times \text{召回率} \over (\text{精确率} + \text{召回率})} \]

示例

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)
输出
0.67

默认情况下,模式设置为 `F1`,您可以通过设置 `mode` 参数将模式更改为 `precision` 或 `recall`。

scorer = FactualCorrectness(llm = evaluator_llm, mode="precision")
输出
1.0

控制声明数量

回复和参考资料中的每个句子都可以分解为一个或多个声明。从单个句子生成的声明数量取决于您的应用程序所需的 `atomicity` 和 `coverage` 水平。

示例

scorer = FactualCorrectness(mode="precision",atomicity="low")
输出
1.0

理解原子性和覆盖度

在声明分解中,有两个重要参数会影响输出

  1. 原子性
  2. 覆盖度

这些参数有助于控制生成声明的粒度和完整性。

原子性

原子性 指的是将一个句子分解成其最小、有意义的组成部分的程度。可以根据您需要高度详细的声明还是更整合的视图进行调整。

  • 高原子性:将句子分解为其基本、不可分割的声明。这将产生多个更小的声明,每个声明代表一个不同的信息片段。

示例: - 原始句子: - “阿尔伯特·爱因斯坦是德国理论物理学家,他发展了相对论并对量子力学做出了贡献。” - 分解后的声明: - “阿尔伯特·爱因斯坦是德国理论物理学家。” - “阿尔伯特·爱因斯坦发展了相对论。” - “阿尔伯特·爱因斯坦对量子力学做出了贡献。”

  • 低原子性:句子保持更完整,产生的声明数量较少,可能包含多个信息片段。

示例: - 原始句子: - “阿尔伯特·爱因斯坦是德国理论物理学家,他发展了相对论并对量子力学做出了贡献。” - 分解后的声明: - “阿尔伯特·爱因斯坦是德国理论物理学家,他发展了相对论并对量子力学做出了贡献。”

覆盖度

覆盖度 指的是声明在多大程度上全面代表了原始句子中的信息。可以调整以包含所有细节或概括内容。

  • 高覆盖度:分解后的声明捕获了原始句子中存在的所有信息,保留了每个细节。

示例: - 原始句子: - “玛丽·居里是波兰裔和入籍法国的物理学家和化学家,她在放射性领域进行了开创性研究。” - 分解后的声明: - “玛丽·居里是波兰裔物理学家。” - “玛丽·居里是入籍法国的物理学家。” - “玛丽·居里是一名化学家。” - “玛丽·居里在放射性领域进行了开创性研究。”

  • 低覆盖度:分解后的声明仅涵盖主要观点,省略了一些细节以提供更概括性的视图。

示例: - 原始句子: - “玛丽·居里是波兰裔和入籍法国的物理学家和化学家,她在放射性领域进行了开创性研究。” - 分解后的声明: - “玛丽·居里是一名物理学家。” - “玛丽·居里在放射性领域进行了研究。”

结合原子性和覆盖度

通过调整原子性和覆盖度,您可以自定义细节和完整性的级别,以满足您的特定使用案例的需求。

  • 高原子性 & 高覆盖度:生成高度详细和全面的声明,涵盖原始句子的所有方面。

示例: - 原始句子: - “查尔斯·巴贝奇是英国数学家、哲学家、发明家和机械工程师。” - 分解后的声明: - “查尔斯·巴贝奇是英国数学家。” - “查尔斯·巴贝奇是哲学家。” - “查尔斯·巴贝奇是发明家。” - “查尔斯·巴贝奇是机械工程师。”

  • 低原子性 & 低覆盖度:生成较少且细节较少的声明,概括主要思想而不深入具体内容。

示例: - 原始句子: - “查尔斯·巴贝奇是英国数学家、哲学家、发明家和机械工程师。” - 分解后的声明: - “查尔斯·巴贝奇是英国数学家。” - “查尔斯·巴贝奇是发明家。”

实际应用

  • 当您需要详细全面的分解进行深入分析或信息提取时,请使用高原子性和高覆盖度
  • 仅当需要关键信息时(例如进行摘要时),请使用低原子性和低覆盖度

这种控制声明数量的灵活性有助于确保信息以适合您应用程序要求的粒度级别呈现。