评估端到端检索与生成

Evaluating basic end-to-end retrieval and generation

引言

检索增强生成(RAG)流程由检索阶段(获取相关文档)与生成阶段(由 LLM 基于文档回答问题)串联而成。要全面衡量系统表现,既需要分别评估检索与生成两个独立组件,也需要评估端到端的整体输出。本课聚焦于开发阶段的评估方法,主要利用标注测试集与离线自动化指标开展评测。

在开发阶段,团队通常使用包含“查询、相关文档与参考答案”的标注数据集,通过自动化指标量化检索准确性与回答质量,从而获得快速、可复现的反馈,尽早定位问题并指导迭代。相比之下,生产环境评估则侧重于监测真实用户交互(如点击率、用户评分与 A/B 测试),重点关注用户满意度及业务关键绩效指标(KPI)。

RAG 流程的评估阶段

基础 RAG 架构包含两个核心阶段,需分别开展单元评估并配合端到端整体评估:

  • 检索阶段:检索器根据用户查询从知识库中召回相关文本块或文档,评估重点在于能否准确找回所需信息。
  • 生成阶段:LLM 结合用户查询与检索上下文生成回答,评估重点在于回答相对于问题和上下文的准确性、相关性与连贯性。

将两个阶段拆开评估,有助于区分问题究竟出在检索端(如漏检关键上下文或混入无关文档),还是出在生成端(LLM 未能正确利用上下文);在此基础上结合端到端评估,进一步检验最终回答能否正确、完整地解答用户问题。

评估检索组件

图 1 · 检索评估与授权范围
飞书演示资料
保修政策与记录;记录来源 ID 与语料版本
OpenAPI 读取
按类型、权限与分页获取;缺失内容停止索引
分块与 embedding
同一模型处理文档和查询;检查长度、数量与维度
Qdrant 授权查询
租户 + 可读来源 ID 过滤;结果返回前复核权限
JSONL 参考集合
问题 + 参考资料 ID;包含无权限与未知问题
检索指标
Precision / Recall / MRR;单独报告失败与拒答
飞书演示资料 → OpenAPI 读取 → 分块与 embedding → Qdrant 授权查询 → JSONL 参考集合 → 检索指标

检索阶段评估通常依赖已知“每个问题对应哪些相关文档”的标注测试集(参考集),并采用信息检索领域的标准指标:

  • Precision@K(前 K 项精确率):前 KKK 个检索结果中相关文档所占的比例。数值越高,说明召回结果中真正有用的内容占比越高。例如 Precision@5 = 0.6 表示前 5 个文本块中有 60% 与问题相关。当希望送入上下文的正确文档尽可能多、干扰内容尽可能少时,精确率非常关键;它也有助于调整召回数量 KKK,或决定重排序后保留多少篇文档。
  • Recall@K(前 K 项召回率):前 KKK 个检索结果覆盖的相关文档数占知识库中全部相关文档数的比例,用于衡量信息覆盖完整度。例如 Recall@10 = 0.8 表示前 10 个结果覆盖了 80% 的相关信息。较高的召回率有助于确保回答所需的必要事实被检索出来。
  • F1@K:Precision@K 与 Recall@K 的调和平均数,将二者合并为单一分数,便于在精确率与召回率之间做平衡取舍。较高的 F1@K 表明检索器既能找回大部分正确信息,又能较好地控制无关内容数量。
  • 平均倒数排名(Mean Reciprocal Rank,MRR):对每个查询取第一个相关文档所在排名的倒数,再对所有查询求平均值。MRR 重点考量相关结果的排序位置:MRR = 1.0 是理想情况,表示每次查询排在第一位的结果均相关;分数较低则意味着相关内容排位靠后。当任务通常只需命中最关键的一篇文档并希望其排在最前时,MRR 尤为实用。

在实际应用中,应根据系统实际送入提示词的文档数量来设定 KKK(例如 5 或 10)。RAG 系统通常需要较高的召回率以集齐回答所需的全部事实;但精确率同样不可忽视,因为混入上下文的无关文本可能会干扰 LLM 的生成过程,或导致回答夹带多余信息。因此,工程上需同时监测精确率与召回率,兼顾上下文的针对性与完整性。

