???????【Datawhale AI夏令營】多模態RAG財報問答挑戰賽:學習筆記與上分思考

一、 初識賽題——從迷茫到清晰

剛看到賽題時,坦白說有些不知所措。“多模態”、“RAG”、“圖文混排PDF”,這些詞匯組合在一起,聽起來就像一個龐大而復雜的工程。但當我強迫自己靜下心來,從“終點”(提交格式和評審規則)倒推整個流程后,任務的核心瞬間清晰了。

我的頓悟:

  1. 這不是一個聊天機器人,而是一個“引經據典”的“學術助理”。 我們的最終目標不是生成一段華麗但空洞的回答,而是要為 test.json 里的每一個 question,精準地提供三樣東西:answer (答案)、filename (來源文件)、page (來源頁碼)。

  2. “可溯源”是王道。 評審規則里,filenamepage 的匹配度占了總分的50%!這意味著,一個內容完美的答案如果來源錯誤,得分會大打折扣。反之,一個內容尚可但來源精準的答案,也能拿到一半的基礎分。這個發現直接決定了我的優化方向:溯源的準確性與答案內容的質量同等重要。

  3. 核心矛盾: 機器(特別是LLM)天生只懂文本,而我們的知識庫(PDF)卻是圖文并茂的。如何將視覺信息(圖表)轉化成機器能理解的格式,并與文本信息建立聯系,是這個賽題最核心的挑戰。

基于以上理解,我將賽題的四大難點,用我自己的話重新梳理了一遍:

  • 難點一(信息轉化): 怎么讓AI“看懂”圖片和表格?尤其是財報里的各種業績圖、流程圖,信息密度極高。

  • 難點二(精準定位): 怎么在成堆的PDF中,像偵探一樣快速找到包含答案線索的那一頁、那一段?大海撈針,還不能撈錯。

  • 難點三(忠實回答): LLM很能“腦補”,怎么給它戴上“緊箍咒”,讓它只根據我們找到的資料說話,別自由發揮?

  • 難點四(協同優化): 如何平衡“答得對”和“找得準”這兩個目標?我的整個系統設計必須同時為這兩個指標服務。

二、 解剖Baseline——一個完整的起點

通讀了Baseline方案后,我對其設計思路有了清晰的認識。它是一套經典的文本RAG流程,巧妙地繞過了最棘手的多模態問題。

Baseline流程的兩大階段:

  1. 離線預處理(構建知識庫):

    • 解析(Parse): 使用 fitz_parse_pdf.py 腳本,將所有PDF的純文本內容按“頁”為單位提取出來,保存成一個大的JSON文件 (all_pdf_page_chunks.json)。

    • 向量化與索引(Index):rag_from_page_chunks.pysetup() 函數中,加載上述JSON,調用Embedding模型(如BGE-M3)將每一頁的文本內容轉換成向量,然后存入一個簡單的內存向量庫(SimpleVectorStore)。

  2. 在線推理(回答問題):

    • 檢索(Retrieve): 接收一個問題,同樣將其向量化,然后在向量庫中搜索最相似的Top-K個頁面文本作為上下文。

    • 生成(Generate): 將“問題”和“檢索到的上下文”打包成一個精心設計的Prompt,喂給大語言模型(LLM,如Qwen),并指令它以JSON格式輸出答案、來源文件和頁碼。

我對Baseline的評價:

  • 優點: 邏輯清晰,端到端完整。它是一個“麻雀雖小,五臟俱全”的系統,讓我能夠快速跑通整個流程,建立對RAG的基本認知。模塊化設計也為后續的優化提供了便利。

  • 核心不足:

    1. 信息丟失嚴重: PyMuPDF (fitz) 只提取文本,完全丟棄了所有圖表、表格信息。這是它最大的短板,直接導致所有基于視覺信息的問題都無法回答。

    2. 分塊策略粗糙: 按“頁”分塊,一頁可能包含多個不相關的主題,也可能一個主題被分頁符切斷,這會嚴重影響檢索的精度。

    3. 檢索過于簡單: 單純的向量相似度搜索,容易引入噪音,干擾LLM的判斷。

這個Baseline是一個絕佳的起點,它的不足之處,恰恰就是我們上分的突破口。

三、 我的上分之路——從Baseline到更高分的進階方案

針對Baseline的不足,我設計了一個三步走的優化路線圖,從易到難,逐步提升系統性能。

第一步:低成本快速優化 (Low-hanging Fruits)

