打造高效多模態RAG系統:原理與評測方法詳解

引言

隨著信息檢索與生成式AI的深度融合,檢索增強生成(RAG, Retrieval-Augmented Generation) 已成為AI領域的重要技術方向。傳統RAG系統主要依賴文本數據,但真實世界中的信息往往包含圖像、表格等多模態內容。多模態RAG(Multimodal RAG)通過結合文本與視覺信息,顯著提升了系統的理解能力與應用場景。然而,如何科學、全面地評測多模態RAG系統的性能,是測試工程師必須掌握的核心技能。

本文將結合 EvalScope 多模態RAG評測實踐,系統介紹多模態RAG的原理、評測流程、關鍵指標及代碼實現,幫助測試工程師快速上手并深入理解評測要點。


一、RAG與多模態RAG簡介

1.1 傳統RAG的局限性

傳統RAG系統通過以下流程工作:

  1. 檢索:從大規模文本數據庫中查找與用戶問題相關的片段。
  2. 生成:將檢索到的文本輸入大語言模型(LLM),生成最終答案。

然而,傳統RAG的局限性在于:

  • 忽略非文本信息:無法處理圖像、表格等非結構化數據。
  • 上下文理解受限:僅依賴文本可能導致信息缺失或歧義。

1.2 多模態RAG的優勢

多模態RAG通過以下改進,解決了傳統RAG的不足:

  1. 多模態檢索:支持文本、圖片、表格的聯合檢索。
  2. 多模態生成:利用多模態LLM(如Qwen-VL、GPT-4o)結合文本與視覺信息生成答案。
  3. 更貼近真實場景:適用于醫療影像診斷、工業質檢、農業識別等需結合圖像的場景。

二、多模態RAG的評測流程

多模態RAG的評測分為四個核心步驟,每個步驟均需嚴格驗證:

2.1 文檔解析

目標:將PDF、掃描文檔等非結構化數據轉換為可檢索的多模態元素(文本、圖片、表格)。