面向上下文的检索质量指标

除传统信息检索指标外,RAG 专项评估还可以直接衡量检索到的上下文对回答问题的实际贡献:

  • 上下文相关性(Context Relevance):评估检索上下文是否切合查询,以及是否主要包含回答问题所需的信息。理想情况下,上下文仅包含必要信息;混入的无关文本越多,相关性得分越低。高分说明检索结果的信噪比较高。
  • 上下文召回率(Context Recall):衡量检索器是否找齐了回答问题所需的全部信息。一种常见计算方式是逐项核对参考答案中的关键事实是否均出现在检索文档中——若上下文缺失关键事实,得分便会下降。高分说明关键事实得到了充分覆盖。

这两项指标有助于引导检索阶段尽可能找齐正确信息,同时减少无关噪声。

评估生成组件

图 2 · 生成评估与引用检查
问题与授权上下文
只提供当前用户可读资料;保留分块 ID
结构化模型
STRUCTURED endpoint / model;回答、引用与依据不足标志
Pydantic 验证
字段、类型与额外内容;拒绝截断或无效输出
引用检查
引用必须来自检索结果;来源版本保持一致
参考答案与 judge
本地人工检查为基础;judge / embedding 单独配置
评估报告
事实、引用、拒答与成本;固定数据集和提示词版本
问题与授权上下文 → 结构化模型 → Pydantic 验证 → 引用检查 → 参考答案与 judge → 评估报告

检索到相关文档后,生成阶段需从事实正确性、与问题的相关性、语言流畅度以及对来源材料的忠实度等维度开展评估。按数据集条件可分为两类场景:

  • 有参考答案的评估:当测试集提供标准答案或参考输出时,可直接比对模型回答与参考答案。
  • 无参考答案的评估:面对开放式问题或缺少标准答案标注的数据,重点检查回答与检索上下文之间的事实一致性,或借助人工评审与 LLM 评判质量。

传统的参考答案指标

当存在参考答案时,可使用经典 NLP 指标比对生成文本与参考文本:

  • Exact Match(精确匹配)与 F1:Exact Match 检验模型回答的字符串是否与标准答案完全一致;token 级 F1 则采用更宽松的比对方式,衡量模型回答与参考答案之间的词语重合度。
  • BLEU(Bilingual Evaluation Understudy):计算生成文本相对于参考文本的 n-gram 重合精确率,统计模型回答中有多少词语或短语出现在参考文本中。BLEU 分数越高,表明二者在词汇表述上越接近。
  • ROUGE(Recall-Oriented Understudy for Gisting Evaluation):常用于摘要任务,衡量相对于参考文本的 n-gram 召回率。在问答任务中,它可以检查模型答案是否包含足够多的参考关键词。较高 ROUGE 表示覆盖了较多参考文本中的词语,可用于检查要点是否得到表达。
    • 注意:作为召回导向的指标,ROUGE 可能会给冗长回答打出偏高的分数,解读时应结合精确率指标共同分析。

传统参考答案指标计算便捷且客观,但开放式生成的语言表达具有多样性——两段措辞完全不同的回答完全可能表达相同的正确事实。研究表明,单纯的字面词语重合指标与回答的真实质量相关性可能较低,使用时需注意其局限性。

检查答案正确性与事实性

检索问答的核心目标是提供事实准确的回答。当存在标准答案时,可以直接衡量准确率(在判断题或选择题中定义明确);对于开放式问答,则可采用 LLM-as-a-judge(如 Answer Accuracy 指标),让评判模型对照参考答案按等级打分(例如 0 表示错误、1 表示部分正确、2 表示完全正确),再换算为指标分数,从而兼容语义等价的不同表述。

