从 0 打造私有知识库 RAG Benchmark 完整实践

2024-06-20 11:20

本文主要是介绍从 0 打造私有知识库 RAG Benchmark 完整实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景介绍

最近从 0 构建了一个大模型知识库 RAG 服务的自动化 Benchmark 评估服务,可以基于私有知识库对 RAG 服务进行批量自动化测试与评估。本文是对这个过程的详细记录。

本文实际构建的是医疗行业知识库,基于高质量的医学指南和专家共识进行构建。而实际的问答对也基础知识库已有文档生成,避免参考源不存在导致的大模型幻觉,可以更加客观反映 RAG 服务的能力。当然整体的构建流程是与行业无关的,可以参考构建其他的测评知识库。

RAG Benchmark 评估

为什么需要 RAG 评估

从早期实现 从开发到部署,搭建离线私有大模型知识库 时就提到过 RAG 的评估体系的构建,RAG 评估体系不可或缺的原因如下:

  1. RAG 服务的质量评估困难,因为 RAG 服务最终输出的就是一段针对问题的文本回答,开发人员可能会缺乏行业背景知识,无法给出客观评估;
  2. RAG 服务是一个需要持续迭代的服务,优化手段多种多样。如何验证优化手段的有效性,需要存在一个量化的判断标准,否则可能会负优化;
为什么不用通用 Benchmark

目前针对 RAG 服务的部分环节的 Benchmark 是存在的,比如针对大模型有 Lmsys Benchmark,针对 Embedding 模型有 mteb leaderboard,但是很少有完整的针对 RAG 提供的 Benchmark,我理解原因如下:

  1. RAG 服务的质量与知识库内容存在很大关系,RAG 服务目前没有完全标准的知识库以及对应的高质量问答对;
  2. RAG 服务的自动化文本评测相对困难,很难根据问题和答案给出完全客观的打分;

同时考虑到外部的公共 Benchmark 数据集缺失行业信息,无法基于我们期望的行业知识进行评测,最终选择了自建大模型知识库自动化 Benchmark 评测服务。

自动化评估构建流程

自动化评估 Benchmark 构建流程如下所示:
请添加图片描述

构建测试问答对

为了构建自动化测试,首先需要筛选出合适的行业文档信息,期望文档本身的质量比较高。在医疗领域,我们选择的是医学指南和专家共识,这样可以避免原始文档质量差带来的结果不佳的问题。

接下来需要根据这些文档生成对应的问答对。问答对需要能根据知识库可以得到正确答案,否则就很难验证 RAG 服务的能力了。

但是构建问答对十分耗时,最终选择了提供文档给线上大模型,基于线上的大模型自动生成问题,答案以及答案参考的原文片段。通过这种方式可以大幅减轻人工总结文档生成问题和答案的工作量。人工只需要参考大模型给出的原文片段判断问题和答案的合理性即可。实际的问答对如下所示:
请添加图片描述

人工过滤掉不合适的问题,以及答案有误的情况,这样就得到了一份可用的知识库,以及对应的问答对。我利用这种方式构建了包含 100 份高质量行业文档的知识库和 1000 个标准问答对。

批量测试

批量的自动化测试是基于 ragas 实现的,如果期望选择其他 RAG 自动化评测库,可以参考 之前的文章 查看其他可选方案。

批量测试基于下面的代码生成自动化测试的数据集:

import asynciofrom datasets import Datasetasync def batch_evaluate_chat(questions: list[str], ground_truths: Optional[list] = None):# 批量调用 RAG 服务接口获取回答与对应的上下文tasks = [search_knowledge_base_iter(q, ground_truth)for q, ground_truth in zip(questions, ground_truths)]results = await asyncio.gather(*tasks)question_list, answer_list, contexts_list, ground_truth_list = [], [], [], []for question, answer, contexts, ground_truth in results:question_list.append(question)answer_list.append(answer)contexts_list.append(contexts)ground_truth_list.append(ground_truth)# 构建测试获得的问题,答案,上下文以及标准答案data_samples = {"question": question_list,"answer": answer_list,"contexts": contexts_list,"ground_truth": ground_truth_list,}return Dataset.from_dict(data_samples), data_samples
大模型评分

在实际测试时,我期望获得所有测试问答对的详细信息,包括测试项中的问题,答案,上下文,正确答案以及各个评分项的得分。但是 ragas 只会给出测试数据集整体的平均得分,因此实际调用上面的 batch_evaluate_chat() 构建测试数据集时,会基于单个问题构建了自动化测试数据集,之后所有问题独立进行评分。具体如下所示:

