CCF第七届AIOps国际挑战赛季军分享(RAG)

分享CCF 第七届AIOps国际挑战赛的季军方案,从我们的比赛经历来看,并不会,相反,私域领域问答的优秀效果说明RAG真的很重要

历经4个月的时间,从初赛赛道第1,复赛赛道第2,到最后决赛获得季军,这一路我们团队收获了很多实践经验,也结识了不少业界的RAG研究者,受益匪浅。应组委会邀请,本文介绍一下我们EasyRAG方案的亮点和实验结果,欢迎感兴趣的朋友批评指正!

开源地址:https://github.com/BUAADreamer/EasyRAG

技术报告:https://github.com/BUAADreamer/EasyRAG/blob/master/assets/技术报告.pdf

PPT:https://github.com/BUAADreamer/EasyRAG/blob/master/assets/PPT.pdf

论文链接:EasyRAG: Efficient Retrieval-Augmented Generation Framework for Automated Network Operations

挑战赛官网:https://competition.aiops-challenge.com/home/competition/1780211530478944282

0.概览

先简要介绍背景,本次比赛题目是面向网络运维领域的私域知识问答,根据LLM的类型分为两个赛道,赛道一使用可以微调的Qwen2-7B,赛道二调用 GLM-4 API。我们选择了赛道二,模拟无法微调LLM的场景。

因此,我们的目标是如何在不微调任何模型的前提下,实现较为简洁的RAG,尽可能达到准确高效实用

为了达成这一目标,我们基于llama-index[1],实现了一套包含查询改写图像数据处理分块策略元数据利用密集检索稀疏检索重排排序融合提示词优化上下文压缩部署的RAG框架,可以灵活地配置自己的RAG流程,方便地应用在自己的私域数据问答中。

初赛RAG流程:块调优-两路稀疏/密集检索粗排-重排-rrf排序融合

复赛RAG流程:块优化(图像信息和路径知识利用)-两路稀疏检索粗排-重排-答案迭代优化

在这里插入图片描述

接下来我们将分别介绍我们在准确性高效性实用性方面的实践和实验结果,以飨读者

1.准确性

数据处理流程

  • zedx文件处理:zedx文件解压-路径解析-文档抽取-保存。

    • 关键点1:路径解析中,我们提取了xml文件中的知识路径(emsplus-安装与调测-软件安装-安装准备-版本文件准备)和文件路径(./emsplus/documents/软件安装/topics/版本文件准备.html),从而为后续的结合路径的检索提供数据支撑
    • 关键点2:文档抽取中,我们用bs4提取了html中的文本,同时提取了图像标题图像路径的一一对应关系,从而方便多模态知识的利用
  • 文本分块:使用llama-index的Sentence Splitter进行分块,先利用中文分隔符分割句子,再按照设置的文本块大小合并多个小块。

    • 关键点1:chunk_size和chunk_overlap比较重要,需要精心挑选
    • 关键点2:节点的node.metadata中的file_path默认为绝对路径,而句子分割类会利用元数据长度,原始数据放在在不同绝对路径导致结果差异大,从而使得结果不稳定。因此我们重新实现了分块类。同时我们也在元数据存储时,将file_path改为相对路径,彻底消除绝对路径带来的不稳定性。代码如下
# 原代码:https://github.com/run-llama/llama_index/blob/8f7cd3e1043da26514ac82fc732cd21bbb4bbe9c/llama-index-core/llama_index/core/node_parser/text/sentence.py#L155C5-L157C62 
def split_text_metadata_aware(self, text: str, metadata_str: str) -> List[str]:metadata_len = len(self._tokenizer(metadata_str))effective_chunk_size = self.chunk_size - metadata_len# 我们的实现:https://github.com/BUAADreamer/EasyRAG/blob/893b3c272b2ce0d8c6cee80f02a171cccded9f96/src/easyrag/custom/splitter.py#L149
def split_text_metadata_aware(self, text: str, metadata_str: str) -> List[str]:metadata_len = len(self._tokenizer(metadata_str))effective_chunk_size = self.chunk_size# 分块实现:https://github.com/BUAADreamer/EasyRAG/blob/893b3c272b2ce0d8c6cee80f02a171cccded9f96/src/easyrag/custom/transformation.py#L67C1-L71C51
for node in nodes:node.metadata["file_abs_path"] = node.metadata['file_path']file_path = node.metadata["file_path"].replace(self.data_path + "/", "")node.metadata["dir"] = file_path.split("/")[0]node.metadata["file_path"] = file_path
  • 图像信息抽取:图像内容提取-图像过滤

    • 例子:有1道题目问的是流程图(下图)中POD和VRU的比例,必须解析图像内容才能予以回答

    • 多模态大模型提取内容:

      • glm4v-9b对图像做caption;提示词:简要描述图像
      • 我们还尝试了internvl2、gpt4o、claude等多个模型,发现glm4v的效果较好
    • 多种规则图像过滤:

      • 纯英文过滤:使用paddleocr提取文字,过滤不含有中文的图像(纯英文图像的信息可能和文中内容重复或过于复杂)
      • 关键词过滤:标题含有组网图、架构的复杂图对问题帮助不大
      • 引用过滤:过滤在文中以特定方式被引用的图像 (配置如图 x 所示,文件如图 x 所示等),这些图一般文字已经含有了全部信息

