为什么RAG评估如此困难

评估一个RAG系统远比评估一个传统的分类或回归模型困难。原因有三:首先,RAG的效果取决于两个组件的协同——检索器找到的文档是否相关(检索质量),以及生成器基于这些文档产生的回答是否准确(生成质量)。任何一个环节出了问题,最终效果都会打折扣。其次,评估标准主观性强——什么算"好的回答"?不同用户、不同场景可能有完全不同的标准。第三,缺乏标准化的测试集——每个RAG应用的知识库都不同,通用的评估数据集难以反映真实效果。

然而,没有度量就没有改进。你需要知道你的RAG系统在哪些方面表现好、哪些方面需要优化,才能有针对性地进行改进。本文将建立一个三层次的RAG评估框架,帮你从"感觉效果好"升级到"数据证明效果好"。

第一层:检索质量评估

检索质量评估关注的是"检索器是否找到了正确的文档"。核心指标包括:Recall@k(在返回的前k个结果中,有多少比例的相关文档被找到),这是最重要的检索指标——如果你连找都找不到,后面的生成环节再好也没用。MRR(Mean Reciprocal Rank)(第一个相关文档出现排名的倒数平均值),衡量检索系统把最相关文档排在前面的能力。NDCG@k(Normalized Discounted Cumulative Gain)(考虑排序位置权重的归一化累积增益),不仅考虑是否相关,还考虑相关的程度(部分相关vs完全相关)和排序位置。

要计算这些指标,你需要一个标注好的测试集——对于每个查询,标注哪些文档是相关的。这可以通过人工标注(质量高但成本高)或让LLM自动标注(成本低但可能有偏差)来实现。

import numpy as np
from openai import OpenAI

client = OpenAI(api_key="your-deepseek-api-key", base_url="https://api.deepseek.com")

class RetrievalEvaluator:
    def __init__(self):
        self.metrics = {}

    def recall_at_k(self, retrieved_ids, relevant_ids, k):
        """Recall@k:前k个结果中覆盖了多少相关文档"""
        top_k = set(retrieved_ids[:k])
        relevant = set(relevant_ids)
        if not relevant:
            return 0.0
        return len(top_k & relevant) / len(relevant)

    def mrr(self, retrieved_ids, relevant_ids):
        """MRR:第一个相关文档排名的倒数"""
        relevant = set(relevant_ids)
        for i, doc_id in enumerate(retrieved_ids):
            if doc_id in relevant:
                return 1.0 / (i + 1)
        return 0.0

    def evaluate_all(self, test_queries):
        """批量评估"""
        recalls = {1:[], 3:[], 5:[], 10:[]}
        mrrs = []
        for q in test_queries:
            retrieved = q["retrieved_ids"]
            relevant = q["relevant_ids"]
            for k in recalls:
                recalls[k].append(self.recall_at_k(retrieved, relevant, k))
            mrrs.append(self.mrr(retrieved, relevant))
        result = {
            f"Recall@{k}": np.mean(v) for k, v in recalls.items()
        }
        result["MRR"] = np.mean(mrrs)
        return result

evaluator = RetrievalEvaluator()
test_data = [
    {"retrieved_ids":[1,3,5,7,9], "relevant_ids":[3,7]},
    {"retrieved_ids":[2,4,6,8,10], "relevant_ids":[4,6,10]},
]
results = evaluator.evaluate_all(test_data)
for metric, value in results.items():
    print(f"{metric}: {value:.3f}")

第二层:生成质量评估

生成质量评估关注的是"基于检索到的文档,模型生成的回答质量如何"。核心指标包括:Faithfulness(忠实度):生成的回答是否忠实于检索到的文档,没有编造不存在的信息(幻觉)。这是RAG系统最重要的生成质量指标。Answer Relevance(答案相关性):生成的回答是否与用户的问题直接相关,没有跑题。Context Relevance(上下文相关性):检索到的文档是否与用户问题相关(如果检索到的都是无关文档,后面的生成注定失败)。

