动态

详情 返回 返回

LazyLLM 教程 | 第 13 講:RAG + 多模態:圖片、表格通吃的問答系統 - 动态 详情

圖片

在前面的課程中,我們探討了 RAG(Retrieval-Augmented Generation)的基本原理及其在純文本處理中的應用。RAG 通過從外部知識庫檢索相關信息,結合上下文生成更準確、信息豐富的回答,從而提升基於文本的問答系統能力。

然而,現實世界中的信息並不侷限於文本,例如 PDF 文檔中的圖片、表格等多模態數據也承載着大量有價值的知識。在某些情況下,這些圖文並茂的內容比純文本更直觀、有效。但 RAG 主要依賴文本檢索和生成,對 PDF 文件中的圖片處理能力較弱,無法直接解析和利用圖像信息進行檢索或生成,可能導致關鍵信息遺漏,影響最終回答質量。因此,在 RAG 處理包含重要圖片信息的 PDF 文檔時,需要結合 OCR(光學字符識別)計算機視覺技術進行補充,以提高內容解析能力。

本節課程將介紹如何在 RAG 系統中處理 PDF 中的圖片與表格,並提取其中的關鍵信息進行問答,從而增強系統對多模態數據的理解與應用。

多模態模型

一、為什麼要引入多模態 ?

在實際應用中,我們常常需要從合同、報告、產品説明書等多種形式的文檔中提取有用信息。這些文檔不僅包含豐富的文字內容,還可能包括圖片、圖表、表格等非文本信息。下面是某頁PDF原始視圖的信息展示。

圖片

現在,我們使用普通模型與多模態模型分別讀取PDF的內容。在讀取包含圖文信息的 PDF 時,生成的“可用於檢索/生成的文本格式”之間的區別如下:

圖片

我們可以看到原始 RAG 主要依賴對文本的檢索與生成,無法充分理解和利用圖像、圖表中承載的重要內容,會導致相關內容的缺失,這在處理 PDF 等複雜文檔時尤為明顯。因此,為了讓普通 RAG 在更多真實場景下保持高效、智能的表現,我們亟需引入多模態能力,結合 OCR、圖像理解等技術,讓模型具備“讀圖識意” 的能力,從而真正實現對多模態信息的智能問答與生成。

二、簡介

在現實世界中,信息從不以單一模態呈現。人類的日常感知依賴於多種模態的協同輸入,包括視覺、聽覺、語言、觸覺等,這些感知共同構成了我們對世界的整體理解。當研究任務或數據涉及多種模態信息時,我們將其稱為“多模態問題”(Multimodal Problem)。有效應對這類問題,是推動人工智能系統向類人認知邁進、實現“類人智能”的關鍵一步。

圖片

正因如此,多模態大型語言模型(Multimodal Large Language Models,MLLM)應運而生。它是在大型語言模型(LLM)與大型視覺模型(LVM)不斷演進的基礎上發展起來的。

LLM 在語言理解、推理能力、指令跟隨、上下文學習和思維鏈等方面不斷突破,推動了自然語言處理技術的廣泛應用。然而,它在處理圖像、音頻等非語言模態信息時仍面臨侷限。與此同時,LVM 在圖像識別、目標檢測、圖像分割等視覺任務中取得了顯著成果,一些模型已能接受語言指令並執行特定視覺任務,但其推理與跨模態能力仍有待提升。這促使研究者嘗試融合 LLM 的語言能力LVM 的感知能力,從而實現圖文等多種模態的信息理解與生成。

MLLM 正是這種融合的產物。通過聯合建模、跨模態對齊等技術路徑,MLLM 可以同時處理文本與圖像等多模態輸入,在圖文問答、多模態檢索、輔助創作等任務中展現出更強的理解力與生成力,為人工智能邁向更廣闊的認知世界奠定基礎。

三、基本原理

在瞭解了多模態大模型的概念和發展背景之後,我們接下來深入探討其基本原理。多模態大模型之所以強大,核心在於它能夠理解、對齊並融合來自不同模態的數據,如文本、圖像、語音甚至視頻,實現統一的信息建模與推理。我們可以從以下三個層次來理解其基本原理:

感知層:模態感知與特徵提取

不同模態的數據具有不同的結構特性,例如:

  • 圖像是二維像素網格;
  • 語音是連續的聲波信號;
  • 文本是離散的符號序列;
  • 視頻是幀序列的組合。

在感知層,每種模態需要一個專門的編碼器來提取其特徵。比如:

  • 圖像通常使用卷積神經網絡(CNN)或視覺Transformer(ViT)提取空間特徵;
  • 音頻可以使用卷積網絡或頻譜 Transformer 處理;
  • 文本則由 預訓練語言模型(如 BERT、GPT)進行編碼。

這一步的關鍵是將不同模態的數據轉換成統一結構的向量表示(embedding),以便後續處理。

對齊層:表示對齊與語義映射

由於不同模態的 embedding 本質上來自不同空間,它們的語義分佈不一致,不能直接融合。這時需要一個“橋樑”模塊——連接器(Connector),來實現表示空間的映射和對齊。常見的對齊策略有:

  • MLP 映射:通過一個簡單的多層感知機網絡將非文本模態的向量映射到文本 embedding 的空間,從而實現空間變換;
  • 跨模態注意力(Cross-Attention):使用圖像或音頻向量作為 Key/Value,通過 Transformer 解碼器模塊與文本空間交互;
  • 內部融合機制:在模型內部結構層面實現模態間的融合,比如直接將圖像 patch 和文本 token 混合輸入。

