引言
隨著信息檢索與生成式AI的深度融合,檢索增強生成(RAG, Retrieval-Augmented Generation) 已成為AI領域的重要技術方向。傳統RAG系統主要依賴文本數據,但真實世界中的信息往往包含圖像、表格等多模態內容。多模態RAG(Multimodal RAG)通過結合文本與視覺信息,顯著提升了系統的理解能力與應用場景。然而,如何科學、全面地評測多模態RAG系統的性能,是測試工程師必須掌握的核心技能。
本文將結合 EvalScope 多模態RAG評測實踐,系統介紹多模態RAG的原理、評測流程、關鍵指標及代碼實現,幫助測試工程師快速上手并深入理解評測要點。
一、RAG與多模態RAG簡介
1.1 傳統RAG的局限性
傳統RAG系統通過以下流程工作:
- 檢索:從大規模文本數據庫中查找與用戶問題相關的片段。
- 生成:將檢索到的文本輸入大語言模型(LLM),生成最終答案。
然而,傳統RAG的局限性在于:
- 忽略非文本信息:無法處理圖像、表格等非結構化數據。
- 上下文理解受限:僅依賴文本可能導致信息缺失或歧義。
1.2 多模態RAG的優勢
多模態RAG通過以下改進,解決了傳統RAG的不足:
- 多模態檢索:支持文本、圖片、表格的聯合檢索。
- 多模態生成:利用多模態LLM(如Qwen-VL、GPT-4o)結合文本與視覺信息生成答案。
- 更貼近真實場景:適用于醫療影像診斷、工業質檢、農業識別等需結合圖像的場景。
二、多模態RAG的評測流程
多模態RAG的評測分為四個核心步驟,每個步驟均需嚴格驗證:
2.1 文檔解析
目標:將PDF、掃描文檔等非結構化數據轉換為可檢索的多模態元素(文本、圖片、表格)。
關鍵技術:
- 工具:
unstructured
、MinerU
等庫用于解析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 評測結果示例
假設評測后得到如下結果:
問題 | 忠實度 | 相關性 | 正確性 |
---|---|---|---|
玉米是什么? | 1 | 1 | 0.69 |
汽車是什么? | 0 | 0 | 0.59 |
5.2 結果分析與優化
-
高分案例(玉米):
- 成功原因:檢索到的圖片與問題高度相關,模型能結合圖片描述玉米特征。
- 優化方向:無需調整,保持當前策略。
-
低分案例(汽車):
- 失敗原因:檢索庫中無汽車相關圖片,模型依賴文本生成答案,但文本未提供足夠信息。
- 優化方向:
- 擴展檢索庫:添加更多類別(如交通工具)的圖片。
- 增強提示詞:在生成時提示模型優先使用文本信息。
- 調整檢索策略:若無圖像匹配,優先返回文本上下文。
六、總結
多模態RAG系統的評測是確保其有效性和可靠性的重要環節。通過EvalScope等框架,測試工程師可以全面評估系統的忠實度、相關性和正確性,并針對性優化。本文提供了從文檔解析、向量存儲到生成評測的完整實踐流程,結合代碼示例與評測結果分析,幫助工程師快速構建高效的多模態RAG系統。
參考鏈接
- EvalScope官方文檔與多模態RAG評測實踐
- ModelScope 多模態模型與數據集
- CLIP: Connecting Text and Images
- RAGAS: RAG Evaluation Framework
通過本文的實踐指南,測試工程師不僅能掌握多模態RAG的評測方法,還能深入理解其技術細節,為實際項目落地提供堅實基礎。整理了部分資料,已上傳云盤。云盤鏈接:https://pan.quark.cn/s/c196744b0181
后續也會持續收集上傳。