在这里插入图片描述

RAG流程

  • 查询改写:我们尝试了关键词扩展HyDE两种思路,但我们发现直接使用GLM4进行查询扩展会使得新查询词私域文档偏差较大,因此在提交方案中没有采用,详情参见技术报告

  • 两路稀疏检索粗排:基于BM25实现两路检索,除了常规的文档检索,我们还进行了知识路径检索

    • 例子:问题“VNF弹性分几类?“,VNF 和弹性都可以直接在相关的知识路径中找到,但在文档中找不到,此时路径检索优势就很明显
    • BM25分词:我们发现llama-index对于中文BM25支持较糟糕,因此我们自己实现了基于jieba的中文分词,相比原实现提点明显。同时,我们也尝试了清华的IT词库[2],效果没有提升
    • 停用词表:使用经典的哈工大停用词表[3]
  • 密集检索粗排:基于LLM的embedding模型效果更佳

    • 选用阿里的GTE-Qwen2-7B-instruct[4],在不微调的情况下,此模型在我们的实验中效果优于bge-v1.5和bce
    • 使用qdrant向量数据库,其官网的docker例子就可以快速部署,简单高效
    • 粗排topk为288
    • 索引时将文本块和文件路径拼接,再输入模型得到表征
  • LLM Reranker 重排:基于LLM的Reranker效果更佳

    • 选用智源的bge-reranker-v2-minicpm-layerwise[5],不微调情况下,此模型效果领先其他bge系列reranker
    • 精排topk为6
    • reranker推理时将文本块和知识路径拼接
  • 多路排序融合:排序融合主要尝试了naive(去重合并)以及rrf(倒数排序融合)。我们发现重排融合相比粗排融合更有用

    • 粗排融合:复赛中我们直接将两路进行naive融合

    • 重排融合:多路分别进行粗排-重排,得到多组文档集合

      • 生成前融合:多组文档集合排序融合得到一组文档集合,输入LLM
      • 生成后融合:每组文档集合分别输入LLM,将多个答案融合。我们尝试了直接拼接和取最长两种方式
  • LLM 回答:简单问答提示词最佳

    • 我们尝试了包括CoT提示,以及结构化的markdown提示词和CoSTAR[6]提示词,但都没有超过最原始的官方提供提示词,然而,考虑到API的波动,此处仍有探索空间,详情参见技术报告
  • LLM 答案迭代优化:让模型逐步关注重要信息

    • 我们发现 LLM 对于每个文本块都会给予一定的注意力,可能会导致 top1 文本块的有效信息没有得到充分利用,因此我们设计了两轮迭代优化,第一轮先基于6个文本块得到answer1,第二轮将answer1和top1文本块输入LLM得到answer2作为最终答案

缩写描述

这里先对之后实验表中的一些缩写做出解释

在这里插入图片描述

在这里插入图片描述

初赛实验结果

这里列出我们初赛的提分路径,主要经历了3个阶段

  • 单路粗排(0-2)

    • 官方Baseline跑通(0==>57)
    • bge-v1.5实验(57==>68)
    • bm25实验(68==>69)
  • 单路粗排-精排(3-16)

    • 增加基于BERT的重排(69==>73)
    • 改为基于LLM的重排模型(73==>77)
    • 优化数据处理流程(77==>78)
    • 粗排换用bm25或gte-qwen2-7B(78==>81)
    • 修改分块参数(81==>83)
  • 多路融合(17-21)

    • 重排后融合(83==>83.5+)