這一層的核心目標是:建立模態之間的語義關聯性,讓模型能夠“理解”圖像中的物體與文本描述之間的關係,或者讓語音與文字對齊。

理解與生成層:統一語義建模與跨模態推理

當所有模態的表示被映射到一個統一的空間後,就可以輸入到大語言模型(LLM)中,進行深入理解和生成。此時:

  • LLM 扮演“推理中樞”的角色,利用其強大的上下文理解能力,對多模態信息進行整合;
  • 通過語言建模目標(如下一詞預測、問答等),驅動整個多模態系統學習跨模態推理能力;
  • 輸出不僅限於文本,也可以是圖文對話、圖像描述、音頻問答等形式。

我們可以看出多模態大模型並非只是簡單地把圖像和文本“拼接”在一起,而是通過編碼 → 對齊 → 理解的流程,實現了模態間的語義融合與統一推理。這種設計使得 MLLM 具備類人認知能力:能看圖説話、聽音理解、跨模態問答,甚至進行多模態創作。

四、模型架構

從類比人類感知系統的角度來看,多模態大模型的架構可以理解為:編碼器就像人的眼睛和耳朵,負責接收視覺、聽覺等外部信息,並將其轉化為“感知信號”;LLM(大語言模型)則類似於人腦,對這些信號進行理解、推理與生成。

圖片

多模態大模型的整體結構通常包括三個核心模塊:模態編碼器(Modality Encoder)、連接器(Connector) 和語言模型(LLM)。

模態編碼器(Modality Encoder)

  • 作用:將不同模態的數據(如圖像、音頻、視頻、文本)轉化為向量表示(embedding)。
  • 特點:每種模態使用專門的模型進行編碼,如 CNN/ViT 處理圖像、語音模型處理音頻、語言模型處理文本。

連接器(Connector)

  • 作用:將非文本模態的向量映射到與文本 embedding 相容或可對齊的空間,解決語義空間不一致的問題。
  • 常見連接方式
    MLP 映射:通過多層感知機進行空間轉換;
    Cross-Attention 映射:使用跨模態注意力機制建立模態間交互;
    模型內部融合:如將圖像 patch 與文本 token 混合輸入,實現底層結構級融合。

語言模型(LLM)

  • 作用:接收統一後的向量表示,執行理解與生成任務;
  • 特點:作為推理核心,LLM 支持圖文對話、問答、描述等任務,是整個多模態系統的關鍵部分。

多模態輸入(如圖像、音頻、視頻等)和文本數據在形式上不同,因此需要先通過各自的編碼器將其轉化為向量表示(embedding)。但這些向量初始時並不一定處於與文本 embedding 相同的空間中。這時就需要連接器模塊,它的作用是將多模態的 embedding 映射到與文本 embedding 相容或可對齊的空間。

常見的三種連接方式包括前面提到的MLP 映射Cross-Attention 映射以及模型內部融合。無論我們使用哪種連接方式,最終的核心還是預訓練好的 LLM,它對統一後的表示進行理解和生成,是整個多模態處理流程中最關鍵的推理單元。

五、主流開源模型

2b21a7fb-16c1-4fe7-aee5-39a4cb4109da.webp

在多模態大語言模型(MLLM)興起之前,已有不少工作致力於多模態學習,主要分為兩類技術路線:

  • 判別式範式(Discriminative Paradigm):以 CLIP 為代表,側重於學習圖文匹配與對齊,主要用於圖像分類、檢索等任務;
  • 生成式範式(Generative Paradigm):以 OFA、VL-T5、Flamingo 等為代表,強調跨模態生成,如圖像描述、視覺問答等。

MLLM 可看作是生成式多模態模型的發展延續,在更強大的語言模型支撐和全新的訓練範式加持下,能力邊界被大幅拓展。

目前主流的開源 MLLM 通常基於大規模預訓練語言模型(如 LLaMA、Vicuna),結合圖像編碼器(如 CLIP-ViT、BLIP)和連接器模塊,將圖像信息有效映射到語言模型可處理的表示空間。多數模型採用多模態指令微調策略,使其具備“看圖説話”“圖文對話”“跨模態推理”等複雜能力。典型的開源項目包括 LLaVA、MiniGPT-4、InstructBLIP 和 Fuyu,覆蓋了輕量化部署、對話體驗優化和推理能力提升等多個方向。

這些模型普遍採用“圖像編碼器 + 連接器 + LLM”的模塊化架構,結合不同的訓練目標與任務場景,持續推動多模態模型在泛化能力和實際應用層面的突破。

六、在LazyLLM中使用多模態大模型

LazyLLM 已支持多模態大模型接入(如圖文問答、圖文理解等場景),可通過以下方式快速啓動並使用。以智譜的多模態模型 glm-4v-flash 為例,使用 LazyLLM 啓動服務:

import lazyllm
chat = lazyllm.OnlineChatModule(source="glm", model="glm-4v-flash")
lazyllm.WebModule(chat, port=23333, files_target=chat).start().wait()
除了 glm-4v-flash,LazyLLM 同樣支持多種主流多模態大模型,如Qwen-VL 系列、OpenAI GPT-4V等,但需要用户自行申請和配置API Key 。

