当前位置: 首页 > news >正文

RAG评估标准

如何衡量一个RAG系统的优劣?如何识别系统的瓶颈并有针对性地优化?本文将深入探讨RAG系统评估的核心维度、方法论和实践技巧,帮助开发者构建更高质量的检索增强生成应用。

RAG评估

RAG系统的核心流程可以简化为三个关键要素的协同:用户问题检索上下文生成答案。评估一个RAG系统,本质上就是衡量这三者之间的关系质量。

根据这三者之间的关系,RAG评估可以分为四大核心维度:

1. 忠实性(Faithfulness)

定义:评估生成答案与给定上下文之间的事实一致性,即答案中的信息是否能从上下文中得到支持。

计算方法

  1. 将生成答案拆分成细粒度的事实陈述
  2. 对每个陈述判断是否可以从上下文中推断出来
  3. 计算可被上下文支持的陈述占比

示例

问题:谁是苹果公司的创始人?
上下文:苹果公司于1976年由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩创立...
RAG答案:苹果公司由史蒂夫·乔布斯和比尔·盖茨创立于1980年。拆分陈述:
1. 苹果公司由史蒂夫·乔布斯创立 ✓ (可从上下文推断)
2. 苹果公司由比尔·盖茨创立 ✗ (上下文不支持)
3. 苹果公司创立于1980年 ✗ (上下文不支持)忠实性得分:1/3 = 0.33

2. 答案相关性(Answer Relevance)

定义:评估生成答案与用户问题的相关程度,即答案是否直接回答了用户的问题。

计算方法

  1. 基于生成答案,让大模型生成多个潜在问题
  2. 计算这些潜在问题与原始问题的语义相似度
  3. 取所有相似度的平均值作为最终得分

示例

原始问题:什么是向量数据库?
RAG答案:向量数据库是专门用于存储和检索向量数据的数据库系统。它通过相似度搜索算法实现高效查询。大模型生成的潜在问题:
1. 什么是向量数据库?(相似度 0.95)
2. 向量数据库的主要功能是什么?(相似度 0.82)
3. 向量数据库如何实现查询?(相似度 0.78)答案相关性得分:(0.95 + 0.82 + 0.78) / 3 = 0.85

3. 上下文召回(Context Recall)

定义:评估检索系统是否找到了回答问题所需的关键信息,需要使用人工标注的标准答案作为参考。

计算方法

  1. 将标准答案拆分成细粒度的事实陈述
  2. 判断每个陈述是否可从检索到的上下文中推断出来
  3. 计算可被上下文支持的标准答案陈述占比

示例

问题:法国的地理位置和首都是什么?
上下文:法国位于西欧,与比利时、卢森堡、德国等国接壤...
标准答案:法国位于西欧,首都是巴黎。拆分标准答案陈述:
1. 法国位于西欧 ✓ (可从上下文推断)
2. 法国的首都是巴黎 ✗ (上下文中未提及)上下文召回得分:1/2 = 0.5

4. 上下文精度(Context Precision)

定义:评估检索结果的排序质量,检验与标准答案相关的上下文是否排在前列。

计算方法

  1. 对每个检索结果判断是否支持标准答案
  2. 结合每个结果的排序位置计算加权得分
  3. 对所有支持标准答案的结果取加权平均

示例

问题:法国的地理位置和首都是什么?
检索结果(按排序):
1. 文档A:关于法国的经济数据... (不支持标准答案)
2. 文档B:法国位于西欧,与多国接壤... (支持标准答案)
3. 文档C:巴黎是法国的首都,也是世界著名的旅游城市... (支持标准答案)权重计算:
文档A:0 (前面无支持标准答案的文档) × 0 (不支持标准答案) = 0
文档B:1/2 (前面1个文档中0个支持) × 1 (支持标准答案) = 0.5
文档C:2/3 (前面2个文档中1个支持) × 1 (支持标准答案) = 0.67上下文精度得分:(0.5 + 0.67) / 2 = 0.585

自动化评估技术

尽管人工评估最为准确,但成本高且难以规模化。现代RAG评估越来越依赖自动化技术,特别是利用大模型进行评估。

RAGAS(Retrieval Augmented Generation Assessment)是一个开源的自动化RAG系统评估框架,它于2023年推出。

RAGAS评估指标体系

RAGAS框架的评估指标体系与RAG系统的三大核心要素紧密相关,完整覆盖了用户问题、检索上下文和生成答案之间的关系评估。
在这里插入图片描述

使用RAGAS框架进行RAG系统评估,主要分为三个步骤:构建评估数据集、确定评估指标、执行评估过程。

1. 构建评估数据集

RAGAS评估数据集包含四个核心元素:

ragas_dataset = [{"question": "用户问题","answer": "RAG系统生成的答案","contexts": ["检索到的上下文1", "检索到的上下文2", ...],  # 按相关性排序"ground_truths": ["人工标注的标准答案"]  # 部分指标需要},# 更多测试样例...
]

值得注意的是,contexts列表中的顺序代表检索系统返回的排序,这对评估上下文精度指标至关重要。

2. 确定评估指标

基于评估目标选择合适的指标组合:

from ragas.metrics import (faithfulness,      # 忠实性answer_relevancy,  # 答案相关性context_recall,    # 上下文召回context_precision  # 上下文精度
)# 定义评估指标集合
evaluation_metrics = [faithfulness,answer_relevancy,context_recall,context_precision
]
3. 执行评估过程

执行评估并获取结果:

from ragas import evaluate# 执行评估
results = evaluate(dataset=ragas_dataset,metrics=evaluation_metrics
)# 分析结果
print(f"忠实性平均分: {results['faithfulness'].mean()}")
print(f"答案相关性平均分: {results['answer_relevancy'].mean()}")
print(f"上下文召回平均分: {results['context_recall'].mean()}")
print(f"上下文精度平均分: {results['context_precision'].mean()}")

1. 答案拆分提示词

将答案拆分为独立事实陈述的提示词设计:

我需要你将以下答案拆分成简单、独立的事实陈述。
请按照以下步骤操作:
1. 将答案拆分成单独的句子
2. 分析每个句子的复杂度
3. 将复杂句子进一步拆分为简单陈述
4. 确保每个陈述只包含一个独立事实答案: [生成答案]请以JSON格式输出,包含所有拆分后的陈述。示例:
答案: "苹果公司由史蒂夫·乔布斯和沃兹尼亚克在1976年创立,总部位于加利福尼亚。"
输出: {"statements": ["苹果公司由史蒂夫·乔布斯创立","苹果公司由沃兹尼亚克创立","苹果公司创立于1976年","苹果公司总部位于加利福尼亚"]
}

2. 事实推断提示词

判断陈述是否可从上下文推断的提示词设计:

请判断以下陈述是否可以从给定的上下文中推断出来。上下文: [上下文内容]
陈述: [待验证陈述]请分析陈述与上下文的关系,并给出明确判断。
如果陈述可以从上下文直接推断或强烈暗示,请回答"可推断"。
如果陈述与上下文矛盾或上下文中没有相关信息,请回答"不可推断"。请先给出详细理由,然后在最后一行给出你的判断结果(仅包含"可推断"或"不可推断")。示例:
上下文: "苹果公司于1976年由史蒂夫·乔布斯、沃兹尼亚克和罗恩·韦恩创立。"
陈述: "苹果公司由比尔·盖茨创立。"
理由: 上下文明确指出苹果公司由史蒂夫·乔布斯、沃兹尼亚克和罗恩·韦恩创立,没有提到比尔·盖茨。陈述与上下文事实不符。
判断: 不可推断

3. 潜在问题生成提示词

基于答案生成潜在问题的提示词设计:

请根据以下答案,生成3个可能导致这个答案的问题。这些问题应该涵盖答案中的主要信息点。答案: [生成答案]生成的问题应该:
1. 直接相关,能够以给定答案作为合理回应
2. 多样化,覆盖答案中的不同方面
3. 明确具体,避免模糊或过于宽泛的表述对于每个生成的问题,请评估其明确程度:
- 如果问题明确且直接针对答案内容,标记为0
- 如果问题模糊或间接相关,标记为1请以JSON格式输出结果,包含问题文本和明确度评分。示例:
答案: "向量数据库是专门用于存储和检索向量数据的数据库系统。它通过相似度搜索算法实现高效查询。"
输出: {"questions": [{"question": "什么是向量数据库?", "clarity": 0},{"question": "向量数据库的主要功能是什么?", "clarity": 0},{"question": "向量数据库如何实现查询?", "clarity": 0}]
}

RAGAS实战应用与优化建议

1. 与现有RAG系统的集成

RAGAS可以轻松集成到现有的RAG系统开发流程中:

# 假设我们有一个RAG系统
from my_rag_system import RAGSystem
rag = RAGSystem()# 准备评估数据
eval_questions = ["问题1", "问题2", "问题3", ...]
standard_answers = ["标准答案1", "标准答案2", "标准答案3", ...]# 收集评估数据
evaluation_data = []
for question, ground_truth in zip(eval_questions, standard_answers):# 执行RAG过程contexts = rag.retrieve(question)  # 检索上下文answer = rag.generate(question, contexts)  # 生成答案# 构建评估数据点evaluation_data.append({"question": question,"contexts": contexts,"answer": answer,"ground_truths": [ground_truth]})# 使用RAGAS评估
from ragas import evaluate
from ragas.metrics import faithfulness, answer_relevancy, context_recall, context_precisionresults = evaluate(dataset=evaluation_data,metrics=[faithfulness, answer_relevancy, context_recall, context_precision]
)# 分析结果
print(f"系统平均得分: {results.mean()}")

2. 基于评估结果的系统优化

RAGAS评估结果可直接指导RAG系统的优化方向:

  1. 忠实性得分低

    • 优化生成模型的提示词,强调答案必须基于上下文
    • 考虑使用引用机制,明确标注答案来源
    • 尝试不同的大模型,选择更善于遵循上下文的模型
  2. 答案相关性得分低

    • 改进生成模型提示词,强调直接回答用户问题
    • 优化问题解析,确保正确理解用户意图
    • 调整生成策略,减少冗余信息
  3. 上下文召回得分低

    • 改进检索策略,如混合检索(关键词+向量)
    • 优化文档分块策略,保证语义完整性
    • 尝试不同的Embedding模型,提升语义理解能力
  4. 上下文精度得分低

    • 优化检索结果排序算法
    • 实现多阶段检索,如粗检索+精检索
    • 添加结果重排序机制,如使用交叉编码器进行重排

3. 自定义评估指标

RAGAS框架支持自定义评估指标,满足特定应用场景需求:

from ragas.metrics import Metric
from typing import List, Dict, Anyclass CustomMetric(Metric):name = "custom_metric"def __init__(self):super().__init__()async def _acompute(self,questions: List[str],answers: List[str],contexts: List[List[str]],ground_truths: List[str] = None,) -> Dict[str, Any]:# 实现自定义评估逻辑scores = []for question, answer, context in zip(questions, answers, contexts):# 计算指标得分score = self._calculate_custom_score(question, answer, context)scores.append(score)return {"custom_metric": scores}def _calculate_custom_score(self, question, answer, context):# 具体计算方法# ...return score

RAGAS的局限性与未来发展

尽管RAGAS为RAG系统评估带来了革命性的变化,但仍存在一些局限性:

  1. 依赖大模型质量:评估质量直接受限于用于评估的大模型能力
  2. 评估成本:基于大模型的评估会产生API调用成本
  3. 缺乏领域适应性:通用评估可能无法捕捉特定领域的需求
  4. 主观性残留:尽管比人工评估更客观,但仍可能存在一定主观性

未来RAGAS框架的发展可能包括:

  1. 更细粒度的评估指标:如信息新颖性、答案清晰度等
  2. 多模态支持:扩展到图像、音频等多模态RAG系统评估
  3. 领域特化评估:为医疗、法律等专业领域提供定制化评估框架
  4. 评估效率优化:减少API调用次数,降低评估成本
  5. 人机协同评估:结合人工评估与自动评估的优势

相关文章:

  • 人工智能+:职业价值的重构与技能升级
  • 十分钟聊明白DDD领域驱动设计
  • 安装完dockers后就无法联网了,执行sudo nmcli con up Company-WiFi,一直在加载中
  • java基础-异常
  • CompleteableFuture的异步任务编排
  • MySQL的安装及相关操作
  • MySQL 自启动时报错can‘t create PID file: No such file or directory
  • 基于天猫 API 的高效商品详情页实时数据接入方法解析
  • 麒麟系统编译osg —— 扩展篇
  • 系统架构设计(十六):敏感点、权衡点、风险点和非风险点
  • EtherCAT通信协议
  • 题解:AT_abc244_e [ABC244E] King Bombee
  • vue+three.js 五彩烟花效果封装+加载字体
  • Go语言实战:使用 excelize 实现多层复杂Excel表头导出教程
  • idea 插件开发自动发布到 nexus 私服中(脚本实例)
  • 随记1-LLM多轮对话的陷阱
  • LTX-Videov本地部署教程:时空扩散+多尺度渲染,重塑AI视频研究范式
  • 至此(day1-day4)代码详解(ai辅助整理)
  • Python代码加密与发布方案详解
  • 计算机图形学Games101笔记--几何
  • 深圳南山法院回应“执行款未到账”:张核子公司申请的执行异议成立
  • 中国海警就菲向非法“坐滩”仁爱礁军舰运补发表谈话
  • 住建部:2019年至2024年,全国累计开工改造老旧小区28万个
  • 交通运输局男子与两名女子办婚礼?官方通报:未登记结婚,开除该男子
  • 外交部:将持续便利中外人员往来,让“中国游”金字招牌更加闪耀
  • 解放日报“解码上海AI产业链”:在开源浪潮中,集聚要素抢先机