在这里插入图片描述

复赛实验结果

由于复赛和初赛评价指标发生了变化,更看重事实正确性,因此稀疏检索粗排总体更加有效

这里列出我们复赛的提分路径,主要经历了5个阶段

  • 流程探索(0-4)

    • 改为单路稀疏检索粗排-重排(90==>91.5)
  • 路径知识利用(5-10)

    • 粗排利用文件路径(91.5==>92.7)
    • 重排利用知识路径(92.7==>93.1)
  • 图像信息利用(11-12)

    • 图像信息抽取+筛选(93.1==>94.2)
  • 知识路径检索(13)

    • 加上知识路径稀疏检索(94.2==>94.5)
  • 答案迭代优化(14-15)

    • 答案整合(94.5==>96+)

在这里插入图片描述

2.高效性

考虑到实际使用时对速度的要求,我们也实现了一些策略提升推理时延,以下为总的时间开销比较:

  • 时间开销:无加速情况下总推理时延为粗排0.2s,重排6s,LLM推理10s
  • 加速时间开销:加速情况下总推理时延为粗排~0s,重排<4s,LLM推理<8.5s

接下来分别讲解三个加速方案

高效稀疏检索

  • 此部分我们引入了bm25s库[7],将稀疏检索时延降低到可忽略不计,问答效果几乎无区别
  • bm25s原理:1.主动索引技术,以空间换时间,在索引时存储每个token相对于每个文档的TF并用矩阵存储,推理时直接将每个词所在的行取出来;2.高效的scipy矩阵运算

在这里插入图片描述

高效重排

我们设计了层早退算法,将重排时间降低2s+

  • 动机:我们使用的重排模型bge-reranker-v2-minicpm-layerwise基于LLM设计为可选层模式,即可以选择较小的层进行推理提高速度。28层效果最佳,一般优于其他层

  • 思路:我们基于简单query早退,复杂query晚退的思想,设计了类似DeeBERT[8]和FastBERT[9]的动态层早退方法,尽可能逼近原排序效果同时,降低了推理时延

  • 结论:

    • 最大相似度阈值选择算法优于熵阈值选择算法
    • 阈值越大越慢但越准,可根据实际场景选择相应阈值
    • 此处,我们还发现了有意思的一个现象,即选择算法的比较步骤会带来无法忽略的开销,因此我们只在28层之前选择了三个“断点”进行阈值判断,从而尽量做好tradeoff,避免“虚假”优化

在这里插入图片描述

高效LLM推理

我们设计了上下文压缩方法,将LLM推理时间降低1.5s+

  • 动机:我们首先尝试了llmlingua,但发现使用LLM来做压缩会带来额外开销,导致推理时延不升反降,节省了token,但增加了时间开销。

  • 思路:因此我们设计了基于BM25相似度的抽取式压缩方法,先分句,再取出相似度最高的若干句子按原顺序拼接为压缩后上下文

  • 结论:

    • 在效果超越llmlingua的基础上,我们的模型可以节省更多token和时间
    • 阈值越大越慢但越准,可根据实际场景选择相应阈值

在这里插入图片描述

3.实用性

  • 扩展性:我们测试了单张A800的8并发,发现平均推理时延从串行16s降低到了7.5s,因此初步验证具有一定的可扩展性

在这里插入图片描述

  • 部署难度:我们支持了简单的命令行部署和docker批量运行,几行命令就可以方便地启动一个Web应用

在这里插入图片描述

网络运维问答案例

在这里插入图片描述

四大名著问答案例

我们还使用四大名著语料[10]测试了框架能否支持通用的语料问答

在这里插入图片描述

4.总结

本次比赛我们以不微调任何模型作为自己的目标,并在此前提下,利用了各种先进模型搭建我们的pipeline,做了充分的消融实验,达到了比赛中先进的准确度,同时也做了一些高效性和实用性方面的尝试

这初步说明一个结论:对于垂直领域RAG,精心设计流程+挑选sota模型+流程调优在初期带来的收益可能要大于微调模型。不过我们相信,经过微调后的模型可以让我们的pipeline获得更高的效果。希望这个工作能对RAG社区做出一些贡献,欢迎各位大佬批评指正!