啓動後,用户可通過 WebUI 頁面上傳圖片、輸入問題,實現圖文混合問答體驗。

圖片

多模態RAG

一、RAG多模態架構多模態

RAG(Retrieval-Augmented Generation)擴展了傳統 RAG 的能力,使其能處理文本、圖像、音頻等多種模態,實現更豐富的信息檢索與生成。其核心在於跨模態對齊與融合,依賴多模態嵌入(Multimodal Embedding)將不同類型數據映射到統一表示空間,以便高效檢索與生成。CLIP、BLIP 等模型的發展推動了這一技術,使多模態 RAG 更精準地整合多模態信息,增強理解與生成能力。下面我們將從整體架構出發,帶領讀者深入瞭解多模態 RAG 的基本原理及其作用。

多模態 RAG VS 基礎

RAG在前面的 RAG 架構圖中,我們主要針對文本數據進行了檢索與生成。然而,要支持多模態輸入和輸出,需要對原有 RAG 架構進行一定的調整和擴展。

圖片

首先,需要修改的模塊包括:

  • 檢索模塊:原本僅支持文本檢索,現在需要擴展為支持多模態檢索,例如圖像、音頻等信息的索引和匹配。
  • 生成模塊:原始 RAG 僅針對文本生成,現在需要擴展支持多模態輸出,如文本結合圖像、音頻的生成能力。

其次,需要新增的模塊包括以下四個部分:

模塊 功能
多模態編碼器 用於對不同模態的數據(文本、圖像、音頻等)進行編碼,以便統一表示並用於檢索和生成。
多模態融合器 用於融合不同模態的信息,使其能夠協同作用,提高生成內容的準確性和豐富度。
跨模態檢索器 支持輸入多種數據格式,並能在多模態知識庫中找到相關信息。
多模態解碼器 負責將生成結果解碼為多種形式,如文本、圖片、語音等,以適應不同的輸出需求。

二、多模態RAG的核心組件

為了支持多模態輸入和輸出,調整和擴展後的多模態RAG 流程圖如下:

圖片

下面簡單講一下每個組件的功能以及相關輸入輸出示例。

多模態編碼與融合

在多模態RAG系統中,多模態編碼模塊是將不同類型的輸入(如文本、圖像、音頻等)統一映射到向量空間的關鍵組件。其主要作用是對用户查詢和知識庫內容進行編碼,以便進行相似度檢索與上下文構建。相比於傳統僅處理文本的 RAG,多模態 RAG 需要將圖文等多源信息編碼進行統一編碼,從而實現跨模態信息的理解與匹配。

圖片

文本編碼常用模型

  • BAAI/bge系列(如 bge-m3:支持多語言和長文本處理,生成高質量語義嵌入)
  • Cohere Embed(提供高效的語義編碼和上下文理解,適用於文本檢索與生成任務)
  • GTE-large(專注於高精度語義匹配與檢索,適合大規模文本數據處理)

多模態編碼常用模型

  • 圖像編碼:NFNet-F6、ViT、CLIP ViT
  • 音頻編碼:Whisper、CLAP
  • 視頻編碼:CMVC

在RAG系統中,多模態數據編碼的融合是一個核心問題。為實現跨模態信息的有效交互與檢索,我們需要將不同模態的數據映射到一個統一的向量空間中。這樣,不論是文字還是非文字信息,都可以在同一語義空間中進行相似性度量、檢索和生成任務。這裏介紹三種常用方法。

1. 統一模態

將所有模態轉化成相同模態(通常是文本)來達到統一向量空間的目的。

  • 常見做法:對於非文本模態(如圖像、音頻、表格等),首先通過專門的模型將其轉換為具有語義信息的描述性文本,然後統一採用文本編碼器進行向量化處理。
  • 例如:圖像可以通過圖像描述生成模型轉化為自然語言描述,音頻可通過語音識別模型轉寫為文本,結構化數據(如表格)則可藉助表格理解或摘要模型生成文本説明。最終,這些文本內容被統一輸入到文本編碼模型中,得到位於同一語義空間的向量表示。

2. 跨模態編碼

通過聯合嵌入技術,可以直接將多模態數據編碼到同一個統一的向量空間中,無需將非文本模態轉換為中間形態。

  • 目前,已有多種模型實現了多模態混合編碼,能夠同時處理文本、圖像、音頻等多種模態輸入。
  • 常見的多模態編碼器有圖像類的CLIP等,音頻類的CLAP等。這種編碼方式更有效地保留了原始模態的信息,可提升下游任務表現,同時簡化了數據流程,為RAG等系統提供一致的向量接口,更具工程優勢。

3. 分離檢索

第三種方式使用多個專門模型分別處理不同模態的數據(如圖像、音頻、文本),再在檢索階段融合結果。

  • 這種方法具備較高的靈活性,能針對每種數據類型採用最優模型,從而提升檢索的準確性與相關性。儘管增加了系統複雜性和實現難度,但在強模態模型不斷髮展的背景下,這種多模型協作的多模態 RAG 架構正變得越來越有吸引力。

多模態檢索模塊

1.  基礎檢索

處理單一模態的查詢,如文本到文本、圖像到圖像的匹配。

