AIOps RAG竞赛优秀方案EasyRAG解读:兼看SimRAG:自适应检索增强微调思路

文摘   2024-10-25 11:30   北京  

今天是2024年10月25日,星期五,北京,天气晴。

本文继续看RAG前沿进展,围绕RAG,介绍了2个工作,一个是基于微调的RA进展:SimRAG: 自适应检索增强;一个是CCF AIOps RAG比赛复赛优秀方案EasyRAG,其中把路径信息、图像内容都纳入到了检索的过程当中,用到的检索排序方案也很常规,值得看看。

供大家一起参考并思考。

一、基于微调的RAG进展:SimRAG: 自适应检索增强

关于RAG进展,先看第一个工作,《SimRAG: Self-Improving Retrieval-Augmented Generation for Adapting Large Language Models to Specialized Domains》,https://arxiv.org/pdf/2410.17952,其实现思路就是微调,一句话实现思路就是,首先在遵循指令、问题回答和搜索相关数据上对LLM进行微调。然后,提示相同的LLM从未标记的语料中生成多样化的领域相关问题,并采用额外的过滤策略以保留高质量的合成示例。通过利用这些合成示例,LLM可以在特定领域的RAG任务上提升它们的表现。

我们可以看看其实现流程,分为2个阶段:

1、阶段一:检索导向的微调

利用通用领域的指令微调LLMs,使其具备基本的指令跟随和上下文利用能力。

在模型上,使用Llama3-it 8B和Gemma2-it 27B作为主干模型。对于Gemma2模型,使用LoRA进行微调。

在数据上, 利用通用领域的指令微调数据、通用领域上下文感知问答数据和通用检索相关数据进行微调,包括:通用指令微调数据(如OpenAssistant、Dolly等);通用领域上下文感知问答数据(如DROP、NQ等);通用检索相关数据(如Squad、WebQuestions等)。

2、阶段二:领域适应性微调

利用未标记的领域语料库,通过生成高质量的问题回答对,并进行过滤以保留高质量的合成样本,从而提升LLMs在特定领域的问答能力。具体步骤包括:

首先,答案生成:对于每个文档,提示LLMs生成多个可能的答案候选片段。

其次,答案条件生成:对于每个候选答案及其对应的文档,提示LLMs生成候选问题。

最后,过滤策略:只保留那些在顶级检索结果中找到的答案,以确保生成的问题回答对具有高质量。

二、CCF AIOps RAG比赛复赛优秀方案EasyRAG

这个主要来自社区成员的自荐,在今年CCF–AIOPS RAG比赛上,方案初赛top1,复赛top2,将参加决赛。

数据地址:https://www.modelscope.cn/datasets/issaccv/aiops2024-challenge-dataset/summary


所以我们来看看具体工作,写成了论文,《EasyRAG: Efficient Retrieval-Augmented Generation Framework for Automated Network Operations》,https://arxiv.org/abs/2410.10315,代码地址:https://github.com/BUAADreamer/EasyRAG,简单来说,提出了EasyRAG框架,用,基于特定的数据处理工作流程+双路稀疏检索进行粗排+LLM重排器进行重排+LLM答案生成和优化来实现,其中对数据的处理以及排序的思路挺有趣。可以具体看看,如下:

1、建库阶段

1)数据处理与分词

首先,对原始数据进行处理,解压并提取HTML文档中的文本、图像标题和路径信息。同时保存知识路径knowledge path、文件路径 file path和图像路径信息image_path

源数据是以文件夹下的txt来组织的:knowledgepath是比赛提供的源数据含有的meta路径,比如网络-5G-5G运维这样的;filepath是文件所在路径,比如network/5G/5G_运维_001.txt每个txt文件都对应于这两个path。对于图像路径信息image_path,需要将其转换为文本进行召回,所以后面会说;

使用SentenceSplitter进行分词,初始按中文标点分割,然后根据设定的文本块大小合并。

有趣的是,发现llama-index的原始实现使用了一种简单但不稳定的处理路径信息的方法,即从文本长度中减去文件路径长度来确定实际使用的文本长度。这种方法可能导致相同的chunksize和chunk-overlap在不同数据路径下产生不同的分割结果。

