当前位置: 首页 > news >正文

打造高效多模态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.xdnf.cn/news/890281.html

相关文章:

  • Cad 反应器 cad c#二次开发
  • 【复杂指令遵循 Benchmark】论文分享:CodeIF-Bench
  • 软件开发中的“需求镀金”现象如何避免?
  • 大屏缩放视频比例适配记录
  • Canvas的使用
  • 计算机网络安全问答数据集(1788条) ,AI智能体知识库收集! AI大模型训练数据!
  • AI04A AI模块,16通道,TC / mV
  • Python中的self参数介绍
  • [GESP202412 五级] 奇妙数字 题解
  • 核心机制:延时应答,捎带应答,面向字节流
  • Shopify 主题开发:移动端菜单响应式设计要点
  • jdbc查询mysql数据库时,出现id顺序错误的情况
  • Android基础回顾】六:安卓显示机制Surface 、 SurfaceFlinger、Choreographer
  • 机器学习——XGBoost
  • 【Emgu CV教程】11.2、Canny边缘检测
  • 【计组】真题 2015 大题
  • ModuleNotFoundError No module named ‘torch_geometric‘未找到
  • windows VeraCrypt – 磁盘加密工具
  • Python实例题:Python计算二元二次方程组
  • Life:Internship finding
  • RMSE可以融合均值与标准差
  • 核货宝订货平台源码:构建高效智能订货系统,驱动企业数字化转型
  • Nature Methods | OmiCLIP:整合组织病理学与空间转录组学的AI模型
  • win32相关(远程线程和远程线程注入)
  • React 第五十四节 Router中useRevalidator的使用详解及案例分析
  • Next打包导出静态文件(纯前端),不要服务器端(node), 隐藏左下角调试模式
  • Conda 基本使用命令大全
  • 数据库优化实战分享技术文章大纲
  • Qt 开发中的父类与父对象的区别和父对象传递:如何选择 `QWidget` 或 `QObject`?
  • Palo Alto Networks Expedition存在命令注入漏洞(CVE-2025-0107)