评估这些指标最实用的方法是使用LLM-as-a-Judge——用一个更强的LLM(如DeepSeek)来评估另一个LLM的输出。虽然这引入了一定的评估偏差,但在缺乏人工标注的情况下,这是最可行的方案。RAGAS框架就是将这套方法系统化的最佳工具。

class GenerationEvaluator:
    def evaluate_faithfulness(self, answer, context):
        """评估回答是否忠实于上下文(是否有幻觉)"""
        prompt = f"""请评估以下回答是否忠实于提供的上下文。

上下文:
{context}

回答:
{answer}

请判断回答中的每个陈述是否都能在上下文中找到依据。
以JSON格式输出:
{{
  "score": 0-1的评分,
  "hallucinations": ["编造的陈述1", "编造的陈述2"],
  "reasoning": "评估理由"
}}"""
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[{"role":"user","content":prompt}],
            temperature=0.1
        )
        return response.choices[0].message.content

    def evaluate_relevance(self, answer, question):
        """评估回答与问题的相关性"""
        prompt = f"""问题:{question}
回答:{answer}

评估回答是否直接针对问题,没有偏题。
JSON: {{"score": 0-1, "reasoning":""}}"""
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[{"role":"user","content":prompt}],
            temperature=0.1
        )
        return response.choices[0].message.content

eval_gen = GenerationEvaluator()
faithfulness = eval_gen.evaluate_faithfulness(
    "Python是一种解释型语言。",
    "Python是Guido van Rossum创建的编程语言,支持多种编程范式。"
)

第三层:端到端评估

端到端评估从用户视角出发,评估整个RAG系统的表现。常见方法包括:A/B测试(将用户随机分配到不同版本的RAG系统,对比关键业务指标如满意度、任务完成率)、人工评估(让标注人员按统一标准打分,包括准确性、完整性、流畅性、有用性四个维度)、自动基准测试(使用公开的RAG评估数据集如RGB、CRUD-RAG等进行标准化评估)。端到端评估是最终的试金石——检索和生成评分再高,如果用户不满意,系统就是失败的。

建立持续评估体系

RAG评估不是一次性的活动,而应该是持续的过程。建议建立三层评估体系:上线前使用离线评估(标注数据集+自动化指标)确保基础质量;上线后使用在线评估(收集用户反馈+抽样人工审核)持续监控;定期(每周/每月)进行回归评估,防止系统退化。将评估结果可视化到仪表盘上,让团队能直观看到各项指标的变化趋势。

RAGAS框架实战

RAGAS(Retrieval Augmented Generation Assessment)是目前最流行的开源RAG评估框架。它提供了一套标准化的评估指标和自动化评估流程。RAGAS的核心思想是:将每个评估维度分解为LLM可判断的子问题,让DeepSeek等模型自动打分。使用RAGAS的典型流程:准备评估数据(包括问题、标准答案、检索到的上下文和生成的回答),调用RAGAS的评估函数,获得faithfulness、answer_relevancy、context_precision、context_recall等指标。需要注意的是,LLM-as-Judge虽然方便,但并非100%可靠。建议定期(如每月)抽取部分评估样本进行人工复核,校准自动评分的准确性。在线评估与生产监控:离线评估只能反映模型在测试集上的表现,不能完全代表线上真实效果。生产环境中,应该设置在线评估指标——用户点赞率、点踩率、复制率(用户是否复制了AI的回答)、分享率、以及用户是否继续追问(如果用户反复问类似问题,说明AI第一次没答好)。这些指标虽然不如离线指标精确,但能实时反映用户体验,适合作为每日监控的北极星指标。建议在运营Dashboard中同时展示离线评估趋势(每周更新)和在线指标趋势(实时更新),两个方面对照着看,才能对RAG系统的质量有全面的把握。

想亲手编排这个技能链?

在技能链中打开 →