示例代码
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进行循环处理:


448

被折叠的 条评论
为什么被折叠?



