响应相关性
响应相关性
ResponseRelevancy
指标专注于评估生成的答案与给定提示的相关性。不完整或包含冗余信息的答案会获得较低的分数,而相关性更好的答案会获得较高的分数。该指标通过 user_input
、retrived_contexts
和 response
计算得出。
答案相关性定义为原始 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: 计算生成的问题与实际问题之间的平均余弦相似度。
其基本概念是,如果答案正确地回答了问题,那么仅从答案中重建原始问题的可能性就很高。