Skip to content

事实正确性

事实正确性

FactualCorrectness 是一种用于比较和评估生成 responsereference 之间事实准确性的指标。该指标用于确定生成响应与参考之间的一致程度。事实正确性评分范围从 0 到 1,数值越高表示性能越好。为了衡量响应与参考之间的一致性,该指标首先使用 LLM 将响应和参考分解为声明,然后使用自然语言推理来确定响应与参考之间的事实重叠。事实重叠通过精确率、召回率和 F1 分数来量化,这些可以通过 mode 参数进行控制。

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

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

计算精确率、召回率和 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="埃菲尔铁塔位于巴黎。",
    reference="埃菲尔铁塔位于巴黎。它的高度为 1000 英尺。"
)

scorer = FactualCorrectness()
scorer.llm = openai_model
await scorer.single_turn_ascore(sample)

默认情况下,模式设置为 F1,您可以通过设置 mode 参数将其更改为 precisionrecall

scorer = FactualCorrectness(mode="precision")

控制声明数量

响应和参考中的每个句子可以分解为一个或多个声明。从单个句子生成的声明数量由应用程序所需的 atomicitycoverage 级别决定。

示例

scorer = FactualCorrectness(mode="precision",atomicity="low")

理解 Atomicity 和 Coverage

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

  1. Atomicity
  2. Coverage

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

Atomicity

Atomicity 指的是句子被分解为其最小、有意义的组成部分的程度。可以根据您是需要高度详细的声明还是更整合的视图来调整。

  • 高 Atomicity:句子被分解为其基本、不可分割的声明。这将导致多个较小的声明,每个声明代表一个独立的信息片段。

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

  • 低 Atomicity:句子保持更完整,导致较少的声明可能包含多个信息片段。

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

Coverage

Coverage 指的是声明如何全面地代表原始句子中的信息。可以调整以包含所有细节或概括内容。

  • 高 Coverage:分解的声明捕捉原始句子中的所有信息,保留每一个细节。

示例: - 原始句子: - "玛丽·居里是一位波兰和法国籍物理学家和化学家,她对放射性进行了开创性研究。" - 分解声明: - "玛丽·居里是一位波兰物理学家。" - "玛丽·居里是一位法国籍物理学家。" - "玛丽·居里是一位化学家。" - "玛丽·居里对放射性进行了开创性研究。"

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

示例: - 原始句子: - "玛丽·居里是一位波兰和法国籍物理学家和化学家,她对放射性进行了开创性研究。" - 分解声明: - "玛丽·居里是一位物理学家。" - "玛丽·居里进行了放射性研究。"

结合原子性和覆盖率

通过调整原子性和覆盖率,您可以自定义详细程度和完整性,以满足特定用例的需求。

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

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

  • 低原子性 & 低覆盖率:生成较少且细节较少的声明,总结主要思想而不深入具体细节。

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

实际应用

  • 当需要详细的全面分解以进行深入分析或信息提取时,使用高原子性和高覆盖率
  • 当只需要关键信息时,例如用于总结,使用低原子性和低覆盖率

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