今天是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历史线上分享、心得交流等感兴趣的,欢迎加入社区,社区持续纳新。
加入会员方式:关注公众号,在后台菜单栏中点击会员社区->会员入群加入