RAG质量评估实施RAG工程核心步骤

发布时间:2026/6/26 6:16:56
RAG质量评估实施RAG工程核心步骤 RAG 三元组#标准的 RAG 流程就是用户提出 Query 问题RAG 应用去召回 Context然后 LLM 将 Context 组装生成满足 Query 的 Response 回答。那么在这里出现的三元组:—— Query、Context 和 Response 就是 RAG 整个过程中最重要的三元组它们之间两两相互牵制。我们可以通过检测三元组之间两两元素的相关度来评估这个 RAG 应用的效果Context Relevance:衡量召回的 Context 能够支持 Query 的程度。如果该得分低反应出了召回了太多与Query 问题无关的内容这些错误的召回知识会对 LLM 的最终回答造成一定影响。Groundedness:衡量 LLM 的 Response 遵从召回的 Context 的程度。如果该得分低反应出了 LLM 的回答不遵从召回的知识那么回答出现幻觉的可能就越大。Answer Relevance:衡量最终的 Response 回答对 Query 提问的相关度。如果该得分低反应出了可能答不对题Ragas评估#什么是Ragas评估#官网地址RagasRagas (Retrieval-Augmented Generation Assessment) 它是一个框架它可以帮助我们来快速评估RAG系统的性能为了评估RAG系统Ragas需要以下信息:question用户输入的问题。answer从 RAG 系统生成的答案(由LLM给出)。contexts根据用户的问题从外部知识源检索的上下文即与问题相关的文档。ground_truths 人类提供的基于问题的真实(正确)答案。 这是唯一的需要人类提供的信息。评估指标#Ragas提供了五种评估指标忠实度#忠实度(faithfulness)衡量了生成的答案(answer)与给定上下文(context)的事实一致性。它是根据answer和检索到的context计算得出的。并将计算结果缩放到 (0,1) 范围且越高越好。如果答案(answer)中提出的所有基本事实(claims)都可以从给定的上下文(context)中推断出来则生成的答案被认为是忠实的。为了计算这一点首先从生成的答案中识别一组claims。然后将这些claims中的每一项与给定的context进行交叉检查以确定是否可以从给定的context中推断出它。忠实度分数由以下公式得出:结果范围是(0,1)越接近 1说明回答越 “忠实” 于上下文没有编造越接近 0说明模型幻觉严重很多内容都是瞎编的示例:问题(question):爱因斯坦出生于何时何地?上下文(context):阿尔伯特·爱因斯坦(Albert Einstein1879年3月14日出生)是一位出生于德国的理论物理学家被广泛认为是有史以来最伟大和最有影响力的科学家之一高忠实度答案:爱因斯坦1879年3月14日出生于德国低忠实度答案:爱因斯坦于1879年3月20日出生于德国答案相关性#“答案相关性”重点评估生成的答案(answer)与用户问题(question)之间相关程度。不完整或包含冗余信息的答案将获得较低分数。该指标是通过计算question和answer获得的它的取值范围在 0 到 1 之间其中分数越高表示相关性越好。当答案直接且适当地解决原始问题时该答案被视为相关。重要的是我们对答案相关性的评估不考虑真实情况而是对答案缺乏完整性或包含冗余细节的情况进行惩罚。为了计算这个分数LLM会被提示多次为生成的答案生成适当的问题并测量这些生成的问题与原始问题之间的平均余弦相似度。基本思想是如果生成的答案准确地解决了最初的问题LLM应该能够从答案中生成与原始问题相符的问题示例:问题(question):法国在哪里首都是哪里?低相关性答案:法国位于西欧。高相关性答案:法国位于西欧巴黎是其首都。上下文精度#上下文精度是一种衡量标准它评估所有在上下文(contexts)中呈现的与基本事实(ground-truth)相关的条目是否排名较高。理想情况下所有相关文档块(chunks)必须出现在顶层。该指标使用question和计算contexts值范围在 0 到 1 之间其中分数越高表示精度越高。上下文召回率#上下文召回率(Context recall)衡量检索到的上下文(Context)与人类提供的真实答案(ground truth)的一致程度。它是根据ground truth和检索到的Context计算出来的取值范围在 0 到 1 之间值越高表示性能越好。为了根据真实答案(ground truth)估算上下文召回率(Context recall)分析真实答案中的每个句子以确定它是否可以归因于检索到的Context。 在理想情况下真实答案中的所有句子都应归因于检索到的Context。假设真实文本GT共有 10 句话其中有 8 句话的信息都能在参考上下文里找到。那么上下文召回率1080.880%示例:问题(question):法国在哪里首都是哪里?基本事实(Ground truth):法国位于西欧其首都是巴黎。高的上下文召回率(High context recall):法国位于西欧拥有中世纪城市、高山村庄和地中海海滩。其首都巴黎以其时装屋、卢浮宫等古典艺术博物馆和埃菲尔铁塔等古迹而闻名。低的上下文召回率(Low context recall):法国位于西欧拥有中世纪城市、高山村庄和地中海海滩。该国还以其葡萄酒和精致的美食而闻名。拉斯科的古代洞穴壁画、里昂的罗马剧院和宏伟的凡尔赛宫都证明了其丰富的历史。上下文相关性#该指标衡量检索到的上下文(Context)的相关性根据用户问题(question)和上下文(Context)计算得到并且取值范围在 (0, 1)之间值越高表示相关性越好。理想情况下检索到的Context应只包含解答question的信息。 我们首先通过识别检索到的Context中与回答question相关的句子数量来估计 |S| 的值。 最终分数由以下公式确定假设模型从知识库中检索到了 10 句上下文其中有 7 句话和用户的问题是相关的。那么上下文相关性1070.770%示例:问题(question):法国的首都是哪里?高的上下文相关性(Context relevancy):法国位于西欧拥有中世纪城市、高山村庄和地中海海滩。其首都巴黎以其时装屋、卢浮宫等古典艺术博物馆和埃菲尔铁塔等古迹而闻名。低的上下文相关性(Context relevancy):西欧的法国包括中世纪城市、高山村庄和地中海海滩。其首都巴黎以其时装屋、卢浮宫等古典艺术博物馆和埃菲尔铁塔等古迹而闻名。该国还以其葡萄酒和精致的美食而闻名。拉斯科的古代洞穴壁画、里昂的罗马剧院和宏伟的凡尔赛宫都证明了其丰富的历史。父文档检索器#文档切割时传统的做法是使用像CharacterTextSplitter, RecursiveCharacterTextSplitter这样的文档分割器将文档按指定的块大小(chunk_size)来均匀的切割文档然后将每个文档块做向量化处理(Embedding)后将其保存到向量数据库中而当我们在做文档检索时会将用户的问题转换成的向量与向量数据库中的文档块的向量做相似度计算并从中获取k个与用户问题向量相似度最高的文档块(也就是和用户问题相关的文档块)然后我们会把用户的问题以及相关的文档块一起发送给LLM, 最后LLM会给出一个对用户友好的回复。这就是一般的传统文档检索的方法。传统检索方法其实存在一定的局限性这是因为文档块的大小会影响和用户问题的匹配度也就是说当我们切割的文档块越大时它与用户问题的匹配度就会越低当文档块越小时它与用户问题的匹配度会越高这是因为较大的文档块可能会包含较多的内容当它被转换成一个固定维度的向量时该向量可能不能够准确反应出该文档块中的所有内容因而对用户问题的匹配度就会降低而小的文档块包含的内容较少当它被转换成一个固定维度的向量时该向量基本能够准确反应出该文档块中的内容,因此它与用户问题的匹配度会教高但是较小的文档块可能因为所包含的信息量较少因而它可能不是一个全面且正确的答案。为了解决这些问题今天来介绍Langchain中的父文档检索器它能够有效的解决文档块大小与用户问题匹配的问题。步骤中文名称核心作用①原始文档输入待处理的完整文档②文档分层拆分将文档拆分为「父文档大块 子文档小块」建立关联 ID③子文档向量存储只对子文档生成向量并存入向量数据库④向量检索用户提问时用问题向量匹配找到最相关的子文档小块⑤关联父文档根据子文档的 ID找回对应的完整父文档大块⑥上下文注入把完整的父文档作为上下文传给大模型⑦生成回答大模型基于完整上下文生成连贯、信息完整的回答由于我们在利用大模型进行文档检索的时候常常会有相互矛盾的需求比如希望得到较小的文档块以便它们Embedding以后能够最准确地反映出文档的含义如果文档块太大Embedding就失去了意义。希望得到较大的文档块以保留教多的内容然后将它们发送给LLM以便得到全面且正确的答案。面对这样矛盾的需求Langchain的父文档检索器为我们提供了两种有效的解决方案检索完整文档检索较大的文档块