這些改動不涉及復雜的模型訓練,但能快速見效。

  1. 精調Prompt (Prompt Engineering):

    • 目標: 降低幻覺,提高溯源準確性。

    • 方案:rag_from_page_chunks.py 中修改 PROMPT_TEMPLATE

      • 增加嚴格指令: 明確要求LLM:“你必須嚴格依據提供的‘上下文’作答。如果‘上下文’中沒有答案,請明確回答‘根據現有信息無法回答’。你的答案必須從‘上下文’中提供的某一個‘chunk’中總結得出,并使用該‘chunk’的file_namepage作為來源。”

      • 引入Few-shot示例: 在Prompt中加入1-2個高質量的問答示例,向LLM展示理想的輸入輸出格式,特別是如何從多個上下文中選擇最相關的一個作為來源。

  2. 優化分塊策略 (Smarter Chunking):

    • 目標: 提高檢索內容的信噪比和完整性。

    • 方案: 放棄按“頁”分塊。改用更智能的分塊方法。

      • 策略: 使用langchain.text_splitter中的RecursiveCharacterTextSplitter,按段落、標題等遞歸地切分文本。

      • 實現: 設置一個合理的塊大小(chunk_size,例如512個字符)和重疊大小(chunk_overlap,例如50個字符)。重疊可以保證語義的連續性,避免關鍵信息被切斷。這將生成更小、更聚焦的知識塊,大大提升檢索精度。

第二步:攻克核心難點 (Tackling the Core Challenges)

這是拉開分數差距的關鍵一步,直接面對多模態和數據質量問題。

  1. 更換PDF解析引擎:從 PyMuPDFMinerU

    • 目標: 實現真正的圖文信息提取,這是整個方案從量變到質變的一步。

    • 方案:

      • 棄用 fitz_parse_pdf.py,改用 mineru_pipeline_all.py(或自己基于MinerU編寫腳本)。

      • 效果: MinerU能進行版面分析,將PDF解析為包含標題、段落、表格(轉為Markdown格式)、圖片等多元素的結構化數據。現在,我的知識庫里不僅有文本,還有了結構化的表格被識別出的圖片

  2. “圖片文本化”:引入VLM生成圖像描述 (Image-to-Text)

    • 目標: 讓系統理解圖片的內容。

    • 方案: 這是對MinerU提取出的圖片信息的二次處理。

      • 工具: 調用一個強大的多模態大模型(VLM),如通義千問Qwen-VL

      • 流程: 遍歷所有被MinerU提取出的圖片,用Qwen-VL為其生成詳細的文本描述。對于圖表,Prompt可以更具引導性:“請詳細描述這張圖表。它的標題是什么?橫軸和縱軸代表什么?數據的主要趨勢和關鍵節點是什么?”

      • 融合: 將這些生成的“圖片描述”作為新的文本塊,與原始文本塊一樣,附上它們的元數據(文件名、頁碼),一起存入向量數據庫。

    • 成果: 經過這一步,我的RAG系統雖然底層仍然是文本檢索,但知識庫已經融合了圖像信息,實現了“偽多模態”,能夠回答基于圖表內容的問題了。

第三步:向高分榜沖刺 (Advanced Optimizations)

當基礎框架搭建完畢,這些高級技巧可以進一步挖掘系統潛力。

  1. 智能檢索:引入重排模型 (Re-ranking)

    • 目標: 解決Top-K檢索結果中噪音過多的問題,優中選優。

    • 方案:

      • 兩階段檢索:

        1. 召回(Recall): 先用快速的向量搜索,召回一個較大的候選集,比如Top 20個知識塊。

        2. 重排(Re-rank): 然后使用一個更強大的Cross-Encoder模型(如BGE-ReRanker),對這20個知識塊與問題的相關性進行更精細的計算和排序,最終選出Top 3或Top 5個最相關的知識塊交給LLM。

      • 效果: 極大地提升了喂給LLM的上下文質量,是提升答案準確率的利器。

  2. 真·多模態:端到端多模態模型方案

    • 目標: 讓模型直接看圖說話,避免“圖片->文字”過程中的信息損失。

    • 方案:

      • 多路召回: 當問題輸入后,不僅在文本向量庫中搜索,如果問題可能與圖像相關,也同時在圖像向量庫(用CLIP等模型構建)中搜索。

      • 多模態生成: 將檢索到的文本塊原始圖片文件一起作為上下文,提交給一個強大的多模態生成模型(如Qwen-VL-Max)。Prompt會變成:“請根據以下文本和圖片,回答問題...”。

      • 挑戰: 這個方案對模型的選擇和系統流程的設計要求更高,但它是解決此類問題的最前沿、最徹底的方案。

四、 總結與反思

