文章目录
本系列阅读:
理论篇: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=∣Q∣1∑i=1∣Q∣ranki1
其中,|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=1∣REL∣log2(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=总声明数量支持的声明数量
更精确地说,忠实度可以通过以下步骤计算:
- 将生成的回答分解为多个事实性声明
- 检查每个声明是否能从检索到的文档中得到支持
- 计算得到支持的声明比例
这个指标帮助确保模型不会"编造"不在检索内容中的信息。如果发现模型经常"幻觉",这个指标会迅速下降。
实际操作中,我们不会人工做上面判断步骤,而是用另一个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=0−1)
这个指标确保模型在使用检索信息的同时,不会偏离用户的原始问题。有时模型会返回检索文档中的信息,但这些信息与用户的问题并不直接相关,这种情况下相关性分数会很低。
在我们的客户服务机器人项目中,通过优化提示词中强调"直接回答用户问题"的部分,我们将相关性从0.65提高到0.83,用户反馈明显改善。
3. 答案正确性(Answer Correctness)
答案正确性(Answer Correctness):生成的答案与参考答案的一致程度如何?
公式有多种实现方式,常见的包括:
-
基于文本重叠的方法:
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=2∗Precision+RecallPrecision∗Recall -
基于语义相似度的方法:
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) -
基于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=0−1)
当你有一组基准答案可以比较时,这个指标特别有用。在实践中,我发现基于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,大大提升了复杂问题的回答质量。