在预赛中,观察到改变路径可能导致最终评估结果波动高达3个百分点,这在实践中显然是不可接受的。

为了解决这个问题,实现了一个自定义的分割类,消除了对路径长度的使用,从而确保了稳定的可重复性。

2)图像信息提取

这个就得使用多模态大型模型提取图像内容,首先,使用GLM-4V-9B从所有图像中提取信息。提示如下:

Briefly describe the image

然后,发现少量的图像对最终的问答有益,但并非所有图像都有用,因此根据各种规则过滤图像,也就是使用以下步骤过滤掉无用的图像

1)使用PP-OCRv4模型从图像中提取文本内容,并过滤掉不包含中文的图像;

2.)过滤掉标题包含特定关键词的图像(例如,网络图,架构);

3)过滤掉以特定方式引用文本中的图像(例如,在图x中显示的配置,在图x中显示的文件);

通过这些过滤步骤,将图像数量从原来的6000减少到不到200。例如,可以在地址:https://raw.githubusercontent.com/BUAADreamer/EasyRAG/refs/heads/master/src/data/imgmap_filtered.json中找到处理好的样例。

2、RAG阶段

1)查询重写

在比赛过程中,鉴于查询非常简短,发现一些问题在语义上尴尬或关键词不明确。例如,“EMSPLuS中有哪些类型的警报?”和“故障的来源是什么?”

在将这些查询输入RAG流程之前,使用大模型进行查询重写,一般包括两种方法:查询扩展和假设文档嵌入(HyDE),其中,查询扩展通过直接将扩展的关键词与原始查询连接起来,然后使用大模型重新总结它们来生成新查询;HyDE则通过生成虚构文档来处理缺乏特异性的查询。

在这个方案中,采用生成虚构文档方案,设计了两种方法,如图2所示。

最初,将提示和原始问题q输入大模型L,以产生虚构文档q′0。然而,在半决赛中,发现这些虚构文档由于大型模型的幻觉,包含了大量的不相关关键词和冗余信息,极大地影响了检索过程的有效性。

因此,尝试通过使用BM25算法和密集检索(使用GTEQWEN编码)来识别最相关的top1文档,并用它进行上下文提示。

对于生成的虚构文档,采用了两种应用方法:

一个是使用虚构文档q′与原始文档q结合进行粗排检索。

另一个是仅使用虚构文档q′与原始文档q结合对检索结果进行重排。

2)粗排检索

采用BM25算法进行双路稀疏检索和密集检索。

BM25算法基于词频(TF)和逆文档频率(IDF),并结合文档长度信息计算文档与查询的相关性。

密集检索则使用gte-Qwen2-7B-instruct模型,通过余弦相似度匹配召回相关文本块。

3)精排重排

使用bge-reranker-v2-minicpm-layerwise模型进行LLM重排,结合知识路径和文本块进行相似度排名,返回排名最高的k个文本块。

4)多路排序融合

设计了多种排序融合策略,包括简单合并和互惠排名融合(RRF)。

简单合并直接合并多路粗排结果:

RRF则通过对多路检索结果的排名取倒数和来计算融合分数:

5)LLM答案生成与优化

将精排后的前6个文本块内容拼接成上下文字符串,再与问题一起输入GLM4生成答案。

设计了答案整合提示,允许LLM利用Top1文本块补充和优化答案。

总结

本文主要围绕RAG讲了两个工作,本文继续看RAG前沿进展,围绕RAG,介绍了2个工作,一个是基于微调的RA进展:SimRAG: 自适应检索增强;

一个是CCF AIOps RAG比赛复赛优秀方案EasyRAG,后者是比赛的思路,但也有可取之处,感兴趣的可以跑一跑源代码;

参考文献

1、https://arxiv.org/pdf/2410.17952

2、https://arxiv.org/abs/2410.10315

关于我们

老刘,NLP开源爱好者与践行者,主页:https://liuhuanyong.github.io。

对大模型&知识图谱&RAG&文档理解感兴趣,并对每日早报、老刘说NLP历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。

加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入


老刘说NLP
老刘,NLP开源爱好者与践行者。主页:https://liuhuanyong.github.io。老刘说NLP,将定期发布语言资源、工程实践、技术总结等内容,欢迎关注。
 最新文章