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.pswp.cn/news/905488.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905488.shtml
英文地址,請注明出處:http://en.pswp.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;就可以…