理论篇:RAG评估指标,检索指标与生成指标①


本系列阅读:
理论篇:RAG评估指标,检索指标与生成指标①
实践篇:利用ragas在自己RAG上实现LLM评估②

RAG评估

如果RAG没有系统性的评估,你永远不知道:

  • 你的系统是否是最优的
  • 你的修改是否真的带来了改进
  • 问题到底出在检索环节还是生成环节

RAG系统的核心流程可以简化为检索组件答案生成组件,评估RAG即对两部分组件效果进行评估。

若检索组件效果不好,我们优化方案:rank模型+混合检索
若答案生成效果不好,我们的优化方案是:选更大的大模型

检索指标:评估"找到正确信息"的能力

在RAG的检索评估中,我们基本上是在做一个二分类:文档是否与查询相关。

实际相关实际不相关
被系统检索真正例(TP)假正例(FP)
未被检索假负例(FN)真负例(TN)

检索组件负责从知识库中找到与用户问题相关的信息。以下是我常用的几个指标:

1. 精确度(Precision)—常用

精确度(Precision):检索到的文档中有多大比例是真正相关的?
公式: P r e c i s i o n = 真正例 ( T P ) 真正例 ( T P ) + 假正例 ( F P ) Precision = \frac{真正例(TP)}{真正例(TP) + 假正例(FP)} Precision=真正例(TP)+假正例(FP)真正例(TP)

做医疗诊断工具会特别关注这个指标,因为误报(错误信息)可能导致严重后果。

2. 召回率(Recall)—常用

召回率(Recall):成功检索到了多大比例的相关文档?
公式: R e c a l l = 真正例 ( T P ) 真正例 ( T P ) + 假负例 ( F N ) Recall = \frac{真正例(TP)}{真正例(TP) + 假负例(FN)} Recall=真正例(TP)+假负例(FN)真正例(TP)

做法律研究工具时,这个指标尤其重要。漏掉一个关键判例可能会影响整个案件结果!

3. 命中率(Hit Rate)

命中率(Hit Rate):有多大比例的查询在前几个结果中至少检索到了一个相关文档?
公式: H i t R a t e @ K = 至少有一个相关文档出现在前 K 个结果中的查询数量 查询总数 HitRate@K = \frac{至少有一个相关文档出现在前K个结果中的查询数量}{查询总数} HitRate@K=查询总数至少有一个相关文档出现在前K个结果中的查询数量

4. 平均倒数排名(MRR, Mean Reciprocal Rank)

平均倒数排名(MRR, Mean Reciprocal Rank):第一个相关文档在搜索结果中平均排在第几位?
公式: M R R = 1 ∣ Q ∣ ∑ i = 1 ∣ Q ∣ 1 r a n k i MRR = \frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{1}{rank_i} MRR=Q1i=1Qranki1

其中,|Q|是查询总数,rank_i是第i个查询的第一个相关文档的排名。

举个例子,假设有3个查询:

  • 查询1:第一个相关文档排在第1位,所以倒数排名是1/1=1
  • 查询2:第一个相关文档排在第3位,所以倒数排名是1/3
  • 查询3:第一个相关文档排在第2位,所以倒数排名是1/2

那么MRR = (1 + 1/3 + 1/2) / 3 ≈ 0.61

MRR的值越接近1,表示相关文档在结果列表中的排名越靠前,用户找到所需信息的速度就越快。

这个指标在用户通常只关注前几个结果的系统中特别有价值,比如搜索引擎。用户很少翻到第二页,对吧?

5. 标准化折扣累积增益(NDCG)

标准化折扣累积增益(NDCG):同时考虑检索文档的相关性和排名顺序。
公式: N D C G @ K = D C G @ K I D C G @ K NDCG@K = \frac{DCG@K}{IDCG@K} NDCG@K=IDCG@KDCG@K

其中:
D C G @ K = ∑ i = 1 K r e l i log ⁡ 2 ( i + 1 ) DCG@K = \sum_{i=1}^{K} \frac{rel_i}{\log_2(i+1)} DCG@K=i=1Klog2(i+1)reli