輸入 輸出
文本查詢:"一隻黑白相間的小貓" 相關文本段落,如"黑白相間的小貓通常是美國短毛貓"
圖像查詢:圖片 相關圖像,如下:圖片

   

當輸入為文本查詢,如"一隻黑白相間的小貓"時,則會輸出相關文本段落,如 "黑白相間的小貓通常是美國短毛貓";而當輸入為圖像查詢時,如一張黑白相間小貓的照片時,則會輸出相關圖像,如一張黑白貓的圖片。檢索通常依賴嵌入相似度計算,如餘弦相似度:

圖片

其中q是查詢文檔的嵌入向量,d是候選文檔的嵌入向量。如果計算出的相似度高於某個閾值(例如0.9),則認為該文檔相關。

2.  跨模態檢索

支持跨模態查詢,例如文本查詢匹配圖像,或圖像查詢匹配文本。

輸入 輸出
文本查詢:"一隻黑白相間的小貓" 相關圖像,如一張黑白貓的圖片,如下: 圖片

當輸入為文本時,如"小貓長什麼樣?",則會輸出最相關的貓的圖片;而當輸入為貓的照片時,則會輸出相關描述文本,如 "這是一隻黑白相間的美國短毛貓"。

多模態生成模塊

原有 RAG 僅支持文本生成,現在擴展為支持多模態輸出,例如生成帶有圖片的回答或結合語音的解釋。

輸入 輸出
文本查詢:"黑白相間的貓長什麼樣?" 圖文回答:文本 + 一張黑白貓的圖片,如下:圖片

當輸入為文本查詢時,如"黑白相間的貓長什麼樣?" ,則會將相關檢索結果(文本、圖片)傳給大模型,最後輸出圖文回答,如相關文本 + 一張黑白貓的圖片。

文本生成依賴自迴歸 Transformer 模型計算概率:

圖片

其中,x是輸入的檢索內容,yt是當前生成的詞,y<t是前面已經生成的詞。假設模型可能按步驟生成了P("A")=0.8;P("black")=0.9;P("and")=0.85;P("white")=0.95,最終的輸出則為 "A black and white cat"。

三階段示例

接下來以「旅行問答」場景為例,介紹多模態RAG三個階段的結果輸出。

1. 編碼階段

輸入:

用户查詢(文本+圖)
"這張照片裏的建築是什麼風格?" + [拜占庭風格教堂照片]
知識庫內容:
文本1:《拜占庭建築特點》文檔(含穹頂、馬賽克等關鍵詞)
圖片2:哥特式教堂照片
圖片3:威尼斯聖馬可大教堂照片
...

【query圖片】
圖片

【圖片2】
8bbfab62-1fd4-46d1-80f8-eeb5bcb253cb.png

【圖片3】
f2581b37-e356-4a03-972a-b77f64f39666.png

編碼結果示意:

# 多模態編碼 (如CLIP混合編碼器實現)
query_text_embed = [0.23, -0.57, ..., 0.89]  # query的embedding,均為512維
doc1_text_embed = [0.20, -0.52, ..., 0.91]   # 文本1的embedding, 與 query_text_embed 相似

query_img_embed = [0.67, 0.12, ..., -0.33]  # query中圖片的embedding
img2_embed = [0.02, 0.45, ..., 0.11]        # 圖片2的embedding, 與 query_img_embed 差異較大
img3_embed = [0.63, 0.09, ..., -0.30]       # 圖片3的embedding, 與 query_img_embed 相似

# 多模態融合表示(以加權平均為例)
query_fused = [0.45, -0.22, ..., 0.28]      # 文本0.4 + 圖像0.6權重

2. 檢索階段

向量數據庫操作:

  • 分別計算 query_fused 與所有知識庫向量的餘弦相似度
  • 返回Top3結果:

檢索結果JSON表示:

{
  "retrieved_results": [
    {
      "image_path": "聖馬可大教堂.jpg",
      "score": 0.93,
      "modality": "multimodal"
    },
    {
      "content": "拜占庭建築特點包括...",
      "score": 0.82,
      "modality": "text" 
    }
  ]
}

3. 生成階段

多模態LLM輸入:

[USER_QUERY] 
  文本: "這張照片裏的建築是什麼風格?"  
  圖像: <拜占庭教堂照片>

[CONTEXT]
  1. [圖片] <聖馬可大教堂照片>
  2. [文本] 拜占庭建築特點: "圓形穹頂、金色馬賽克裝飾..."

[OUTPUT]

生成結果:

您照片中的建築具有典型的拜占庭風格特徵:

  1. 穹頂結構(如聖馬可大教堂的中央穹頂)
  2. 馬賽克裝飾(可見照片中金色反光部分)
  3. ...

基於 PDF 文檔的多模態 RAG

以PDF文檔為例,演示多模態RAG的整體實現流程。為了對PDF文檔進行完整的嵌入,首先通過佈局識別模型對文檔段落、標題以及圖標等其他元素進行識別和提取。下圖展示了基於OCR文檔解析的圖文RAG系統流程,接下來我們將對各個步驟進行簡要介紹,包括文檔解析、多模態嵌入以及查詢與生成三個關鍵步驟。

圖片

一、文檔解析

PDF 格式概述與解析方法

1.PDF的格式簡介

