跳转到内容

响应相关性

回答相关性

回答相关性 (Answer Relevancy) 指标衡量响应与用户输入的相关程度。其取值范围为 0 到 1,分数越高表示与用户输入的对齐程度越好。

如果一个回答直接且恰当地解决了原始问题,那么它就被认为是相关的。该指标关注回答与问题意图的匹配程度,而不评估事实的准确性。它会对不完整或包含不必要细节的回答进行惩罚。

该指标使用 user_inputresponse 按以下方式计算

  1. 根据响应生成一组人工问题(默认为 3 个)。这些问题旨在反映响应的内容。
  2. 计算用户输入的嵌入 (\(E_o\)) 与每个生成问题的嵌入 (\(E_{g_i}\)) 之间的余弦相似度。
  3. 取这些余弦相似度分数的平均值,得到回答相关性
\[ \text{回答相关性} = \frac{1}{N} \sum_{i=1}^{N} \text{cosine similarity}(E_{g_i}, E_o) \]
\[ \text{回答相关性} = \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,可通过 strictness 参数配置)。

注意:虽然分数通常在 0 到 1 之间,但由于余弦相似度的数学范围是 -1 到 1,因此不能保证分数一定在此区间内。

示例

from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.embeddings.base import embedding_factory
from ragas.metrics.collections import AnswerRelevancy

# Setup LLM and embeddings
client = AsyncOpenAI()
llm = llm_factory("gpt-4o-mini", client=client)
embeddings = embedding_factory("openai", model="text-embedding-3-small", client=client)

# Create metric
scorer = AnswerRelevancy(llm=llm, embeddings=embeddings)

# Evaluate
result = await scorer.ascore(
    user_input="When was the first super bowl?",
    response="The first superbowl was held on Jan 15, 1967"
)
print(f"Answer Relevancy Score: {result.value}")

输出

Answer Relevancy Score: 0.9165088378587264

同步用法

如果你偏好同步代码,可以使用 .score() 方法来代替 .ascore()

result = scorer.score(
    user_input="When was the first super bowl?",
    response="The first superbowl was held on Jan 15, 1967"
)

计算方法

示例

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

低相关性回答:法国在西欧。

高相关性回答:法国在西欧,巴黎是它的首都。

为了计算回答与给定问题的相关性,我们遵循两个步骤

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

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

其基本概念是,如果回答正确地解决了问题,那么仅从回答中就很有可能重构出原始问题。

旧版指标 API

以下示例使用旧版指标 API 模式。对于新项目,我们建议使用上面显示的基于集合的 API。

弃用时间表

此 API 将在 0.4 版本中被弃用,并在 1.0 版本中被移除。请迁移到上面显示的基于集合的 API。

使用 SingleTurnSample 的示例

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)

输出

0.9165088378587264