Skip to content

真实度

忠实度

忠实度指标衡量生成的答案与给定上下文之间的事实一致性。它根据答案和检索到的上下文计算得出。答案被缩放到(0,1)范围内。数值越高越好。

如果答案中的所有声明都可以从给定的上下文中推断出来,那么生成的答案就被认为是忠实的。为了计算这一点,首先从生成的答案中识别出一组声明。然后,将这些声明逐一与给定的上下文进行交叉检查,以确定它们是否可以从上下文中推断出来。忠实度得分由以下公式给出:

\[ \text{忠实度得分} = {|\text{生成的答案中可以从给定上下文中推断出的声明数量}| \over |\text{生成的答案中的总声明数量}|} \]

示例

from ragas.database_schema import SingleTurnSample 
from ragas.metrics import Faithfulness

sample = SingleTurnSample(
        user_input="第一届超级碗是什么时候?",
        response="第一届超级碗是在1967年1月15日举行的",
        retrieved_contexts=[
            "第一届AFL-NFL世界冠军赛是美国橄榄球比赛,于1967年1月15日在洛杉矶纪念体育馆举行。"
        ]
    )
scorer = Faithfulness()
await scorer.single_turn_ascore(sample)

使用HHEM-2.1-Open的忠实度

Vectara的HHEM-2.1-Open是一个分类器模型(T5),经过训练可以检测LLM生成文本中的幻觉。该模型可以在计算忠实度的第二步中使用,即在声明与给定上下文进行交叉检查以确定是否可以从上下文中推断出来时使用。该模型是免费的、小型的、开源的,因此在生产用例中非常高效。要使用该模型计算忠实度,可以使用以下代码片段:

from ragas.database_schema import SingleTurnSample 
from ragas.metrics import FaithfulnesswithHHEM


sample = SingleTurnSample(
        user_input="第一届超级碗是什么时候?",
        response="第一届超级碗是在1967年1月15日举行的",
        retrieved_contexts=[
            "第一届AFL-NFL世界冠军赛是美国橄榄球比赛,于1967年1月15日在洛杉矶纪念体育馆举行。"
        ]
    )
scorer = FaithfulnesswithHHEM()
await scorer.single_turn_ascore(sample)

您可以通过设置device参数将模型加载到指定设备上,并使用batch_size参数调整推理的批量大小。默认情况下,模型加载在CPU上,批量大小为10。

my_device = "cuda:0"
my_batch_size = 10

scorer = FaithfulnesswithHHEM(device=my_device, batch_size=my_batch_size)
await scorer.single_turn_ascore(sample)

计算方法

示例

问题: 爱因斯坦出生在哪里,什么时候?

上下文: 阿尔伯特·爱因斯坦(1879年3月14日出生)是一位德国出生的理论物理学家,被广泛认为是历史上最伟大和最有影响力的科学家之一。

高忠实度答案: 爱因斯坦于1879年3月14日出生在德国。

低忠实度答案: 爱因斯坦于1879年3月20日出生在德国。

让我们看看如何使用低忠实度答案计算忠实度:

  • 步骤1: 将生成的答案分解为单独的陈述。

    • 陈述:
      • 陈述1: "爱因斯坦出生在德国。"
      • 陈述2: "爱因斯坦出生于1879年3月20日。"
  • 步骤2: 对于每个生成的陈述,验证它是否可以从给定的上下文中推断出来。

    • 陈述1: 是
    • 陈述2: 否
  • 步骤3: 使用上述公式计算忠实度。

    \[ \text{忠实度} = { \text{1} \over \text{2} } = 0.5 \]