PDF(Portable Document Format,便攜式文檔格式)是一種獨立於應用程序、硬件和操作系統的文件格式,主要用於共享和查看文檔。PDF 文檔的主要特點包括:

  • 具有固定的佈局和格式,在不同設備和操作系統上保持一致。
  • 可包含文本、圖像、鏈接、按鈕、表單字段、音頻、視頻及業務邏輯等內容。
  • 適用於文檔存儲、交換和打印,廣泛應用於辦公和學術領域。

2.PDF 的主要類型

根據來源不同,PDF 可分為以下兩類。

① 機器生成的 PDF

  • 由專業軟件(如 Adobe Acrobat、Microsoft Word、Typora 等)創建。
  • 內部包含可選中、可搜索、可編輯的文本、圖像和超鏈接。
  • 適用於直接解析和結構化處理。

② 掃描生成的 PDF

  • 由掃描設備或拍攝圖片轉換而成,通常存儲為位圖格式。
  • 其內容不可直接搜索和編輯,僅包含圖像。
  • 需要 OCR(光學字符識別)技術進行文本提取和解析。

3.PDF 的解析方法

針對不同類型的 PDF,解析方法有所區別:

① 機器生成的 PDF

  • 可直接使用 Python 庫進行解析,如 pdfminer、pdfplumber 等。
  • 這些工具能夠提取文本、圖像、表格等結構化信息。

② 掃描生成的 PDF

  • 需要 OCR 技術將圖像轉換為文本,常用方法包括深度學習模型(如 Tesseract OCR、LayoutLM)或雲端 OCR 服務。
  • 深度學習方法通常在複雜版式和多語言場景下具有更優的解析效果。

通過選擇合適的解析方法,可以高效地從 PDF 文檔中提取有價值的信息,為文檔理解與處理提供支持。

PDF 文檔解析與結構化處理

PDF 解析的目標是從不可編輯的文檔中提取文本並轉換為標準編碼格式存儲,同時保留原始結構信息。由於排版複雜,直接提取文本可能導致結構信息丟失,如標題、段落、表格等,而這些信息對於語義理解和邏輯推理至關重要。因此,PDF 解析通常被視為廣義 OCR 任務,包含文本識別(OCR)和佈局分析兩個步驟。

  • OCR 提取文本:OCR(光學字符識別)技術用於將紙質文檔或掃描圖片中的文字轉換為可編輯、可搜索的電子文本。例如,PaddleOCR 和 EasyOCR 等開源工具能夠高效識別 PDF 中不可編輯的文本,並將其存儲為純文本(TXT)格式。
  • 佈局分析:佈局分析的目標是恢復 PDF 的原始文本組織結構,識別各文本塊之間的關係,並按照文檔原有格式組織文本。例如,LayoutLM 模型能夠聯合建模文檔中的文本、佈局和圖像信息,準確識別文本在頁面中的位置及其排版結構。此外,對於包含表格、公式等複雜內容的 PDF,可結合專門的表格分析模型進行解析,以保留文檔的完整信息。

在實際應用中,magic-pdf 是一個強大的 PDF 解析工具,它封裝了文本提取、佈局恢復、表格和公式分析等功能,並提供了便捷的 Python 接口。通過使用 magic-pdf,可以顯著簡化 PDF 解析流程,提高多模態信息處理的效率和準確性,為後續的文檔理解、檢索和生成任務提供更豐富的支持。

二、多模態嵌入

在完成文檔解析提取文檔中的文檔和圖表之後,我們需要對文檔進行嵌入。

在拿到解析完成的文檔時(即提取的文本和圖像集合),最樸素的想法是對文本和圖像分別進行向量嵌入得到向量表示。這種方法雖然簡單,但它有一個顯著的缺點:無法捕捉不同模態(如文本與圖像)之間的內在關聯。具體來説,文本和圖像分別被映射到兩個獨立的向量空間,這樣它們之間就缺乏直接的語義聯繫。

如果想要實現RAG就需要對文本和圖像分別進行檢索,並在檢索後進行某種形式的重排序才能找出最相關的內容。這種方法雖然實現起來比較簡單,但從系統性能以及表現來看,在查詢階段,當系統需要從多個模態中提取最相關的信息並進行重排序時,涉及到的模態數量越多,檢索和排序的任務就越複雜。

為了降低在線階段的複雜度,我們可以在文檔的離線嵌入階段,將來自不同模態的信息直接映射到一個共享的向量空間中。這樣,在檢索和生成的在線階段,系統只需要在一個統一的向量空間內進行操作,從而避免了多個模態之間的單獨檢索和後續的重排序過程,大大提升了系統的效率和響應速度。

通過這種方式,不僅能夠有效地降低在線推理的複雜度,而且還能夠使文本和圖像之間的關係更加緊密,進而提升多模態任務的性能。

下圖提供了兩種統一向量空間的方法,一種是直接將多個模態的數據映射到同一個向量空間(左側),另一個是先進行模態統一,再進行向量嵌入(右側)。

圖片

左側為利用多模態模型進行映射方法,右側為統一數據模態後進行向量嵌入方法。

(1)多模態直接嵌入統一空間