参考

  1. https://github.com/run-llama/llama_index
  2. http://thuocl.thunlp.org
  3. https://github.com/goto456/stopwords
  4. https://huggingface.co/Alibaba-NLP/gte-Qwen2-7B-instruct
  5. https://huggingface.co/BAAI/bge-reranker-v2-minicpm-layerwise
  6. https://towardsdatascience.com/how-i-won-singapores-gpt-4-prompt-engineering-competition-34c195a93d41
  7. https://github.com/xhluca/bm25s
  8. https://aclanthology.org/2020.acl-main.204/
  9. https://aclanthology.org/2020.acl-main.537/
  10. https://github.com/weiyinfu/SiDaMingZhu

文章来源:https://www.zhihu.com/question/637421964/answer/61089640105

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/905488.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLO v2:目标检测领域的全面性进化

引言 在YOLO v1取得巨大成功之后&#xff0c;Joseph Redmon等人在2016年提出了YOLO v2&#xff08;也称为YOLO9000&#xff09;&#xff0c;这是一个在准确率和速度上都取得显著提升的版本。YOLO v2不仅保持了v1的高速特性&#xff0c;还通过一系列创新技术大幅提高了检测精度…

Linux-Ubuntu安装Stable Diffusion Forge

SD Forge在Win上配置起来相对简单且教程丰富&#xff0c;而在Linux平台的配置则稍有门槛且教程较少。本文提供一个基于Ubuntu24.04发行版&#xff08;对其他Linux以及SD分支亦有参考价值&#xff09;的Stable Diffusion ForgeUI安装配置教程&#xff0c;希望有所帮助 本教程以N…

量子计算实用化突破:从云端平台到国际竞合,开启算力革命新纪元

在硅谷某生物医药实验室&#xff0c;研究员艾米丽正盯着量子计算模拟界面露出微笑 —— 搭载中电信 "天衍" 量子计算云平台的 880 比特超导量子处理器&#xff0c;用 17 分钟完成了传统超算需 3 个月才能跑完的新型抗生素分子键合模拟。这个场景标志着量子计算正从 &…

计算机操作系统(七)详细讲解进程的组成与特性,状态与转换

计算机操作系统&#xff08;七&#xff09;进程的组成与特性&#xff0c;状态与转换 前言一、进程的组成1. 什么是“进程”&#xff1f;2. 进程的三个核心组成部分2.1 PCB&#xff08;进程控制块&#xff09;—— 进程的“身份证户口本”2.2 程序段—— 进程的“任务清单”2.3 …

MapReduce基本介绍

核心思想 分而治之&#xff1a;将大规模的数据处理任务分解成多个可以并行处理的子任务&#xff0c;然后将这些子任务分配到不同的计算节点上进行处理&#xff0c;最后将各个子任务的处理结果合并起来&#xff0c;得到最终的结果。 工作流程 Map 阶段&#xff1a; 输入数据被…

Linux操作系统实战:中断源码的性能分析(转)

Linux中断是指在Linux操作系统中&#xff0c;当硬件设备或软件触发某个事件时&#xff0c;CPU会中断正在执行的任务&#xff0c;并立即处理这个事件。它是实现实时响应和处理外部事件的重要机制&#xff0c;Linux中断可以分为两种类型&#xff1a;硬件中断和软件中断&#xff0…

AI Agent开发第66课-彻底消除RAG知识库幻觉-带推理的RAG

开篇 在第64课《AI Agent开发第64课-DIFY和企业现有系统结合实现高可配置的智能零售AI Agent(上)》中我们提到了提示词Rewrite,同时还讲到了2024年年末开始出现的新的理论,并把RAG系统推入到了3.0模式,业界出现了“3R”理念的RAG引擎,基于“3R”理念可以彻底消除RAG的幻觉…

Clion内置宏$PROJECT_DIR$等

CLion 内置宏 文章目录 CLion 内置宏通用路径相关宏路径相对化宏 官方文档地址&#xff1a; https://www.jetbrains.com/help/clion/built-in-macros.html 通用路径相关宏 宏名称含义说明示例$WORKSPACE_DIR$当前项目所属的工作区根目录路径。/home/user/workspace$PROJECT_D…

机器学习基础课程-5-课程实验

5.1 实验介绍 实验背景 在这个项目中&#xff0c;您将使用1994年美国人口普查收集的数据&#xff0c;选用几个监督学习算法以准确地建模被调查者的收入。然后&#xff0c;您将根据初步结果从中选择出最佳的候选算法&#xff0c;并进一步优化该算法以最好地建模这些数据。你的目…

