RAGAS的ContextPrecision指标分析

示例代码

ragas版本:0.4.2

ContextPrecision指标使用:

https://docs.ragas.io/en/stable/concepts/metrics/available_metrics/context_precision/

import os

from openai import AsyncOpenAI
from ragas.llms import llm_factory
from ragas.metrics.collections import ContextPrecision

# -----------------------------------------------------------------------------
# 1. 设置 LLM 客户端
# -----------------------------------------------------------------------------
# 初始化 OpenAI 异步客户端。
# 这里从环境变量中获取 API Key 和 Base URL,通常用于连接兼容 OpenAI 接口的服务商(如 DeepSeek, Moonshot 等)。
async_openai_client = AsyncOpenAI(
    api_key=os.environ.get("OPENAI_API_KEY"),
    base_url=os.environ.get("OPENAI_BASE_URL")
)

# -----------------------------------------------------------------------------
# 2. 配置评估模型 (Evaluator LLM)
# -----------------------------------------------------------------------------
# 使用 ragas 的工厂方法创建一个 LLM 实例。
#evaluator_llm = llm_factory("kimi-k2-thinking-turbo", client=async_openai_client)
# max_tokens: 设置生成的最大 token 数,防止输出截断
evaluator_llm = llm_factory("deepseek-v3.2", client=async_openai_client, max_tokens=32768)

# -----------------------------------------------------------------------------
# 3. 创建评估指标
# -----------------------------------------------------------------------------
# 初始化 ContextPrecision 指标对象。
# ContextPrecision 用于衡量检索到的上下文中有多少是与标准答案(Reference)真正相关的。
# 我们将上面配置好的 evaluator_llm 传递给它,作为裁判模型。
contextPrecision = ContextPrecision(llm=evaluator_llm)

# -----------------------------------------------------------------------------
# 4. 执行评估
# -----------------------------------------------------------------------------
# 调用 score 方法计算分数。
# - user_input: 用户提出的问题。
# - reference: 问题的标准答案 (Ground Truth)。
# - retrieved_contexts: RAG 系统检索回来的文档片段列表(Contexts)。
result = contextPrecision.score(
    user_input="埃菲尔铁塔位于哪里?",
    reference="埃菲尔铁塔位于巴黎。",
    retrieved_contexts=[
        "埃菲尔铁塔位于巴黎。",       # 相关文档 (主要依据)
        "勃兰登堡门位于柏林。"         # 干扰/不相关文档
    ]
)

# -----------------------------------------------------------------------------
# 5. 输出结果
# -----------------------------------------------------------------------------
# 打印计算出的精确度分数。
# 分数越高 (接近 1.0),说明检索到的内容中相关内容的排序越靠前且干扰越少。
print(f"Context Precision Score: {
     
     result.value}")

源码分析

源码位置:ragas\metrics\collections\context_precision\metric.py

async def ascore(
    self, user_input: str, reference: str, retrieved_contexts: List[str]
) -> MetricResult:
    """
    Calculate context precision score using reference.

    Args:
        user_input: The question being asked
        reference: The reference answer to compare against
        retrieved_contexts: The retrieved contexts to evaluate

    Returns:
        MetricResult with context precision score (0.0-1.0, higher is better)
    """
    # Input validation
    if not user_input:
        raise ValueError("user_input cannot be empty")
    if not reference:
        raise ValueError("reference cannot be empty")
    if not retrieved_contexts:
        raise ValueError("retrieved_contexts cannot be empty")

    # Evaluate each retrieved context
    verdicts = []
    for context in retrieved_contexts:
        # Create input data and generate prompt
        input_data = ContextPrecisionInput(
            question=user_input, context=context, answer=reference
        )
        prompt_string = self.prompt.to_string(input_data)
        result = await self.llm.agenerate(prompt_string, ContextPrecisionOutput)
        verdicts.append(result.verdict)

    # Calculate average precision
    score = self._calculate_average_precision(verdicts)
    return MetricResult(value=float(score))

def _calculate_average_precision(self, verdicts: List[int]) -> float:
    """Calculate average precision from binary verdicts. Matches legacy logic exactly."""
    verdict_list = verdicts
    denominator = sum(verdict_list) + 1e-10
    numerator = sum(
        [
            (sum(verdict_list[: i + 1]) / (i + 1)) * verdict_list[i]
            for i in range(len(verdict_list))
        ]
    )
    score = numerator / denominator

    if np.isnan(score):
        # Match legacy warning behavior
        import logging

        logging.warning(
            "Invalid response format. Expected a list of dictionaries with keys 'verdict'"
        )

    return score

针对retrieved_contexts进行循环处理:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shulu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值