當我們只涉及文本與圖像的嵌入問題時(我們可以把表格看作是圖像,或者在解析階段將表格解析為格式化文本),可以通過特定的模型(例如 CLIP、VisualBERT 等)映射到同一個向量空間。這種方法能夠使得不同模態之間的語義關聯更加緊密,並且使得檢索時不需要分開處理各個模態。通過共享的向量空間,文本和圖像可以在相同的語義空間中進行比較和排序,從而提高多模態檢索和生成的效率和準確性。

(2)模態統一後再嵌入

這種方法通常會首先通過某些轉換模型(如文本描述生成模型)將圖像等非文本模態轉化為文本形式。例如圖像可以通過視覺模型生成與之相關的文本描述,表格可以通過表格分析模型轉化為結構化的文本信息。在完成模態統一後,這些文本數據可以通過文本嵌入模型(如 BERT、T5、GPT 等)進行進一步的嵌入。

這種方式的好處是可以利用現有成熟的文本嵌入技術來處理不同模態的信息,但缺點是圖像、視頻等模態的原始信息可能在轉化為文本過程中丟失了一部分重要細節,且生成的文本可能無法完全保留原模態的豐富語義。


這兩種方法各有優缺點,選擇哪種方式取決於具體的應用需求和模型設計的目標。如果目標是最大限度地保留各模態的原始信息並且提升多模態數據間的關聯性,第一種方法可能更為適合。反之,如果項目中涉及到大量的非文本模態,且可接受通過文本的轉換來進行表徵,那麼第二種方法也可以是一種有效的解決方案。

不管使用哪種方法,都只涉及了RAG的離線流程,您只需要在文本RAG系統中更改文檔入庫相關的流程,即可得到一個最基礎的多模態RAG。通常來説如果對圖表生成了詳盡準確的描述,或使用了性能較好的嵌入模型,會對文檔內容有較好的補充作用,有助於在響應用户問題時通過圖表內容給出更加詳細的解答。

利用多模態模型解析圖片:自動提取信息並生成QA對

除了上文中提到的兩種圖片解析方法,在解析圖片時,我們還可以使用多模態模型如: InternVL-Chat-V1-5 來自動提取圖片中的關鍵信息,並生成相應的問答(QA)對。這種方法的核心思路是:首先,多模態模型結合視覺與文本理解,分析圖片內容,包括物體、文字、場景、結構等;然後,基於提取的信息,生成相關問題及答案,幫助用户快速理解圖片的核心內容。例如,在解析一張論文中的示意圖或實驗結果圖時,模型可以識別出圖片的標題、數據趨勢、關鍵結論等信息,並自動生成「該實驗的主要結論是什麼?」等問題及對應答案,從而提升論文內容的理解和信息獲取的效率。

三、生成圖文並茂的響應

如果在處理文檔中的圖表時,系統僅僅輸出與圖表相關的描述而無法展示圖表本身,這可能會讓用户感到信息呈現不夠直觀和生動。而如果能夠在生成的回答中同時展示圖表和相關描述,效果無疑會更加吸引人和具有價值。目前輸出圖文並茂的內容對大語言模型來説仍然是一個具有挑戰性的任務,但大多數模型已經能夠生成準確的 Markdown 格式文檔。

Markdown 是一種輕量級的標記語言,它不僅支持文本的格式化,也允許嵌入圖片和其他多媒體元素。因此,在系統生成的 Markdown 文檔中,我們可以通過圖像鏈接的方式將圖表或圖片展示出來。您可以在 RAG 系統的文檔處理流程中,添加以下三個操作得到圖文並茂的輸出:

  • 格式化保存圖表url:文檔解析時,系統需要識別並提取其中的圖表和圖像內容。對於每一個圖像,您可以通過文檔中的圖表描述或圖像理解模型生成描述性文本,將其轉化為圖像的描述節點。同時,您需要將這些圖像鏈接(例如存儲在某個圖像託管服務上的url)與圖像描述一併保存為markdown語法![alt text](image_url);
  • 節點分類:在檢索階段,檢索組件返回相似節點後,需要根據節點的類型進行分類,如果召回的節點包含圖像節點需要為後續生成階段進行相關提示詞處理;
  • 大模型提示詞修改:您可能需要為RAG生成答案的大模型提供提示詞,例如:如果答案需要展示圖像,請給出圖像相關鏈接和解釋。

10158117-919b-401d-bc25-95ecd57de280.png

通過上述方式,您可以讓 RAG 系統在生成答案時通過圖像和圖表增強答案的表現力和可理解性。這是一種簡單的將原圖作為答案中一部分的輸出方法,實際上您也可以通過調度多個模型實現圖表生成的功能,您可以關注下期Agent教學中的相關部分進行相關學習。

多模態內容向量化效果優化技巧

在多模態 RAG 系統中,向量化是實現跨模態語義對齊和相似度檢索的基礎。然而,在實際應用中,圖像、表格等非文本模態的信息在編碼過程中常會出現“語義缺失”或“語義漂移”等問題,導致向量表達與原始內容理解不一致,影響最終檢索效果。

為提高多模態向量化的準確性與可用性,可以從以下幾個方面入手優化:

一、文本補全:結合圖像標題與註解等文本信息

圖像或圖表在知識庫中通常配有標題(title)、圖注(caption)或周邊説明文本。這些文本往往高度濃縮了圖像的語義信息,是圖像內容的最佳語義補充來源。

