【Datawhale AI夏令營】從Baseline到SOTA:深度剖析金融問答RAG管道優化之路

從Baseline到SOTA:深度剖析金融問答RAG管道優化之路

引言

檢索增強生成(Retrieval-Augmented Generation, RAG)已成為構建知識密集型AI應用的事實標準 1。然而,從一個簡單的“hello world”級別的RAG,進化到一個能在競賽中(尤其是在金融文檔分析這類復雜領域)脫穎而出的系統,需要在架構的精密度上實現巨大飛躍 2。

本文將深入分析一個常見的RAG基線方案(Baseline),該方案與“訊飛星火杯”等多模態RAG問答挑戰賽提供的方案類似 3。我們將逐一拆解其組件,精準定位那些限制其性能的固有弱點,并為您鋪設一條全面、詳盡的工程優化路線圖,助您將其提升至業界頂尖(SOTA)水平 4。


解構Baseline:堅實但充滿裂痕的基礎

我們首先審視一下所提供的基線架構。它遵循一個經典的RAG兩階段流程 5。

階段一:離線預處理(構建知識庫) 6

  • 解析 (Parse):使用fitz (PyMuPDF) 從金融PDF年報中提取文本 7。

  • 分塊 (Chunk):按頁面為單位對文檔進行分割 (all_from_page_chunks) 8。

  • 嵌入與索引 (Embed & Index):使用bge-m3等模型對每個頁面塊進行嵌入,并存入一個簡單的內存向量庫 (SimpleVectorStore) 中 9。

階段二:在線推理(生成答案) 10

  • 查詢 (Query):使用相同的嵌入模型對用戶問題進行向量化 11。

  • 檢索 (Retrieve):執行簡單的向量相似度搜索,找出Top-K個最相似的頁面塊 12。

  • 生成 (Generate):將檢索到的頁面塊和原始問題一同輸入給大語言模型(LLM,如Qwen),生成最終答案 13。

弱點分析

該基線方案的自我剖析已正確指出了其缺點,但理解這些缺點背后的技術含義至關重要 14:

  1. 信息丟失(多模態問題):金融報告是天生的多模態文檔 15。僅用 fitz提取文本,會完全忽略圖像、圖表和復雜的表格結構,而這些地方往往蘊含著最關鍵的數據 16。這并非微不足道的損失,而是對信息全貌的

    災難性破壞 17。

  2. 上下文割裂(分塊問題)按頁分塊是其最核心的架構缺陷 18。一個頁面可能包含多個不相關的主題(例如,一部分資產負債表、一條關于訴訟的腳注、一段關于市場營銷的文字) 19。對這種“主題大雜燴”進行嵌入,會產生一個

    嘈雜、低保真的向量,它代表了內容的平均語義,而非具體的某個事實。這嚴重拉低了檢索精度,因為一個精準的查詢向量,在庫里根本找不到與之精準匹配的文檔向量 20。

  3. 檢索策略單一(“單腳馬”問題):完全依賴向量搜索是遠遠不夠的 21。向量搜索擅長理解語義(例如,“公司收益” vs “企業利潤”),但對于金融文檔中常見的

    特定關鍵詞、專有名詞縮寫或產品代號則無能為力 22。

這些缺陷會引發

級聯失敗:糟糕的解析與分塊導致了低質量的知識庫,這必然造成糟糕的檢索結果,最終迫使LLM從一堆嘈雜、不相關或不完整的上下文中生成答案 23。


優化路線圖:構建高精度RAG系統

要修正這一切,我們必須以“在每一步都最大化信噪比”為核心思想,重新設計整個流程 24。

階段一:高級解析與語義分塊

目標:將非結構化的多模態PDF,轉化為一系列干凈、語義連貫且富含上下文的數據塊 25。

1.1 告別fitz,擁抱多模態與結構化解析

我們不能再簡單地抽文字,而應將PDF視為一個

