RAG评估

RAG评估

RAG(Retrieval-Augmented Generation)评估一直以来都是一个非常令人头疼的问题。单纯依靠指标或使用 LLM-as-a-Judge 并不能全面地评估生成内容的质量。在这里,我将结合工业界实习中的一些实际经验,分享关于 RAG 评估的一些做法和思考。

RAG评估的核心维度

RAG 的评估需要从 相关性事实性 两个维度进行考量。

RAG的难点

1. 如何建立知识向量库

构建高质量的知识向量库是 RAG 系统的基础,而以下几个因素都会对下游链路的结果产生重要影响:

2. 检索优化

用户提出的问题质量是影响 RAG 生成效果的主要因素。如果用户的问题模糊且指向不明,检索效率就会大大降低,从而导致生成结果质量下降。然而,我们无法,也不应该要求用户提出的每一个问题都是高质量问题。

因此,检索前优化的目标是 改善用户提问的质量。即便面对糟糕的用户提问,RAG 系统也需要具备将其转换并拓展为一系列高质量问题的能力。

3. 归纳总结

对于模型生成的内容,其全面性、生成格式以及生成效果的稳定性往往很难控制。换句话说,目前针对模型输出内容的可控性尚未达到理想水平。

针对检索环节的评估

在检索环节,常用的一种评估指标是 MRR(Mean Reciprocal Rank,平均倒数排名)。MRR 是一种用于衡量信息检索系统表现的指标,尤其适用于搜索引擎或推荐系统等场景,用来评估系统返回结果与查询的相关性。

MRR计算方法

MRR 的计算公式为:

MRR=1|Q|i=1|Q|1ranki

其中:

在结果列表中:

最终得分为所有查询得分之和,再取平均值。

MRR的意义

示例计算

假设我们有 3 个查询,其对应的第一个相关结果排名如下:

  1. 第一个查询的第一个相关结果排在第 2 位(倒数排名 = 12)。
  2. 第二个查询的第一个相关结果排在第 5 位(倒数排名 = 15)。
  3. 第三个查询的第一个相关结果排在第 1 位(倒数排名 = 11)。

则 MRR 的计算过程如下:

MRR=13(12+15+11)=13×1.7=0.567

MRR代码实现

以下是 Python 实现 MRR 的代码示例:

def mean_reciprocal_rank(ranked_lists):
    mrr = 0.0
    for ranked_list in ranked_lists:
        reciprocal_rank = 0
        for rank, item in enumerate(ranked_list, start=1):
            if item == 1:  # Correct answer found
                reciprocal_rank = 1 / rank
                break
        mrr += reciprocal_rank
    return mrr / len(ranked_lists)

MRR 衡量标准

MRR 衡量的是相关结果首次出现的位置(越靠前越好),适用于多结果排序任务,如搜索引擎查询、推荐系统。


Hits Rate 命中率

命中率:前 K 项中包含正确信息的项的占比,评估召回相关文档的比率。


代码示例:计算 Precision


def calculate_precision(retrieved_docs, relevant_docs):
    relevant_retrieved_docs = [doc for doc in retrieved_docs if doc in relevant_docs]
    precision = len(relevant_retrieved_docs) / len(retrieved_docs) if retrieved_docs else 0
    return precision


衡量检索到的文档的全面性:它是检索到的相关文档数量与数据库中相关文档的总数之比。

---

### 代码示例:计算 Recall

