回答相关性
回答相关性
`ResponseRelevancy` 指标衡量回答与用户输入的关联程度。分数越高表示与用户输入越匹配,分数越低则表示回答不完整或包含冗余信息。
该指标使用 user_input
和 response
按如下方式计算
- 基于回答生成一组人工问题(默认为 3 个)。这些问题旨在反映回答的内容。
- 计算用户输入嵌入 (\(E_o\)) 与每个生成问题嵌入 (\(E_{g_i}\)) 之间的余弦相似度。
- 对这些余弦相似度分数取平均值,得到**回答相关性 (Answer Relevancy)**
\[ \text{Answer Relevancy} = \frac{1}{N} \sum_{i=1}^{N} \text{cosine similarity}(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,因此无法保证总是如此。
如果回答直接且恰当地回应了原始问题,则被认为是相关的。此指标侧重于回答与问题意图的匹配程度,但不评估事实准确性。它会惩罚不完整或包含不必要细节的回答。
示例
from ragas import SingleTurnSample
from ragas.metrics import ResponseRelevancy
sample = SingleTurnSample(
user_input="When was the first super bowl?",
response="The first superbowl was held on Jan 15, 1967",
retrieved_contexts=[
"The First AFL–NFL World Championship Game was an American football game played on January 15, 1967, at the Los Angeles Memorial Coliseum in Los Angeles."
]
)
scorer = ResponseRelevancy(llm=evaluator_llm, embeddings=evaluator_embeddings)
await scorer.single_turn_ascore(sample)
计算方法
示例
问题:法国在哪里?首都是什么?
低相关性回答:法国位于西欧。
高相关性回答:法国位于西欧,巴黎是它的首都。
为了计算回答与给定问题的相关性,我们遵循两个步骤
-
步骤 1: 使用大型语言模型 (LLM) 从生成的回答中反向生成 'n' 个问题变体。例如,对于第一个回答,LLM 可能会生成以下可能的问题
- 问题 1: "法国位于欧洲的哪个部分?"
- 问题 2: "法国在欧洲处于什么地理位置?"
- 问题 3: "你能指出法国在欧洲的哪个区域吗?"
-
步骤 2: 计算生成的问题与实际问题之间的平均余弦相似度。
其基本概念是,如果回答正确地回应了问题,那么很有可能仅凭回答就可以重构出原始问题。