from ragas import evaluate
from ragas.metrics import (answer_correctness,answer_relevancy,context_precision,context_recall,context_relevancy,faithfulness,
)# 每个问题构造对应的数据集,独立评分,得到每个问题详细评分async def do_evaluate(question, ground_truth, llm, embedding_model):questions = [question]ground_truths = [ground_truth] if ground_truth else Nonedataset, original_dataset = await batch_evaluate_chat(questions, ground_truths)result = evaluate(dataset,# 设置相关评测指标 https://docs.ragas.io/en/stable/concepts/metrics/index.htmlmetrics=[context_relevancy,faithfulness,answer_relevancy,answer_correctness,context_recall,context_precision,],llm=llm,embeddings=embedding_model,)# 将原始的问答对与结果合并在一起,方便后续生成详细结果evaluate_detail = dict()for key in original_dataset:evaluate_detail[key] = original_dataset[key][0]evaluate_detail.update(result)return evaluate_detail

实际选择的指标除了经典的三维度的指标 context_relevancy, faithfulnessanswer_relevancy,从实用角度出发,补充了下面指标:

  • answer_correctness: 根据生成答案与标准答案相比,得出生成答案的准确性,可以整体了解 RAG 服务的可靠性;
  • context_recall: 根据上下文与标准答案相比,用于衡量正确答案是否被正确召回,可以判断 RAG 的检索能力;
  • context_precision: 根据上下文与标准答案以及问题综合判断,确认召回的正确内容是否排名靠前,可以判断 RAG 检索的排序是否合适;

最终整体的评估维度如下所示:
请添加图片描述

测试结果分析

在完成构建了自动化测试之后,最终得到的结果导出为 excel,类似如下所示:
请添加图片描述
在得到大模型完整的自动化测试的结论后,还是需要人工进行分析,主要关注两部分的优化:

  1. 自动化测试指标的表征能力,现有的自动化测试指标是否正确反映 RAG 服务本身存在的问题,这一部分主要涉及自动化测试流程的优化;
  2. RAG 模块的优化,通过指标以及人工归因,确定 RAG 服务各个模块中存在的待优化问题,并根据影响范围确定优化的优先级;

总结

本文是对构建完整的 RAG 自动化评估 benchmark 的介绍,通过上面的流程,可以从 0 构建一个符合要求的自动化评估服务,在客观的数据的指导下定位 RAG 服务中存在的问题,从而迭代优化重点问题,提升 RAG 服务的质量。

这篇关于从 0 打造私有知识库 RAG Benchmark 完整实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077987

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

uva 10916 Factstone Benchmark(打表)

题意是求 k ! <= 2 ^ n ,的最小k。 由于n比较大,大到 2 ^ 20 次方,所以 2 ^ 2 ^ 20比较难算,所以做一些基础的数学变换。 对不等式两边同时取log2,得: log2(k ! ) <=  log2(2 ^ n)= n,即:log2(1) + log2(2) + log2 (3) + log2(4) + ... + log2(k) <= n ,其中 n 为 2 ^

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

基于 YOLOv5 的积水检测系统:打造高效智能的智慧城市应用

在城市发展中,积水问题日益严重,特别是在大雨过后,积水往往会影响交通甚至威胁人们的安全。通过现代计算机视觉技术,我们能够智能化地检测和识别积水区域,减少潜在危险。本文将介绍如何使用 YOLOv5 和 PyQt5 搭建一个积水检测系统,结合深度学习和直观的图形界面,为用户提供高效的解决方案。 源码地址: PyQt5+YoloV5 实现积水检测系统 预览: 项目背景

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

Prometheus与Grafana在DevOps中的应用与最佳实践

Prometheus 与 Grafana 在 DevOps 中的应用与最佳实践 随着 DevOps 文化和实践的普及,监控和可视化工具已成为 DevOps 工具链中不可或缺的部分。Prometheus 和 Grafana 是其中最受欢迎的开源监控解决方案之一,它们的结合能够为系统和应用程序提供全面的监控、告警和可视化展示。本篇文章将详细探讨 Prometheus 和 Grafana 在 DevO

springboot整合swagger2之最佳实践

来源:https://blog.lqdev.cn/2018/07/21/springboot/chapter-ten/ Swagger是一款RESTful接口的文档在线自动生成、功能测试功能框架。 一个规范和完整的框架,用于生成、描述、调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现。 SpringBoot集成 pom <!--swagge

Python:豆瓣电影商业数据分析-爬取全数据【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】

**爬取豆瓣电影信息,分析近年电影行业的发展情况** 本文是完整的数据分析展现,代码有完整版,包含豆瓣电影爬取的具体方式【附带爬虫豆瓣,数据处理过程,数据分析,可视化,以及完整PPT报告】   最近MBA在学习《商业数据分析》,大实训作业给了数据要进行数据分析,所以先拿豆瓣电影练练手,网络上爬取豆瓣电影TOP250较多,但对于豆瓣电影全数据的爬取教程很少,所以我自己做一版。 目