關鍵技術

  • 工具unstructuredMinerU 等庫用于解析PDF。
  • 實現細節
    • 圖像提取:從PDF中提取高清圖片,存儲為獨立文件。
    • 文本與表格提取:分割文本段落和表格,保留結構信息。
    • 示例代碼
      from unstructured.partition.pdf import partition_pdf
      def extract_pdf_elements(file_path, output_image_path):elements = partition_pdf(filename=file_path,strategy="hi_res",  # 高分辨率解析extract_images_in_pdf=True,extract_image_block_output_dir=output_image_path  # 圖片保存路徑)return elements
      

2.2 多模態向量存儲

目標:將文本與圖像統一編碼為向量,存入向量數據庫,便于后續檢索。

關鍵技術

  • 嵌入模型:使用多模態模型(如CLIP、Chinese-CLIP)計算文本與圖像的聯合向量。
  • 向量數據庫:Chroma、FAISS 等支持高效相似性搜索。
  • 實現細節
    • 統一編碼:通過CLIP模型將文本和圖像映射到同一向量空間。
    • 向量存儲:將向量與元數據(如圖片URI)存入數據庫。
    • 示例代碼
      from langchain_chroma import Chroma
      from evalscope.backend.rag_eval import VisionModel# 加載CLIP模型
      vectorstore = Chroma(collection_name="mm_rag_clip",embedding_function=VisionModel.load(model_name="AI-ModelScope/chinese-clip-vit-large-patch14-336px")
      )# 添加圖片到向量庫
      image_uris = [os.path.join(image_path, img) for img in os.listdir(image_path) if img.endswith(".jpg")]
      vectorstore.add_images(uris=image_uris)
      

2.3 檢索增強生成

目標:根據用戶問題檢索相關多模態內容,并生成答案。

關鍵技術

  • 相似性搜索:通過向量數據庫找到最相關的文本和圖像。
  • 多模態生成:將檢索到的內容輸入多模態LLM生成答案。
  • 實現細節
    • 檢索策略:使用similarity_search查找Top-K相關結果。
    • 生成策略:將檢索到的文本和圖像作為上下文輸入LLM。
    • 示例代碼
      class RAGPipeline:def __init__(self, retriever, model):self.retriever = retrieverself.model = modeldef invoke(self, question):# 檢索相關上下文context = self.retriever.invoke(question)# 生成答案response = self.model.generate(context=context, question=question)return response
      

2.4 評測模型生成結果

目標:利用評測框架(如EvalScope)評估生成結果的準確性、相關性與一致性。

關鍵技術

  • 評測指標:多模態忠實度、相關性、正確性等。
  • 評測工具:EvalScope、RAGAS 等框架。
  • 實現細節
    • 數據準備:生成包含用戶輸入、檢索上下文、模型輸出的評測集。
    • 評測執行:調用評測框架自動計算指標。
    • 示例代碼
      from evalscope.run import run_taskmulti_modal_task_cfg = {"eval_backend": "RAGEval","eval_config": {"tool": "RAGAS","eval": {"testset_file": "./pdf/output.json","critic_llm": {"model_name": "qwen-vl-max","api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1","api_key": os.getenv("DASHSCOPE_API_KEY"),},"metrics": ["MultiModalFaithfulness","MultiModalRelevance","AnswerCorrectness"],"language": "chinese"},},
      }run_task(task_cfg=multi_modal_task_cfg)
      

三、關鍵評測指標詳解

多模態RAG的評測分為獨立評測(僅評估檢索模塊)和端到端評測(評估檢索+生成全流程)。以下是核心指標的詳細說明:

3.1 忠實度(Faithfulness)

定義:答案是否嚴格基于檢索到的上下文(文本或圖像)。

評分規則

  • 若答案中的所有陳述均可從上下文中推斷,則得分為1。
  • 否則,得分按不一致部分比例遞減。

示例

  • 高忠實度
    用戶問題:“特斯拉Model X怎么樣?”
    檢索上下文:一張特斯拉Model X的圖片
    答案:“特斯拉Model X是一款由特斯拉制造的電動SUV。”
    得分:1
  • 低忠實度
    用戶問題:“特斯拉Model X怎么樣?”
    檢索上下文:一張特斯拉Model X的圖片
    答案:“貓很可愛。”
    得分:0

3.2 相關性(Relevance)

定義:答案是否與用戶問題及檢索到的上下文直接相關。

評分規則

  • 若答案直接回答問題且引用上下文信息,則得分為1。
  • 若答案描述上下文但未回答問題,或與問題無關,則得分遞減。

示例

  • 高相關性
    用戶問題:“這幅畫是誰畫的?”
    檢索上下文:一幅畢加索的畫
    答案:“這幅畫是畢加索畫的。”
    得分:1
  • 低相關性
    用戶問題:“這幅畫是誰畫的?”
    檢索上下文:一幅畢加索的畫
    答案:“這是一幅美麗的畫。”
    得分:0

3.3 正確性(Answer Correctness)

定義:答案是否與標準答案匹配(通常用于有參考答案的場景)。

評分規則

  • F1 Score:結合TP(正確覆蓋)、FP(錯誤添加)、FN(遺漏)計算。
    F 1 S c o r e = ∣ T P ∣ ∣ T P ∣ + 0.5 × ( ∣ F P ∣ + ∣ F N ∣ ) F1Score = \frac{|TP|}{|TP| + 0.5 \times (|FP| + |FN|)} F1Score=TP+0.5×(FP+FN)TP?

示例

  • 高正確性
    用戶問題:“愛因斯坦什么時候出生?”
    標準答案:“愛因斯坦于1879年在德國出生。”
    生成答案:“愛因斯坦于1879年在德國出生。”
    F1 Score:1
  • 低正確性
    用戶問題:“愛因斯坦什么時候出生?”
    標準答案:“愛因斯坦于1879年在德國出生。”
    生成答案:“愛因斯坦于1879年在西班牙出生。”
    F1 Score:0.5

四、實踐流程與代碼詳解

4.1 環境準備

依賴安裝

# 安裝評測框架
pip install evalscope[rag]# 安裝文檔解析工具
pip install "unstructured[all-docs]"# 安裝OCR與PDF處理工具
apt install poppler-utils tesseract-ocr -y

4.2 文檔解析(提取圖片/文本)

代碼詳解

from unstructured.partition.pdf import partition_pdfdef extract_pdf_elements(file_path, output_image_path):"""解析PDF文件,提取文本、圖片和表格。:param file_path: PDF文件路徑:param output_image_path: 圖片保存路徑"""# 創建圖片存儲目錄os.makedirs(output_image_path, exist_ok=True)# 使用Unstructured解析PDFelements = partition_pdf(filename=file_path,strategy="hi_res",  # 高分辨率解析策略extract_images_in_pdf=True,  # 提取圖片infer_table_structure=False,  # 不推斷表格結構chunking_strategy="by_title",  # 按標題分塊max_characters=1000,  # 每塊最大字符數new_after_n_chars=1000,  # 新塊的字符間隔combine_text_under_n_chars=1000,  # 合并短文本hi_res_model_name="yolox",  # 使用YOLOX模型檢測布局extract_image_block_output_dir=output_image_path  # 圖片保存路徑)return elements

4.3 構建多模態檢索器

代碼詳解

from langchain_chroma import Chroma
from evalscope.backend.rag_eval import VisionModel# 加載CLIP模型
vectorstore = Chroma(collection_name="mm_rag_clip",  # 向量庫名稱embedding_function=VisionModel.load(  # 加載CLIP嵌入模型model_name="AI-ModelScope/chinese-clip-vit-large-patch14-336px")
)# 獲取圖片路徑
image_uris = sorted([os.path.join(image_path, img) for img in os.listdir(image_path) if img.endswith(".jpg")
])# 將圖片添加到向量庫
vectorstore.add_images(uris=image_uris)# 創建檢索器
retriever = vectorstore.as_retriever(search_type="similarity",  # 使用相似性搜索search_kwargs={'k': 2}  # 返回Top-2結果
)

4.4 RAG流程構建

代碼詳解

class RAGPipeline:def __init__(self, retriever, model):self.retriever = retrieverself.model = modeldef split_image_text_types(self, docs):"""將檢索到的文檔分為圖片和文本兩類"""images = []text = []for doc in docs:if isinstance(doc, Image):  # 假設doc為PIL.Image對象images.append(doc)else:text.append(doc)return images, textdef invoke(self, question):# 檢索相關上下文context = self.retriever.invoke(question)# 分離圖片和文本images, text = self.split_image_text_types(context)# 生成答案response = self.model.generate(images=images, text=text, question=question)return response

4.5 生成評測數據

代碼詳解

from evalscope.backend.rag_eval import LLM# 加載多模態LLM
model = LLM.load(model_name="qwen-vl-plus",api_base="https://dashscope.aliyuncs.com/compatible-mode/v1",api_key=os.getenv("DASHSCOPE_API_KEY"),
)# 構建RAG流程
pipeline = RAGPipeline(retriever=retriever, model=model)# 生成評測數據
test_cases = ["玉米", "西蘭花", "洋芋", "水稻", "汽車"]
results = []
for prompt in test_cases:response = pipeline.invoke(f"{prompt}是什么?")results.append({"user_input": f"{prompt}是什么?","retrieved_contexts": [base64_image1, base64_image2],  # 檢索到的圖片"response": response  # 生成的答案})# 保存評測數據
with open("./pdf/output.json", "w") as f:json.dump(results, f, ensure_ascii=False, indent=2)

4.6 執行評測

代碼詳解

multi_modal_task_cfg = {"eval_backend": "RAGEval","eval_config": {"tool": "RAGAS","eval": {"testset_file": "./pdf/output.json",  # 評測數據路徑"critic_llm": {  # 評測使用的LLM"model_name": "qwen-vl-max","api_base": "https://dashscope.aliyuncs.com/compatible-mode/v1","api_key": os.getenv("DASHSCOPE_API_KEY"),},"embeddings": {  # 嵌入模型"model_name_or_path": "AI-ModelScope/bge-large-zh",},"metrics": [  # 評測指標"MultiModalFaithfulness","MultiModalRelevance","AnswerCorrectness"],"language": "chinese"  # 評測語言},},
}# 執行評測
from evalscope.run import run_task
run_task(task_cfg=multi_modal_task_cfg)

五、評測結果解讀與優化建議

5.1 評測結果示例

假設評測后得到如下結果:

問題忠實度相關性正確性
玉米是什么?110.69
汽車是什么?000.59

5.2 結果分析與優化

  1. 高分案例(玉米)

    • 成功原因:檢索到的圖片與問題高度相關,模型能結合圖片描述玉米特征。
    • 優化方向:無需調整,保持當前策略。
  2. 低分案例(汽車)

    • 失敗原因:檢索庫中無汽車相關圖片,模型依賴文本生成答案,但文本未提供足夠信息。
    • 優化方向
      • 擴展檢索庫:添加更多類別(如交通工具)的圖片。
      • 增強提示詞:在生成時提示模型優先使用文本信息。
      • 調整檢索策略:若無圖像匹配,優先返回文本上下文。

六、總結

多模態RAG系統的評測是確保其有效性和可靠性的重要環節。通過EvalScope等框架,測試工程師可以全面評估系統的忠實度相關性正確性,并針對性優化。本文提供了從文檔解析、向量存儲到生成評測的完整實踐流程,結合代碼示例與評測結果分析,幫助工程師快速構建高效的多模態RAG系統。


參考鏈接

  1. EvalScope官方文檔與多模態RAG評測實踐
  2. ModelScope 多模態模型與數據集
  3. CLIP: Connecting Text and Images
  4. RAGAS: RAG Evaluation Framework

通過本文的實踐指南,測試工程師不僅能掌握多模態RAG的評測方法,還能深入理解其技術細節,為實際項目落地提供堅實基礎。整理了部分資料,已上傳云盤。云盤鏈接:https://pan.quark.cn/s/c196744b0181

后續也會持續收集上傳。

在這里插入圖片描述

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

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

相關文章

Unity安卓平臺開發,啟動app并傳參

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 檢查是否有傳…

云計算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】

云計算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】 目錄 云計算 Linux Rocky day05【rpm、yum、history、date、du、zip、ln】1.RPM包的一般安裝位置2.軟件名和軟件包名3.查詢軟件信息4.查詢軟件包5.導入紅帽簽名信息,解決查詢軟件包信息報錯6.利用…

【圖像處理3D】:點云圖是怎么生成的

點云圖是怎么生成的 **一、點云數據的采集方式****1. 激光雷達(LiDAR)****2. 結構光(Structured Light)****3. 雙目視覺(Stereo Vision)****4. 飛行時間相機(ToF Camera)****5. 其他…

javaweb -html -CSS

HTML是一種超文本標記語言 超文本&#xff1a;超過了文本的限制&#xff0c;比普通文本更強大&#xff0c;除了文字信息&#xff0c;還可以定義圖片、音頻、視頻等內容。 標記語言&#xff1a;由標簽"<標簽名>"構成的語言。 CSS:層疊樣式表&#xff0c;用于…

pyinstaller 安裝 ubuntu

安裝命令 pip install pyinstaller 讀取安裝路徑 ? ~ find ~/.local/ -name pyinstaller/home/XXX/.local/bin/pyinstaller 路徑配置 vi ~/.zshrc 添加到文件最后 export PATH"$PATH:/home/XXX/.local/bin/" 查看版本號 ? ~ source ~/.zshrc? ~ pyi…

【前端】掌握HTML/CSS寬高調整:抓住問題根源,掌握黃金法則

一、寬高控制的「黃金法則」 問題根源&#xff1a;為什么設置了寬高沒效果&#xff1f; <!-- 典型失敗案例 --> <style>.problem-box {width: 200px;height: 100px;padding: 20px; /* 實際變成240x140px&#xff01; */border: 5px solid red; /* 最終250x150px&…

LuaJIT2.1 和 Lua5.4.8 性能對比

說明 最近在學習 LuaJIT&#xff0c;想看看把它接入到項目中使用&#xff0c;會提高多大的性能。 今天抽時間&#xff0c;簡單地測試了一下 LuaJIT 2.2 和 Lua5.4.8 的性能。 測試平臺&#xff1a; 系統&#xff1a;Windows 10 WSLCPU&#xff1a;Intel Core? i7-8700 CPU…

Arduino學習-按鍵燈

哎&#xff0c;別笑&#xff0c;總比刷抖音強點吧 1、效果 2、代碼 const int buttonPin2; const int ledPin13;int buttonState0;void setup() {// put your setup code here, to run once:pinMode(buttonPin,INPUT);pinMode(ledPin,OUTPUT); }void loop() {// put your mai…

強化學習魚書(10)——更多深度強化學習的算法

&#xff1a;是否使用環境模型&#xff08;狀態遷移函數P(s’|s,a)和獎 勵函數r(s&#xff0c;a&#xff0c;V)&#xff09;。不使用環境模型的方法叫作無模型&#xff08;model-free&#xff09;的方法&#xff0c;使用環境模型的方法叫作有模型&#xff08;model-based&#…

9.axios底層原理,和promise的對比(2)

&#x1f63a;&#x1f63a;&#x1f63a; 和promise的對比 完全可以直接使用 Promise 來發 HTTP 請求&#xff0c;比如用原生 fetch Promise 就可以實現網絡請求功能&#x1f447; ? 用 Promise fetch 的寫法&#xff08;原生&#xff09; fetch(‘https://api.example.c…

什么是數據孤島?如何實現從數據孤島到數據共享?

目錄 一、數據孤島是什么&#xff1f; &#xff08;一&#xff09;數據孤島的定義 &#xff08;二&#xff09;數據孤島怎么形成的 二、數據孤島帶來的問題 &#xff08;一&#xff09;數據冗余和不一致 &#xff08;二&#xff09;決策效率低下 &#xff08;三&#xf…

MQTT入門實戰寶典:從零起步掌握物聯網核心通信協議

MQTT入門實戰寶典&#xff1a;從零起步掌握物聯網核心通信協議 前言 物聯網時代&#xff0c;萬物互聯已成為現實&#xff0c;而MQTT協議作為這個時代的"數據總線"&#xff0c;正默默支撐著從智能家居到工業物聯的各類應用場景。本文將帶你揭開MQTT的神秘面紗&#…

I2C通信講解

I2C總線發展史 怎么在一條串口線上連接多個設備呢&#xff1f; 由于速度同步線是由主機實時發出的&#xff0c;所以主機可以按需求修改通信速度&#xff0c;這樣在一條線上可以掛接不同速度的器件&#xff0c;單片機和性能差的器件通信&#xff0c;就輸出較慢的脈沖信號&#x…

Windows 10 IoT 系統深度定制指南:從環境搭建到工業部署

目錄 一、Windows 10 IoT 架構特性與版本選型 1.1 核心架構設計 1.2 版本對比與選型建議 二、開發環境搭建與硬件適配 2.1 工具鏈配置 2.2 硬件適配關鍵步驟 三、系統定制流程詳解 3.1 鏡像定制&#xff08;IoT Core Dashboard&#xff09; 3.2 使用ICD&#xff08;Im…

k8s開發webhook使用certmanager生成證書

1.創建 Issuer apiVersion: cert-manager.io/v1 kind: Issuer metadata:name: selfsigned-issuernamespace: default spec:selfSigned: {}2.Certificate&#xff08;自動生成 TLS 證書&#xff09; apiVersion: cert-manager.io/v1 kind: Certificate metadata:name: webhook…

MyBatis-Plus深度全解:從入門到企業級實戰

MyBatis-Plus深度全解&#xff1a;從入門到企業級實戰 一、為什么選擇MyBatis-Plus&#xff1f; 1.1 MyBatis的痛點 - 重復CRUD代碼編寫 - 分頁功能實現復雜 - 缺少通用Service層封裝 - 動態表名支持困難 - 多租戶方案需自行實現1.2 MyBatis-Plus核心優勢 無侵入&#xff1a…

【無標題】路徑著色問題的革命性重構:拓撲色動力學模型下的超越與升華

路徑著色問題的革命性重構&#xff1a;拓撲色動力學模型下的超越與升華 一、以色列路徑著色模型的根本局限 mermaid graph TB A[以色列路徑著色模型] --> B[強連通約束] A --> C[僅實邊三角剖分] A --> D[靜態色彩分配] B --> E[無法描述非相鄰關系] C --> F[忽…

01 Deep learning神經網絡的編程基礎 二分類--吳恩達

二分類 1. 核心定義 二分類任務是監督學習中最基礎的問題類型&#xff0c;其目標是將樣本劃分為兩個互斥類別。設樣本特征空間為 X ? R n \mathcal{X} \subseteq \mathbb{R}^n X?Rn&#xff0c;輸出空間為 Y { 0 , 1 } \mathcal{Y} \{0,1\} Y{0,1}&#xff0c;學習目標為…

數據結構:遞歸:泰勒展開式(Taylor Series Expansion)

目錄 第一步&#xff1a;?我們要解決什么&#xff1f; 第二步&#xff1a;將其類比為求自然數和 第三步&#xff1a;什么是每一項&#xff1f; 第四步&#xff1a;定義要計算的每一項&#xff08;term&#xff09; 第五步&#xff1a;定義遞歸函數結構 &#x1f333; 調用…

Hadolint:Dockerfile 語法檢查與最佳實踐驗證的終極工具

在容器化應用開發的浪潮中,Dockerfile 作為構建 Docker 鏡像的核心配置文件,其質量直接影響著應用的安全性、穩定性和可維護性。然而,隨著項目復雜度的增加,手動檢查 Dockerfile 不僅耗時,還容易遺漏潛在問題。今天,我要向大家介紹一款強大的工具——Hadolint,它將徹底改…