視覺文檔 26。

  • SOTA方案:大型多模態模型 (LMMs):使用具備視覺能力的模型(如 GPT-4V)來“閱讀”每個頁面 27。這類模型能理解布局、正確解析多欄文本、將表格轉錄為干凈的Markdown格式,并描述圖表內容 28。僅此一招,便可解決“信息丟失”的根本問題。

  • 務實方案:專業解析器:如果對整個數據集使用LMMs過于緩慢或昂貴,可以采用專業的文檔解析庫,如IBM的Docling。這些工具在處理復雜企業文檔布局方面,遠勝于通用工具 29。

1.2 從按頁分割到按義分塊

一旦你獲得了干凈、結構化的輸出(理想情況是Markdown),就可以實施更智能的分塊策略 30。核心目標是

創建代表單一、連貫思想的知識塊 31。

分塊策略工作原理適用場景
遞歸字符分割通過一系列層級化的分隔符(如\n\n, \n, .)遞歸地切分文本 32。一個快速且有效的基準策略,遠優于固定大小或按頁分割。適合處理敘事性文本 33。
文檔結構分割基于結構化元素(如Markdown的標題#, ##或HTML標簽)進行分割 34。強烈推薦。在使用LMM將PDF解析為Markdown后,你可以按章節分割,或將每個表格視為一個獨立的塊。這保留了文檔的邏輯流 35。
語義分塊使用嵌入模型檢測文本中的語義變化點,在主題切換處進行分割 36。能創建語義最連貫的知識塊,但計算成本更高 37。

優化建議:使用LMM將PDF解析為Markdown,然后應用基于文檔結構的分塊策略 38。這個組合為后續階段提供了最高質量的輸入 39。


階段二:兩階段檢索引擎

目標:在第一階段最大化召回率,在第二階段最大化精確率,確保最相關的文檔能被找到并被優先排序 40。

2.1 高召回:混合搜索 (Hybrid Search)

不要依賴單一的搜索方法,結合向量搜索和關鍵字搜索的優勢 41。

  • 稠密檢索(向量):使用高質量的嵌入模型(下文詳述)和FAISS等向量庫,找到語義相似的塊 42。

  • 稀疏檢索(關鍵字):使用強大的關鍵字算法,如 Okapi BM25 43。它優于TF-IDF等舊方法,非常擅長查找那些向量搜索可能遺漏的特定金融術語、人名或產品代碼 44。

  • 結果融合:使用**倒數排序融合(Reciprocal Rank Fusion, RRF)**等方法合并兩種搜索的結果 45。RRF對于不同搜索方式的得分尺度差異具有很好的魯棒性。第一階段應檢索大量候選文檔(例如,Top 50-100),以確保正確答案大概率包含在這個集合中 46。

2.2 高精度:重排序 (Reranking)

混合搜索撈回了一個寬泛的候選文檔網;現在我們需要精確地識別出其中的最佳選項 47。這需要通過**重排序器(reranker)**來完成,它是一個更強大(也更慢)的模型,用于重新評估候選集 48。

關鍵區別在于模型架構:

  • 雙編碼器 (Bi-Encoders) (用于初次檢索):為查詢和文檔分別創建嵌入向量,然后比較它們。速度快,可擴展 49。

  • 交叉編碼器 (Cross-Encoders) (用于重排序):將查詢和單個文檔同時輸入模型進行處理 50。這允許了深度的、令牌級別的交互,從而得到一個遠比向量相似度更準確的相關性分數 51。它對于搜索整個數據庫來說太慢,但對于重排50-100個候選文檔來說是完美的 52。

優化建議:在混合搜索之后,將Top 100的候選文檔傳遞給一個強大的交叉編碼器模型(如 bge-reranker-large)或專用的API(如Cohere Rerank),以獲得最終的、絕對最佳的3-5個知識塊 53。


階段三:上下文工程與提示詞優化

目標:打造完美、無噪音的上下文,并引導LLM生成一個精準、基于事實的答案 54。

3.1 上下文精煉

即便是排名最高的知識塊也可能包含不相關的句子。在送入LLM之前,先對它們進行“凈化” 55。

  • 上下文壓縮 (Contextual Compression):使用像LangChain的LLMChainExtractor這樣的工具,它會利用一個輕量級LLM來閱讀每個檢索到的塊,并僅提取與用戶查詢直接相關的句子 56。這能減少令牌消耗,并讓最終的LLM專注于最關鍵的信息。

  • 父文檔檢索器 (Parent Document Retriever):這是一個非常高效的模式。你嵌入并檢索的是小而具體的知識塊,以實現高精度檢索。但在生成答案時,你提供給LLM的是這些小塊所在的更大的“父”塊(例如,整個章節或頁面) 57。這為LLM提供了理解具體事實所需的豐富周邊上下文。

3.2 高級提示詞工程 (Prompt Engineering)

最后一步是構建高質量的提示詞。不要只是簡單地把上下文和問題堆在一起 58。

  • 使用結構化提示詞:清晰地界定角色、指令、上下文和問題 59。

  • 融入少量樣本 (Few-Shot Examples):提供1-2個復雜問題及其理想、推理清晰的答案范例 60。這有助于校準模型的行為,尤其是在處理答案為“N/A”等棘手情況時 61。

  • 強制事實性與推理:明確指示模型只能使用提供的上下文,進行逐步思考(思維鏈, Chain-of-Thought),并引用其答案的來源 62。

以下是一個更穩健的提示詞結構示例:

Markdown

你是一位一絲不茍的金融分析師。你的任務是僅基于下面提供的上下文來回答用戶的問題。不要使用任何先驗知識。如果答案在上下文中不存在,請回答 "N/A"。首先,進行一步步的推理過程,分析問題和上下文。
其次,根據你的推理,以請求的JSON格式提供最終答案。--- CONTEXT ---
[在此處插入你經過檢索和精煉的上下文,包括文件名和頁碼等元數據]
--- END CONTEXT ------ EXAMPLE ---
Question: 公司在2022年的收入是多少?
Context: 2023年報告第45頁指出:“我們2022財年的收入為15億美元。”
Reasoning:
1.  問題詢問2022年的收入。
2.  來自第45頁的上下文明確指出2022年的收入是15億美元。
3.  信息可以直接找到。
Final Answer:
{"answer": "15億美元","source_filename": "2023_report.pdf","source_page": 45
}
--- END EXAMPLE ------ USER QUESTION ---
Question: [在此處插入用戶的實際問題]
--- END USER QUESTION ---Reasoning:

模型選型:為任務選擇合適的工具

基線方案的模型選擇是一個不錯的起點,但我們可以更具策略性 63。

  • 嵌入模型 (Embedding Model):選擇至關重要。對于中文金融文本語料庫,一個通用的多語言模型并非最佳選擇 64。切換到一個在中文領域表現頂尖的模型,如

    bge-large-zh-v1.5。它將為你的領域提供保真度高得多的嵌入表示 65。

  • 重排序模型 (Reranker Model):如前所述,一個專用的交叉編碼器是必需品。bge-reranker-large 是一個強大的開源選項 66。若追求極致性能和易用性,可以考慮商業API,如

Cohere的RerankVertex AI Ranking API 67。

生成模型 (Generator LLM):Qwen是一個能力不錯的模型系列 68。然而,對于復雜的推理和嚴格的指令遵循能力,旗艦模型如

GPT-4Claude 3 Opus 通常能在質量和可靠性上提供顯著優勢,這可能成為競賽中的決定性因素 69。


結論:優化后的架構

通過實施上述變革,我們將簡單的基線方案轉變為一個為精度而生的、強大的多階段工作流 70:

  1. 解析:使用LMM(如GPT-4V)將PDF轉為結構化的Markdown,捕獲文本、表格和圖表 71。

  2. 分塊:基于文檔結構的分塊策略從Markdown中創建語義連貫的塊 72。

  3. 索引:使用頂級的中文嵌入模型(bge-large-zh-v1.5)在FAISS中構建向量索引,同時建立BM25索引以支持關鍵字搜索,從而構成一個混合索引 73。

  4. 檢索與融合:通過混合搜索檢索Top 100的候選文檔,并使用RRF進行融合 74。

  5. 重排序:一個強大的交叉編碼器(bge-reranker-large)對這100個候選項進行重排,找出最終的Top 3-5 75。

  6. 精煉與生成:使用上下文壓縮或父文檔模式對頂級塊進行精煉,然后將其輸入到一個強大的LLM(如GPT-4),并輔以一個高級的、包含少量樣本和思維鏈的提示詞 76。

這種方法系統性地解決了基線方案的每一個弱點 77。它擁抱了源數據的多模態特性,創建了一個高保真的知識庫,并利用一個精密的檢索漏斗,將干凈、相關的上下文傳遞給一個被充分指導的LLM。

這才是從一個功能原型邁向一個競賽級RAG系統的正確路徑 78。

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

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

相關文章

AI鑒偽技術:守護數字時代的真實性防線

文章目錄一、引言:AI偽造技術的“數字病毒”與鑒偽技術的“免疫疫苗”二、合合信息三大AI鑒偽技術解析2.1 人臉視頻鑒偽技術:毫秒級擊穿“數字假面”2.1.1 技術突破:從“像素級標記”到“多模態交叉驗證”2.2 AIGC圖像鑒別技術:讓…

論文reading學習記錄7 - daily - ViP3D

文章目錄前言一、題目和摘要二、引言三、相關工作四、方法五、訓練前言 開沖,清華大學的,帶HDmap的端論文,用的Query,和UniAD一樣。 一、題目和摘要 ViP3D: End-to-end Visual Trajectory Prediction via 3D Agent Queries ViP3…

Java學習第一百零九部分——Jenkins(一)

目錄 一、前言簡介 二、核心價值與優勢 三、關鍵概念 四、下載安裝與配置 五、總結歸納概述 一、前言簡介 Jenkins 是一個開源的、基于 Java 的自動化服務器。它的核心使命是實現持續集成和持續交付。簡單來說,Jenkins 是一個強大的工具,用于自動化…

微算法科技(NASDAQ:MLGO)使用循環QSC和QKD的量子區塊鏈架構,提高交易安全性和透明度

隨著量子計算技術的快速發展,傳統區塊鏈所依賴的加密算法面臨著被破解的潛在風險。量子計算的強大計算能力可能會在未來打破現有加密體系的安全性,從而對區塊鏈中的交易數據造成威脅。為了應對這一挑戰,將量子技術與區塊鏈相結合成為了必然的…

MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層 MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層

🔄 MyBatis SQL映射與動態SQL:構建靈活高效的數據訪問層 🚀 引言:動態SQL是MyBatis框架的核心優勢之一,它讓我們能夠根據不同條件動態構建SQL語句,避免了傳統JDBC中大量的字符串拼接。本文將深入解析MyBati…

v-model雙向綁定指令

文章目錄前言v-model.lazy 延遲同步v-model.trim 去掉空格前言 v-model指令是Vue.js中實現雙向數據綁定的一種重要機制。它可以將表單控件的值與Vue.js實例中的數據進行雙向綁定,即當表單控件的值發生變化時,Vue.js實例中的數據也會隨之更新&#xff0c…

電腦IP地址是“169.254.x.x”而無法上網的原因

一、核心原因:自動私有 IP 地址(APIPA)的啟用APIPA 機制:這是 Windows 等操作系統內置的一種 “備用方案”。當電腦設置為 “自動獲取 IP 地址”(通過 DHCP 協議),但無法從路由器、光貓等網絡設…

單片機存儲區域詳解

目錄 單片機內存區域劃分 boot引腳啟動介紹 1. boot引腳的三大啟動區域介紹 1.用戶閃存(User Flash) - 最常用模式 2. 系統存儲區(System Memory) - 出廠預置Bootloader區 3. 內置SRAM啟動(RAM Boot) - 特殊調試模式 2.用戶閃存(User Flash)內存管理詳解 一、用戶閃存中…

Go語言實戰案例:簡易JSON數據返回

在現代 Web 應用中,JSON 已成為前后端通信的主流數據格式。Go 語言標準庫內置對 JSON 的良好支持,只需少量代碼就能返回結構化的 JSON 響應。本篇案例將手把手帶你完成一個「返回 JSON 數據的 HTTP 接口」,幫助你理解如何用 Go 語言實現后端服…

扣子Coze中的觸發器實現流程自動化-實現每日新聞卡片式推送

基礎知識 什么是觸發器/能做什么 Triggers 智能體設置觸發器(Triggers),使智能體在特定時間或接收到特定事件時自動執行任務。為什么需要觸發器?實操步驟 第1步:打開一個智能體編輯頁第2步:技能 - 觸發器 -…

GitCode 7月:小程序積分商城更名成長中心、「探索智能倉頡!Cangjie Magic 體驗有獎征文活動」圓滿收官、深度對話欄目持續熱播

運營情況總結 🎉 截至7月底,GitCode 這個熱鬧的開發者社區,已經聚集了 656 萬位開發者小伙伴啦! 💻 產品:小程序積分商城更名為成長中心啦,更多功能將陸續上線。 🌟 G-Star&#xff…

機器學習之支持向量機(原理)

目錄 摘要 一、概述 二、SVM算法定義 1.超平?最?間隔介紹 2.硬間隔和軟間隔 1.硬間隔分類 2. 軟間隔分類 三、SVM算法原理 1 定義輸?數據 2 線性可分?持向量機 3 SVM的計算過程與算法步驟 四、核函數 五、SVM算法api介紹 1. 核心參數說明 2. 主要方法 3. 重…

【Unity3D實例-功能-跳躍】角色跳躍

今天,我們來聊聊 Unity 里最常打交道的動作之一——角色跳躍。無論是橫版闖關還是 3D 跑酷,跳躍都是讓角色“活”起來的核心操作。在 Unity 里,幾行腳本就能讓角色一蹬而起、穩穩落地。下面,就讓我們一起把這個“彈跳感”親手做出…

react+echarts實現變化趨勢縮略圖

如上圖,實現一個縮略圖。 import React, { useState, useEffect } from react; const ParentCom () > {const [data, setData] useState({});useEffect(() > {// 這里可以做一些接口請求等操作setData({isSheng: false, value: 11.24, percentage: 2.3%, da…

C語言宏相關操作

宏 宏名稱通常都是由大寫英文字母構成的宏名稱里不可以包含空格用宏給數字起名字的時候不可以使用賦值運算符,不要自增自減可以在編寫程序的時候直接使用宏名稱替代數字,編譯器在編譯的時候會把程序里的宏替換成它所代表的數字 1. 為什么要使用宏&#x…

STM32內部讀寫FLASH

很多情況下,在STM32中寫入一些數據,在某些不可控因素下其數據無法保存。因此,解決此問題就要用到FLASH.什么是內部 Flash? Flash 是一種非易失性存儲器,STM32 的程序和常量數據就存在 Flash 中。它的關鍵特點是:特性說…

Oracle 12c + Pl/Sql windows系統下表空間創建、遷移,dmp備份導入,數據庫字符集更改

一、開發環境 操作系統:win11 Oracle版本:12c Oracle 數據庫字符集:AL32UTF8 Pl/Sql版本:14 二、表空間創建 表空間是 Oracle 數據庫中一種重要的邏輯結構,它是數據庫中數據文件的邏輯集合,用于存儲數據庫對…

GUI:QT簡介

一、什么是QT?Qt是一套跨平臺的 C 圖形用戶界面(GUI)應用程序開發框架,由挪威 Trolltech(奇趣科技)于 1991 年創建,2008 年被諾基亞收購,2012 年后由 Qt Company 負責維護。它廣泛應…

oceanbase執行execute immediate create table提示無權限

問題:OB庫4.2.5.4版本,執行到這一句的時候,報沒有權限:[rootlnob ~]# obclient -h192.168.207.28 -P2881 -ugistarlnzyob -pxxxxxx -A Welcome to the OceanBase. Commands end with ; or \g. Your OceanBase connection id is 3…

滴滴招java開發

滴滴集團 北京(崗位信息已經過jobleap.cn授權,可在csdn發布)收錄時間: 2025年08月01日職位描述 負責滴滴海外業務準入審核及反作弊相關系統的后端開發及系統維護; 職位要求 1、統招本科及以上學歷,計算機科…