```python

def calculate_recall(retrieved_docs, relevant_docs):
    relevant_retrieved_docs = [doc for doc in retrieved_docs if doc in relevant_docs]
    recall = len(relevant_retrieved_docs) / len(relevant_docs) if relevant_docs else 0
    return recall


NDCG:归一化折损累计增益

NDCG 的全称是 Normalized Discounted Cumulative Gain

DCG 的思想

在一个列表中,item 的顺序很重要,不同位置的贡献不同。一般来说,排在前面的 item 影响更大,排在后面的 item 影响较小。(例如一个返回的网页,肯定是排在前面的 item 会有更多人点击)。
DCG 使排在前面的 item 增加其影响,排在后面的 item 减弱其影响。

DCG 公式

DCGk=i=1krel(i)log2(i+1)

其中 rel(i) 是第 i 个 item 的相关性得分。

IDCG 和 NDCG

IDCG 是根据 rel(i) 降序排序后的最好状态的 DCG,因此可以得到 NDCG:

NDCG=DCGIDCG

针对生成环节的评估

在自然语言生成(NLG)任务中,评估生成内容的质量是一个至关重要的环节。针对生成环节的评估,可以从非量化和量化两个维度进行分析。

非量化评估

非量化评估主要关注生成内容的以下几个方面:

量化评估

量化评估通常使用一些文本相似性指标来衡量生成内容与参考答案之间的相似程度。这些指标包括但不限于:

通过结合非量化和量化评估,可以更加全面地衡量自然语言生成系统的性能。


意图分流评估

在目前主流的基于检索增强生成(RAG, Retrieval-Augmented Generation)的方法中,意图分流环节扮演了重要角色。尤其是 Agentic RAG 模型中,意图分流不仅用于解析用户意图,还可以通过调用特定功能(function call)来满足复杂需求。这一环节的效果对下游链路的准确性有着深远影响,因此需要对其进行详细评估。

分类任务评估

对于意图分流中的分类任务,可以采用一些常见的分类指标进行评估,例如:

这些指标能够有效衡量模型在意图分流任务中的表现。

Function Call 的评估

对于 function call 的评估,可以参考 ToolLearning Eval 的方法。该方法通过模拟实际场景中的工具调用,测试系统能否正确解析用户意图并调用合适的功能。这种方式能够有效验证系统在复杂场景下的鲁棒性和功能调用能力。


答案评估

对于生成答案的评估,需要重点关注其事实性和信息有效性。

事实性

事实性评估旨在验证生成答案的准确性。具体来说,可以将生成的答案与已验证事实的数据库进行比较,以识别其中的不准确之处。这种方法提供了一种无需人工干预即可检查信息有效性的自动化方式。

例如,假设我们有一个已验证事实的数据库 D,对于每个生成答案 A,我们可以定义一个比较函数 Compare(A,D) 来判断 A 是否符合数据库中的事实。

通过这种方式,可以显著提高对生成内容事实性的评估效率。


噪音评估

噪音文档是指那些与问题相关但不包含任何相关信息的文档。一个优秀的模型需要能够从这些噪声中提取有用的信息。因此,在噪音评估中,我们通常采用 精确匹配法 来衡量模型的表现。如果模型生成的文本与答案完全匹配,则视为正确答案。


分专项能力评估

为了更细致地分析模型在不同场景下的表现,我们可以从以下几个专项能力进行评估:

1. 易混淆实体

在检索到的文档中,经常会存在关键实体具有不同含义的情况。例如,同一个词可能在不同上下文中指代不同的对象。在这种情况下,模型在归纳总结时需要能够区分这些实体,而不是将其视为同一个概念进行总结。

2. 弱相关性

当检索到的文档没有一篇强相关,或者存在两篇描述同一事件但一篇内容正确、另一篇内容错误时,模型需要具备择优能力。这种能力要求模型能够对比文档内容,并选择更为可信的信息。

3. Function Call

对于需要进行补充搜索或调用外部API工具的场景(即 Function Call 的 case),我们需要评估模型在链路中的相关能力。这不仅包括调用外部工具的准确性,还包括补充搜索的效率和效果。

4. 时效性

对于具有强时效性的场景,模型在归纳时需要优先利用最新的资料进行回答。为了实现这一点,可以参考模型的注意力机制,将最新的文档放置在注意力最强的位置,从而提升回答的准确性。

5. 拒答

当系统无法找到任何好结果时,是否能够合理地拒绝回答也是评估的重要内容之一。拒答可以分为以下两种情况:


开源RAG评估框架

在开源社区中,有多个针对检索增强生成(Retrieval-Augmented Generation, RAG)的评估框架。以下是两个重要的工具及其核心功能:

1. Ragas

Ragas 是一个主要用于评估忠实性、答案相关性和上下文相关性的框架,其核心评估指标包括:

(1)忠实性

答案应基于给定的上下文。换句话说,检索到的上下文需要能够作为生成答案的理由。这一指标确保了答案来源的可靠性。

忠实性=基于上下文生成的正确答案数总答案数

(2)答案相关性

生成的答案应针对所提供的问题,而不是偏离主题或提供无关信息。

(3)上下文相关性

检索到的上下文应尽可能少地包含无关信息,并重点突出核心内容。由于处理长篇上下文信息的成本较高,当上下文段落过长时,大型语言模型(LLM)在利用上下文方面的效率会显著下降,尤其是对于段落中间提供的信息。

2. LangSmith

LangSmith 是一个允许调试、测试、评估和监控基于任何 LLM 框架构建的链和智能代理的工具。它还可以无缝集成 LangChain,从而为开发者提供更强大的调试和监控能力。