優化策略

  • 將生成的圖片描述與圖片註解等拼接後再做統一編碼;
  • 將圖像本身與其標題、圖注等文本拼接後作為聯合輸入,通過聯合編碼模型(如 CLIP)進行向量生成;

這種方式能夠顯著提升圖像表示在跨模態檢索任務中的表達能力和語義準確性。

示例及效果

  • 場景:一張知識庫中的科研論文插圖。
  • 圖像內容:一張展示“Transformer 架構”的示意圖。

0ba1f316-ec97-4a8b-ab52-100e9832fa15.png

二、結構化生成:預先從多模態數據中提取 QA 對

圖像和表格等多模態信息往往承載複雜關係或關鍵事實信息,單純依賴嵌入式編碼容易遺漏語義細節。通過結構化問答生成的方式提取隱含信息,是提升檢索有效性的又一有效手段。

優化策略

  • 使用 OCR、圖像理解模型或表格抽取模型對圖片/表格進行解析;
  • 結合 LLM 從解析結果中自動生成“問題-答案對(QA對)”或“摘要性文本”;
  • 將這些結構化 QA 對作為知識增強材料與原始圖像聯合編碼,或將這些 QA 對加入向量數據庫。

這種策略尤其適合用於圖表數據、統計報表或醫療影像等對細節和結構化信息敏感的場景。

示例

  • 場景:企業內部運營系統中一張月度 KPI 報告截圖,圖表為 PDF 或圖片格式,無法直接查詢。
  • 圖表內容:柱狀圖顯示2024年1月到3月的銷售額與客户增長數,數據如下:

6b887f6d-50da-4126-800c-b6f423a86c0e.png

效果

  • 優化前:直接編碼僅會得到“圖表”、“數值”等粗糙標籤。
  • 優化後:如 KPI 圖表,通過自動生成 Q&A(“哪個月銷售最高?”)能顯著增強對圖像數據的查詢和理解能力。

三、上下文增強:將上下文一同編碼

很多圖像的信息需要上下文語境進行理解,單獨編碼圖像容易喪失語境關聯性。通過上下文增強策略,可以實現圖像與其出現位置的文本、段落的語義聯動。

優化策略

  • 在輸入圖像編碼模型前,將其相關上下文文本一併拼接或融合輸入,構建“圖+文上下文窗口”;
  • 使用多模態混合編碼模型或統一模態後對其進行聯合編碼;

該策略適用於圖像與正文高度耦合的任務場景(如新聞、教材、網頁百科等),能夠幫助模型更好地把握圖像語義在上下文中的真實意圖。

示例及效果

  • 場景:某醫院的電子病歷系統中,包含胸部X光圖像,以及報告正文文本。
  • 圖像內容:胸部X光圖

圖片

四、微調多模態模型:提升模型在特定多模態領域內的適應能力

示例

  • 場景:醫學圖像領域,基於多模態模型實現簡單的診斷。甚至就不需要額外上下文信息。

圖片

圖文問答:“大腦的區域是否梗塞?”。
❌ 普通通用模型:無法做出診斷。
✅ 微調後的模型:是的。大腦的區域存在梗塞。

數據簡介

2a646e52-b2aa-4a8e-8cf6-b5804615e8ce.png

VQA-RAD 是一個關於放射影像的問題-答案對數據集。

  • 數據集用途

訓練和測試醫學影像VQA(視覺問答)系統
支持開放式問題(如“病灶位置?”)和二元問題(如“是否存在腫瘤?”)

  • 數據來源

基於MedPix(開放醫學影像數據庫)
由臨牀醫生手動標註,確保專業性

  • 核心優勢

首個專注放射影像的VQA數據集
結構清晰,覆蓋臨牀常見問題類型

圖片

數據處理

  • 數據獲取
from datasets import load_dataset
dataset = load_dataset("flaviagiammarino/vqa-rad")
  • 處理前
{
    "image": <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=566x555>,
    "question": 'are regions of the brain infarcted?',
    "answer": 'yes'
}
  • 處理後(OpenAI格式)