I D C G @ K = ∑ i = 1 ∣ R E L ∣ r e l i log ⁡ 2 ( i + 1 ) IDCG@K = \sum_{i=1}^{|REL|} \frac{rel_i}{\log_2(i+1)} IDCG@K=i=1RELlog2(i+1)reli

  • rel_i是第i个文档的相关性分数
  • |REL|是相关文档的总数,最大为K
  • IDCG是理想情况下的DCG值(相关文档按相关性降序排列)

如果你的系统需要返回一个排序列表(比如推荐系统),这个指标特别有用。

生成指标:评估"利用信息回答问题"的能力

即使检索到了正确信息,生成的答案质量也可能参差不齐。这些是我评估生成组件时使用的指标及其公式:

1. 忠实度(Faithfulness)—常用

忠实度(Faithfulness):我们经常说的大模型幻觉,就是该指标的描述。具体来说忠诚度是指 生成的答案与检索上下文的一致性。

公式: F a i t h f u l n e s s = 支持的声明数量 总声明数量 Faithfulness = \frac{支持的声明数量}{总声明数量} Faithfulness=总声明数量支持的声明数量

更精确地说,忠实度可以通过以下步骤计算:

  1. 将生成的回答分解为多个事实性声明
  2. 检查每个声明是否能从检索到的文档中得到支持
  3. 计算得到支持的声明比例

这个指标帮助确保模型不会"编造"不在检索内容中的信息。如果发现模型经常"幻觉",这个指标会迅速下降。

实际操作中,我们不会人工做上面判断步骤,而是用另一个LLM来自动评估忠实度,我给它检索到的文档和生成的答案,然后让它评估每个声明是否有支持证据。在一个实验中,通过改进检索质量和调整提示词,我们将忠实度从0.72提升到0.91,这大大减少了"幻觉"问题。

2. 答案相关性(Answer Relevance)—常用

答案相关性(Answer Relevance):生成的答案与原始查询的相关程度如何?

公式:通常使用语义相似度度量,例如余弦相似度:

R e l e v a n c e = c o s i n e _ s i m i l a r i t y ( q u e r y _ e m b e d d i n g , a n s w e r _ e m b e d d i n g ) Relevance = cosine\_similarity(query\_embedding, answer\_embedding) Relevance=cosine_similarity(query_embedding,answer_embedding)

或者使用基于LLM的评分:

R e l e v a n c e = L L M _ s c o r e ( q u e r y , a n s w e r , s c a l e = 0 − 1 ) Relevance = LLM\_score(query, answer, scale=0-1) Relevance=LLM_score(query,answer,scale=01)

这个指标确保模型在使用检索信息的同时,不会偏离用户的原始问题。有时模型会返回检索文档中的信息,但这些信息与用户的问题并不直接相关,这种情况下相关性分数会很低。

在我们的客户服务机器人项目中,通过优化提示词中强调"直接回答用户问题"的部分,我们将相关性从0.65提高到0.83,用户反馈明显改善。

3. 答案正确性(Answer Correctness)

答案正确性(Answer Correctness):生成的答案与参考答案的一致程度如何?

公式有多种实现方式,常见的包括:

  1. 基于文本重叠的方法
    C o r r e c t n e s s = F 1 ( g e n e r a t e d _ a n s w e r , r e f e r e n c e _ a n s w e r ) Correctness = F1(generated\_answer, reference\_answer) Correctness=F1(generated_answer,reference_answer)

    其中F1分数结合了精确度和召回率:
    F 1 = 2 ∗ P r e c i s i o n ∗ R e c a l l P r e c i s i o n + R e c a l l F1 = 2 * \frac{Precision * Recall}{Precision + Recall} F1=2Precision+RecallPrecisionRecall

  2. 基于语义相似度的方法
    C o r r e c t n e s s = s e m a n t i c _ s i m i l a r i t y ( g e n e r a t e d _ a n s w e r , r e f e r e n c e _ a n s w e r ) Correctness = semantic\_similarity(generated\_answer, reference\_answer) Correctness=semantic_similarity(generated_answer,reference_answer)

  3. 基于LLM评分的方法
    C o r r e c t n e s s = L L M _ s c o r e ( g e n e r a t e d _ a n s w e r , r e f e r e n c e _ a n s w e r , s c a l e = 0 − 1 ) Correctness = LLM\_score(generated\_answer, reference\_answer, scale=0-1) Correctness=LLM_score(generated_answer,reference_answer,scale=01)