這次比賽的學習過程,對我來說是一次非常寶貴的經歷。我最大的收獲是:

  • 從終局思考: 永遠先理解任務目標和評價標準,這會指引你所有技術選型的方向。

  • 數據質量是生命線: Garbage in, garbage out。在RAG系統中,PDF解析的質量直接決定了知識庫的天花板。在MinerU上的投入是性價比最高的。

  • 迭代式開發: 不要妄想一步到位構建一個完美的系統。從一個能跑通的Baseline開始,通過分步優化,不斷給它“打補丁”、“升級零件”,才是最穩健的路徑。

  • 擁抱開源工具: Xinference, MinerU, HuggingFace Transformers... 無數強大的開源工具極大地降低了我們實現復雜系統的門檻。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92376.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據挖掘2.6 Perceptron Modeling 感知器建模

Perceptron Modeling 感知器建模Linear Discriminants 線性判別式Loss Function 損失函數misclassification 誤分類0-1 Loss/Error function 0-1損失函數Hinge Loss Function 鉸鏈損失函數Optimization 優化算法Linear Discriminants 線性判別式 線性判別式公式 f(x;w)w1x(1)w…

使用qemu運行與GDB調試內核

目錄 一、前期準備 二、內核編譯 三、QEMU與GDB 1、QEMU調試參數 2、gdb vmlinux 一、前期準備 內核鏡像:bzimage gdb:x86_64 QEMU:qemu-system-x86_64 前置知識: (1)內核編譯 (2&#x…

歐盟 Radio Equipment Directive (RED)

歐盟 Radio Equipment Directive (RED) ——從 2014/53/EU 原文到 2025-08-01 強制生效的網絡安全新規,一次看懂全部關鍵點。1. 法規身份與適用范圍要素內容指令全稱Directive 2014/53/EU on radio equipment取代指令1999/5/EC (R&TTE)適用產品所有“有意發射/接…

【FastExcel】解決ReadSheet在Map中獲取對象不準確問題(已提交PR并合并到開源社區)

解決問題&#xff1a;源碼ReadSheet在同一個Map中獲取對象不準確問題 PR&#xff1a;Fixed the issue where different ReadSheet objects could not get the correct value when comparing them. 一&#xff1a;問題場景 ReadSheet在同一個Map中獲取對象不準確(如Map<…

【網絡安全入門基礎教程】TCP/IP協議深入解析(非常詳細)零基礎入門到精通,收藏這一篇就夠了

前言 這是小編給粉絲盆友們整理的網絡安全入門到精通系列第三章計算機網絡中TCP/IP協議的解析&#xff0c;喜歡的朋友們&#xff0c;記得給大白點贊支持和收藏一下&#xff0c;關注我&#xff0c;學習黑客技術。TCP/IP協議包含了一系列的協議&#xff0c;也叫TCP/IP協議族&…

Latex中公式部分輸入正體的字母\mathrm{c}

Latex中公式部分輸入正體的字母\mathrm{c}“\mathrm{c}”如何在Word中輸入\mathrm{c}“\mathrm{c}” 在 LaTeX 中&#xff0c;“\mathrm{c}” 用于在數學模式中排版“c”這個字母為羅馬體&#xff08;正體&#xff09;。“\mathrm” 是羅馬字體命令&#xff0c;它告訴LaTeX以羅…

Document Picture-in-Picture API擁抱全新浮窗體驗[參考:window.open]

在前端開發中&#xff0c;我們經常會遇到這樣的需求&#xff1a;彈出一個浮動窗口來顯示一些實時信息、工具欄或視頻內容。過去我們會用 window.open()&#xff0c;后來越來越多的開發者傾向于使用 Modal。但現在&#xff0c;一個更現代的 API 出現了——Document Picture-in-P…

【指南版】網絡與信息安全崗位系列(三):安全運維工程師

一、安全運維工程師到底做什么&#xff1f;—— 用校園場景幫你理解簡單說&#xff0c;安全運維工程師就像 “網絡世界的安保隊長 系統管家”&#xff1a;既要實時監控網絡和系統的 “異常動靜”&#xff08;類似學校保安巡邏查隱患&#xff09;&#xff0c;又要負責日常的安全…

matlab——simulink學習(5向NXP庫中添加新模塊)

向NXP庫中添加新的函數模塊一、環境二、庫添加模塊1.打開文件夾2.創建文件3.添加S-Function三、瀏覽器添加模塊一、環境 Windows10、MATLAB R2022b、安裝NXP的S32K1XX系列工具包 二、庫添加模塊 1.打開文件夾 在文件系統中找到安裝工具包的位置&#xff0c;用文件資源管理器…

使用ProxySql實現MySQL的讀寫分離

ProxySQL簡介1、ProxySQL是一款開源的使用C編寫的MySQL集群代理中間件&#xff1b;2、用于在MySQL數據庫和客戶端之間進行負載均衡、查詢緩存、故障轉移和查詢分發&#xff1b;3、它可以作為中間層插入到應用程序和數據庫之間&#xff1b;4、特點是高效靈活&#xff0c;使用簡單…

WiFi 核心概念與實戰用例全解

&#x1f4d6; 推薦閱讀&#xff1a;《Yocto項目實戰教程:高效定制嵌入式Linux系統》 &#x1f3a5; 更多學習視頻請關注 B 站&#xff1a;嵌入式Jerry 1. WiFi基礎與協議 WiFi&#xff08;Wireless Fidelity&#xff09;是基于IEEE 802.11協議族的無線局域網&#xff08;WLAN…

面向遠程智能終端的超低延遲RTSP|RTMP視頻SDK架構與實踐指南

引言&#xff1a;遙操作時代&#xff0c;視覺鏈路已成“主控神經元” 從工業巡檢到應急救援&#xff0c;從城市安防到邊境監控&#xff0c;遠程操控正成為智能終端與人機協同的重要落點。而在這些場景中&#xff0c;“視覺”不再只是用來觀看的工具&#xff0c;而是貫穿感知、…

C++中的繼承:從基礎到復雜

目錄 前言 1. 繼承的基本概念 2. 繼承方式與訪問控制 3. 派生類與基類的對象轉換 4. 繼承中的作用域 5. 派生類的默認成員函數 6. 繼承中的特殊關系 6.1 繼承與友元 6.2 繼承與靜態成員 7. 復雜的菱形繼承問題 8. 繼承與組合的選擇 9. 常見面試題 總結 前言 繼承…

Eyevinn 徹底改變開源部署模式

該咨詢公司借助Akamai云平臺&#xff0c;為其創新的開源平臺和可持續收益分成模式提供強大支持。 "時間就是金錢&#xff0c;我們通過Akamai云平臺快速將開源云平臺投入生產。" ——Eyevinn Technology研發副總裁 Jonas Birm實現可持續視頻流媒體服務 自2013年以來&…

17day-人工智能-機器學習-分類算法-KNN

1. 什么是knn算法knn算法全名叫做k-近鄰算法&#xff08;K-Nearest Neighbors&#xff0c;簡稱KNN&#xff09;&#xff0c;看到名字是不是能想到是算距離的&#xff0c;第一個k是指超參數的意思&#xff0c;就是可以認為設置的意思&#xff0c;這里是指最近的k個樣本。2. 為什…

12-netty基礎-手寫rpc-編解碼-04

netty系列文章&#xff1a; 01-netty基礎-socket02-netty基礎-java四種IO模型03-netty基礎-多路復用select、poll、epoll04-netty基礎-Reactor三種模型05-netty基礎-ByteBuf數據結構06-netty基礎-編碼解碼07-netty基礎-自定義編解碼器08-netty基礎-自定義序列化和反序列化09-n…

解決 Windows 下的“幽靈文件”——記一次與帶空格的 .gitignore 文件的艱難斗爭

引言 你是否遇到過這樣的情況&#xff1a;一個文件明明躺在你的文件夾里&#xff0c;ls 或 dir 命令都能清楚地看到它&#xff0c;但無論你用什么方法嘗試刪除&#xff0c;系統都冷酷地告訴你“找不到文件”&#xff1f; 就在今天&#xff0c;我就遇到了這樣一個“幽靈”般的 .…

(易視寶)易視TV is-E4-G-全志A20芯片-安卓4-燒寫卡刷工具及教程

&#xff08;易視寶&#xff09;易視TV is-E4-G-全志A20芯片-安卓4-燒寫卡刷工具及教程PhoenixCard_V309燒錄步驟&#xff1a;1、將TF或SD卡插入計算機&#xff0c;打開軟件&#xff1b;2、選擇固件所在目錄&#xff1b;3、燒寫模式選“卡量產”4、點擊“燒錄”開始量產&#x…

(數據結構)順序表實現-增刪查改

1.線性表 線性表(linear list)是n個具有相同特性的數據元素的有限序列。線性表是一種在實際中廣泛使用的數據結構,常見的線性表:順序表、鏈表、棧、隊列、字符串… 線性表在邏輯上是線性結構,也就說是連續的一條直線。但是在物理結構上并不一定是連續的,線性表在物理上存儲時…