Skip to content

响应相关性

响应相关性

ResponseRelevancy 指标专注于评估生成的答案与给定提示的相关性。不完整或包含冗余信息的答案会获得较低的分数,而相关性更好的答案会获得较高的分数。该指标通过 user_inputretrived_contextsresponse 计算得出。

答案相关性定义为原始 user_input 与根据 response 生成(逆向工程)的若干人工问题的平均余弦相似度:

\[ \text{answer relevancy} = \frac{1}{N} \sum_{i=1}^{N} cos(E_{g_i}, E_o) \]
\[ \text{answer relevancy} = \frac{1}{N} \sum_{i=1}^{N} \frac{E_{g_i} \cdot E_o}{\|E_{g_i}\|\|E_o\|} \]

其中:

  • \(E_{g_i}\) 是生成的第 \(i\) 个问题的嵌入。
  • \(E_o\) 是原始问题的嵌入。
  • \(N\) 是生成的提问数量,默认为 3。

请注意,尽管在实践中分数大多会在 0 到 1 之间,但由于余弦相似度的范围是 -1 到 1,这在数学上并不能保证。

当答案直接且恰当地回答了原始问题时,我们认为它是相关的。重要的是,我们对答案相关性的评估不考虑事实性,而是惩罚那些不完整或包含冗余细节的答案。为了计算这个分数,我们让 LLM 多次为生成的答案生成适当的问题,并测量这些生成问题与原始问题之间的平均余弦相似度。其基本思想是,如果生成的答案准确地回答了最初的问题,LLM 应该能够从答案中生成与原始问题一致的问题。

示例

from ragas import SingleTurnSample 
from ragas.metrics import ResponseRelevancy

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

scorer = ResponseRelevancy()
await scorer.single_turn_ascore(sample)

计算方法

示例

问题:法国位于哪里,它的首都是什么?

低相关性答案:法国位于西欧。

高相关性答案:法国位于西欧,巴黎是其首都。

为了计算答案对给定问题的相关性,我们遵循以下两个步骤:

  • 步骤1: 使用大型语言模型(LLM)从生成的答案中逆向工程出 'n' 个问题变体。 例如,对于第一个答案,LLM 可能会生成以下可能的问题:

    • 问题1: "法国位于欧洲的哪个部分?"
    • 问题2: "法国在欧洲的地理位置是什么?"
    • 问题3: "你能指出法国在欧洲的哪个地区吗?"
  • 步骤2: 计算生成的问题与实际问题之间的平均余弦相似度。

其基本概念是,如果答案正确地回答了问题,那么仅从答案中重建原始问题的可能性就很高。