当你有一组基准答案可以比较时,这个指标特别有用。在实践中,我发现基于LLM的评分方法通常比简单的文本匹配效果更好,因为它能捕捉到意义上的等价性,即使表述不同。

在我们的技术支持知识库项目中,通过使用这个指标不断调整检索和生成策略,我们最终将答案正确性从0.69提高到0.88,这让支持团队更加信任系统的输出。

4. 上下文精确率(Context Precision)

上下文精确率(Context Precision):实际使用了多少检索内容?

公式: C o n t e x t P r e c i s i o n = 使用的上下文块数量 提供的上下文块总数量 Context Precision = \frac{使用的上下文块数量}{提供的上下文块总数量} ContextPrecision=提供的上下文块总数量使用的上下文块数量

这个指标衡量了模型在多大程度上真正利用了我们提供的上下文信息。如果模型只用了20%的检索内容就给出了完整答案,这可能意味着我们检索了太多无关内容,或者检索结果中有大量冗余。

在优化RAG系统时,我发现提高上下文精确率不仅可以减少token消耗(降低成本),还能提高生成质量。我们通过优化检索方法和减少冗余,将上下文精确率从0.35提升到0.72,同时生成质量也有所提高。

5. 上下文召回率(Context Recall)

上下文召回率(Context Recall):答案需要的信息有多少被包含在检索内容中?

公式: C o n t e x t R e c a l l = 答案中用到的且出现在上下文中的信息量 理想情况下回答完整所需的全部信息量 Context Recall = \frac{答案中用到的且出现在上下文中的信息量}{理想情况下回答完整所需的全部信息量} ContextRecall=理想情况下回答完整所需的全部信息量答案中用到的且出现在上下文中的信息量

这个指标评估我们检索的内容是否足够完整地支持回答问题。如果上下文召回率低,意味着即使模型尽力了,也无法基于给定的检索内容提供完整答案。

在一个产品技术文档项目中,我们发现某些复杂问题的上下文召回率只有0.53,意味着模型无法完整回答问题。通过调整检索数量和改进切块策略,我们将这个指标提高到0.89,大大提升了复杂问题的回答质量。

### RAG 架构中的重排序概念及其功能 #### 重排序的定义 在 RAG(Retrieval-Augmented Generation)架构中,重排序是指种优化过程,在此过程中,初步检索到的相关文档会被进评估和重新排列,以提高最终返回结果的质量。这种方法通常用于解决初始检索可能存在的噪声或不精确匹配问题[^3]。 #### 重排序的功能 重排序的主要目标是提升文档召回的相关性和精度。具体来说,它通过对候选文档集合进行二次筛选和评分调整,使得最相关的文档能够被优先考虑并传递至生成模型阶段。这种方式特别适用于需要高精准度的知识密集型应用场景,例如法律咨询、医学诊断等领域。 #### 实现重排序的关键步骤 尽管具体的实现细节会因项目需求和技术栈的不同而有所差异,但般可以概括为以下几个核心环节: 1. **初始化检索** 使用基础检索技术(如关键词检索、向量检索等),获取组潜在相关文档作为输入集。 2. **特征提取打分** 针对每候选文档,计算其相对于查询语句的相关性得分。这些分数可以通过多种方式得出,比如基于相似度算法或者机器学习模型预测的结果。 3. **综合评价再排序** 将上述得到的各项指标融合起来形成新的排名依据,并据此重新安排各文档的位置顺序。这个阶段可能会引入额外的信息源(例如用户反馈历史记录)来辅助决策。 4. **输出精炼列表** 经过以上处理之后,只有那些被认为高度关联的目标材料才会进入下步——即由生成组件负责构建最终回复内容的过程[^4]。 以下是简单的伪代码展示如何执行基本形式下的“混合检索+重排序”操作: ```python def hybrid_retrieval(query, index): keyword_results = perform_keyword_search(query, index) vector_results = perform_vector_similarity(query, index) combined_results = merge_and_rank(keyword_results, vector_results) reranked_results = apply_reranking_model(combined_results, query) return top_n(reranked_results) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

非常大模型

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

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

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

打赏作者

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

抵扣说明:

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

余额充值