[
  {
    "messages": [
      {
        "content": "<image>are regions of the brain infarcted?",
        "role": "user"
      },
      {
        "content": "yes",
        "role": "assistant"
      }
    ],
    "images": [
      path/to/train_image_0.jpg"
    ]
  },
  • 微調模型
import lazyllm
model_path = 'path/to/Qwen2.5-VL-3B-Instruct'
data_path = 'path/to/vqa_rad_processed/train.json'    # 需要將環境中的transformers和llamafactory升級到最新的開發分支
m = lazyllm.TrainableModule(model_path)
    .mode('finetune')
    .trainset(data_path)
    .finetune_method(
        (lazyllm.finetune.llamafactory,{
            'learning_rate': 1e-4,
            'cutoff_len': 5120,
            'max_samples': 20000,
            'val_size': 0.01,
            'num_train_epochs': 2.0,
            'per_device_train_batch_size': 16,
        }))
m.update()
  • 模型配置

model_path指定了我們要微調的模型,這裏我們用Qwen2.5-VL-3B-Instruct,直接指定其所在路徑即可;

  • 微調配置

  • .mode設置了啓動微調模式finetune
  • .trainset 設置了訓練用的數據集路徑;
  • .finetune_method 設置了用哪個微調框架及其參數,這裏使用的是 llamafactory 框架(一個支持 LoRA、QLoRA 等高效微調技術的庫)
  • learning_rate:1e-4學習率,表示模型每一步更新參數的幅度。較高值訓練更快但可能不穩定。
  • cutoff_len: 5120輸入序列的最大長度,超過這個長度的文本會被截斷。適用於長對話或長描述任務。
  • max_samples: 20000用於訓練的最大樣本數。如果你不想訓練整個數據集,可以限制在一定數量。
  • val_size: 0.01驗證集佔比。這裏是 1%,意味着 99% 的數據用於訓練,1% 用於評估模型訓練過程中的性能。
  • num_train_epochs: 2.0訓練輪數。每個 epoch 表示模型看完整個訓練集一次。
  • per_device_train_batch_size: 16每個設備(通常是 GPU)上的訓練批大小。根據顯存大小選擇合適的batch size。

  • 啓動任務

.update 觸發任務的開始:模型先進行微調,微調完成後模型會部署起來,部署好後會自動使用評測集全部都過一遍推理以獲得結果;

  • 微調loss曲線

2bcedeb0-8f81-429b-937c-4fc4a32b21c0.png

  • 模型評測

在共451題的測試集中,模型Qwen2.5-VL-3B-Instruct微調前後的精確匹配率和語義相似度如下所示:

2a3ecc5b-327b-4729-b70d-a8a385e2cde6.png

  • 示例

針對如下影像,微調前後的輸出

578c64eb-5ed4-495d-a802-f1640ce1e41c.png

  • 微調前:
{
        "query": "is the liver visible in the image?",
        "true": "no",
        "infer": "yes, the liver is visible in the image. it appears as a large, dark gray structure located in the upper left quadrant of the abdomen.",
        "exact_score": 0,
        "cosine_score": 0.3227266048281184
}
  • 微調後:
{
        "query": "is the liver visible in the image?",
        "true": "no",
        "infer": "no",
        "exact_score": 1,
        "cosine_score": 1.0
}

拓展:ColPali 中的多模態 RAG

前文介紹了對文檔進行解析後對圖像和文本進行分別處理的方法,那我們是否可以不對其進行解析和提取,直接將文檔看作一個整體進行處理呢?目前有相關論文證實了這一想法的可能性。

我們已經瞭解到多模態大模型(只討論圖像和文本兩個模態)可以從圖像和文本中提取信息並進行處理,如果我們將一頁文檔看作一張圖像,就可以利用多模態大模型進行嵌入從而省去了文檔解析的流程。然而,利用視覺多模態大模型對其進行嵌入和檢索的相關方法有DSE、ColPali,M3DocRAG等,下文以ColPali為例,講解與基於文檔解析的方法之間的不同之處(圖源ColPali論文)。

269a7aaa-e23e-45ba-b235-09482b380946.png

ColPali(Contextualized Late Interaction over PaliGemma)使用PaliGemma(一個強大的多模態預訓練模型)作為多模態編碼器,對文檔進行嵌入。具體來説將某一頁文檔看成n個圖像塊,每個塊都對應一個向量,由此一來一頁圖片就可以用這n個向量來表示。

在計算相似度時,ColPali不同於往常通過一個向量表示一個句子或一個段落的方式,而是利用嵌入列表,採用 "MaxSim "操作來計算兩個文本之間的相似度。MaxSim 計算查詢中的每個詞與文檔中一個頁面對應的所有塊之間的最大相似度,累加每個詞與塊的最大相似度得到該頁面與查詢的總相似度分數。對所有頁面計算查詢的總相似度分數,然後對頁面按照總相似度分數降序排列,選擇總相似度最高的頁面作為與查詢最匹配的頁面。

具體公式如下,其中S為查詢q和文檔d之間的最終相似度得分,Eq表示查詢q的嵌入,Ed表示圖像塊的嵌入:

圖片

ColPali有着相當出色的表現,並且展示了在多模態檢索和生成方面的巨大潛力,但在實際應用中仍然面臨一些挑戰。例如當處理大量 PDF 文檔時,其相似度計算的時間複雜度呈現出顯著的增長,這在實際項目中可能導致性能瓶頸。此外,即使在多模態信息處理上具有創新性,但在文本檢索任務中的效果仍然有進一步提升的空間,目前來看ColPali更適用於檢索圖表豐富的文檔。

ColPali 為多模態 RAG系統提供了一種全新的範式,在當前多模態大模型迅速發展的背景下,必然會涌現出更多功能更強大、效率更高的多模態解決方案,帶來更加精準和高效的多模態信息處理方法,推動多模態 RAG 系統的發展,展現出更強的優勢和實用性。

參考文獻

MLLM:https://arxiv.org/pdf/2306.13549

layoutlmv3:https://arxiv.org/abs/2204.08387

VisRAG:https://arxiv.org/pdf/2410.10594

ColPali:https://arxiv.org/pdf/2407.01449

三階段示例:https://www.eyelevel.ai/post/multimodal-rag-explained

更多技術內容,請移步“LazyLLM”gzh!

user avatar zhidechaomian_detxs7 头像 chengdumeiyouni 头像 u_16756731 头像 definecloud 头像 openfuyao 头像 k21vin 头像 sovitjs 头像 u_15641375 头像 u_16827017 头像 mianlengxincidehongjiu 头像 puxiaoke6 头像 huidadebianpao 头像
点赞 48 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.