除比对参考答案外,还需重点检查生成内容与检索上下文之间的事实一致性(即忠实度)及切题程度:

  • 忠实度(Faithfulness):衡量答案中的事实或论断是否都得到检索上下文支持。评估会将答案与来源文本块比较,模型加入缺少上下文依据的信息时,分数会降低。RAGAS 的一种实现方式是将答案划分为独立陈述,再使用 LLM 或字符串匹配逐项核验。分数通常介于 0 和 1 之间,表示有多少陈述能够在检索文档中找到依据或由其推断得到。分数为 1 表示答案完全有提供的证据支持。即使答案听起来合理,如果缺少上下文依据,忠实度仍会较低,因此该指标有助于发现幻觉。开发阶段应标记低忠实度答案并进行审查,它们可能包含幻觉,也可能反映检索问题。
    • 注意:使用现成评估框架时需了解其底层计算逻辑。例如,RAGAS 在评估单条查询时可能会发起多次 LLM 评判调用,从而增加评估费用。
  • 答案相关性与完整性(Answer Relevancy):检验回答是否真正回应了用户的提问。模型有时虽然准确复述了文档中的某些事实,却答非所问。Answer Relevancy(可借助 LLM 评判)专门评估回答与问题的直接相关程度,会对离题、夹带冗余信息或仅回答了部分问题的输出扣分。该指标侧重于检验是否切题及回应是否完整,需与事实正确性指标配合使用。

总结而言,生成阶段需同时把关语言表现(现代 LLM 通常已具备良好的语法与流畅度)和内容质量(事实是否正确、是否忠于检索来源、是否相关且完整地回答了问题),工程上可结合参考答案比对与模型评判来综合量化。

用企业知识资料评估检索与生成

本节评估集与Sprint 0《实践环节》贯通练习共用同一份飞书演示语料。检索阶段按来源 ID(source_ids)计算检索指标,生成阶段对照参考答案并核验引用有效性;权限撤回、空页面、资料已删除与未知问题等边界情况需分别独立记录,错误次数保留在最终评估报告中。

examples/pipeline.pyPython
def evaluate_local(index, principal, dataset_path):
    results = []
    for line in Path(dataset_path).read_text().splitlines():
        item = json.loads(line)
        contexts = index.retrieve(principal, item['input']['question'])
        results.append({'id': item['id'], **retrieval_score(item['expected_output']['source_ids'], contexts)})
    return results

下载贯通示例、环境模板与脱敏练习数据。向量 top-k 只产生近邻;“未发布型号”案例要求相关性判定或拒答阈值。fixture 的固定向量用于验证代码,不用于估计检索精度。

需要使用模型评判时,应参照官方文档显式配置 RAGAS judge 与 embedding,避免回退到框架默认的外部提供商:

examples/ragas_eval.pyPython
import json
import os
from pathlib import Path

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from ragas import EvaluationDataset, evaluate
from ragas.llms import LangchainLLMWrapper
from ragas.embeddings import LangchainEmbeddingsWrapper
from ragas.metrics import Faithfulness, ResponseRelevancy


def run(path='ragas-input.jsonl'):
    judge = LangchainLLMWrapper(ChatOpenAI(model=os.environ['STRUCTURED_MODEL'],
        base_url=os.environ['STRUCTURED_BASE_URL'], api_key=os.environ['STRUCTURED_API_KEY'],
        temperature=0.1, timeout=30, max_retries=2))
    embedding = LangchainEmbeddingsWrapper(OpenAIEmbeddings(model=os.environ['EMBEDDING_MODEL'],
        base_url=os.environ['EMBEDDING_BASE_URL'], api_key=os.environ['EMBEDDING_API_KEY'],
        dimensions=int(os.environ['EMBEDDING_DIMENSIONS']), check_embedding_ctx_length=False, chunk_size=10))
    dataset = EvaluationDataset.from_list([json.loads(line) for line in Path(path).read_text().splitlines()])
    return evaluate(dataset, metrics=[Faithfulness(llm=judge), ResponseRelevancy(llm=judge, embeddings=embedding)],
                    llm=judge, embeddings=embedding, raise_exceptions=True)


if __name__ == '__main__':
    print(run())

练习:先输出本地资料级检索与引用指标,再人工抽检回答内容与引用对应关系;使用模型评判时,单独记录评判模型名称、地域、参数配置、调用费用及失败案例。

下载示例中的 retrieval_score 计算资料级集合 Precision/Recall,不等于按排名计算的 Recall@k。对空参考集,示例自定义“无检索结果计 1,否则计 0”的约定;应将这类样本的拒答表现单独报告,避免和正常检索样本混为一个分数。

搜索课程

正在加载课程目录…