Android RecyclerView自带的OnFlingListener,Kotlin

Android RecyclerView自带的OnFlingListener&#xff0c;Kotlin Android启动应用时屏蔽RecyclerView滑动&#xff0c;延时后再允许滑动&#xff0c;Kotlin-CSDN博客 使用了GestureDetectorRecyclerView的setOnTouchListener检测用户的快滑fling事件。发现RecyclerView也自带了监…

第3.4节 调用链路分析服务开发

3.4.1 什么是Code Call Graph&#xff08;CCG&#xff09; Code Call Graph&#xff08;CCG&#xff09;即业务代码中的调用关系图&#xff0c;是通过静态分析手段分析并构建出的一种描述代码间关系的图。根据精度不同&#xff0c;一般分为类级别、方法级别、控制流级别&#x…

【Liblib】基于LiblibAI自定义模型,总结一下Python开发步骤

一、前言 Liblib AI&#xff08;哩布哩布 AI&#xff09;是一个集成了先进人工智能技术和用户友好设计的 AI 图像创作绘画平台和模型分享社区。 强大的图像生成能力 &#xff1a;以 Stable Diffusion 技术为核心&#xff0c;提供文生图、图生图、图像后期处理等功能&#xff…

编程日志5.5

树的结构代码 #include<iostream> using namespace std; //由于树的每个结点可能有一些孩子结点,这些孩子结点的数量不确定,所以可以用一个链表来把所有的孩子结点给串起来 //链表结点定义 //这段代码定义了一个结构体ListNode,用于表示链表中的一个结点。这个结构…

【消息队列】RabbitMQ基本认识

目录 一、基本概念 1. 生产者&#xff08;Producer&#xff09; 2. 消费者&#xff08;Consumer&#xff09; 3. 队列&#xff08;Queue&#xff09; 4. 交换器&#xff08;Exchange&#xff09; 5. 绑定&#xff08;Binding&#xff09; 6. 路由键&#xff08;Routing …

uniapp -- 验证码倒计时按钮组件

jia-countdown-verify 验证码倒计时按钮组件 一个用于发送短信验证码的倒计时按钮组件&#xff0c;支持自定义样式、倒计时时间和文本内容。适用于各种需要验证码功能的表单场景。 代码已经 发布到插件市场 可以自行下载 下载地址 特性 支持自定义按钮样式&#xff08;颜色、…

知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑

1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法&#xff0c;搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命&#xff1a;在电商场景中&#xff0c;传统的「关键词匹配」已无法满足个性化购物需求&#xff0c;MOE搜索等新一代架构开始融合知识图谱…

深度学习 自然语言处理(RNN) day_02

1. 感知机与神经网络 1.1 感知机 生物神经元&#xff1a; 1.1.1 感知机的概念 感知机&#xff08;Perceptron&#xff09;&#xff0c;又称神经元&#xff08;Neuron&#xff0c;对生物神经元进行了模仿&#xff09;是神 经网络&#xff08;深度学习&#xff09;的起源算法&am…

PYTHON训练营DAY25

BUG与报错 一、try else try:# 可能会引发异常的代码 except ExceptionType: # 最好指定具体的异常类型&#xff0c;例如 ZeroDivisionError, FileNotFoundError# 当 try 块中发生 ExceptionType 类型的异常时执行的代码 except: # 不推荐&#xff1a;捕获所有类型的异常&…

LU分解求解线性方程组

L U LU LU分解 前言 L U LU LU分解 由以下定理得以保证&#xff1a; 设 A \boldsymbol{A} A为 n n n阶方阵&#xff0c;若其各界阶顺序主子式都不为 0 0 0&#xff0c;那么它可以 被唯一的上下三角矩阵积分解。 步骤 确定各矩阵形式 A L U \mathbf{A}\mathbf{LU} ALU ( a 1…

Linux——数据库备份与恢复

一&#xff0c;Mysql数据库备份概述 1&#xff0c;数据库备份的重要性 数据灾难恢复&#xff1a;数据库可能会因为各种原因出现故障&#xff0c;如硬件故障、软件错误、误操作、病毒攻击、自然灾害等。这些情况都可能导致数据丢失或损坏。如果有定期的备份&#xff0c;就可以…