03.4 - 多模态 RAG
定位: RAG 的多模态扩展——从纯文本检索到图文/音视频/代码等多类型数据的混合检索生成 面试高频度: ⭐⭐⭐ 考查方式: 多模态 RAG 架构、图文检索方案、数据对齐
一、这是什么?为什么需要它?
是什么
多模态 RAG 是在传统文本 RAG 的基础上,扩展为支持图像、表格、音频、视频等多种数据类型的检索增强生成系统。
传统 RAG:文本 -> 文本检索 -> 文本生成(文本世界)
多模态 RAG:
图像 + 文本 + 表格 + 代码 -> 统一或分路检索 -> 多模态生成为什么需要多模态 RAG?
现实世界的数据是多模态的:
知识库 PDF 中包含大量图表、截图、流程图
产品手册含图片说明
财务数据在表格中
会议记录中含录音
传统文本 RAG 的盲区:
PDF 中的图片 -> 被丢弃
表格数据 -> 被扁平化为文本损失结构
流程图 -> 完全丢失
多模态 RAG 覆盖这些盲区二、原理拆解
2.1 多模态 RAG 的三种架构方案
方案 1:独立多向量存储(推荐)
对每个文档块,生成多个模态的向量,分别存储和检索:
文档块 (含文本和图片)
|
+-- 文本部分 -> Text Embedding -> 文本向量索引
+-- 图片部分 -> Image Embedding -> 图片向量索引
+-- 表格部分 -> Table Embedding -> 表格向量索引
检索时:查询向量化 -> 在所有索引中检索 -> 合并结果
生成时:将不同模态的结果整合到 Prompt 中方案 2:图文统一嵌入
用支持多模态的 Embedding 模型(如 CLIP),把文本和图像映射到同一个向量空间:
文本 "猫" -> [0.1, 0.2, ...]
猫的图片 -> [0.12, 0.18, ...] (在同一空间)
优势:可以直接用文本查询检索图片
局限:文本-图像跨模态检索,精度有限方案 3:LLM 描述后检索
传统方案:先用多模态 LLM 描述非文本内容,再索引描述文本:
图片 -> [GPT-4o 描述] -> "这是一个显示...的流程图" -> 文本检索
优势:不需要专门的多模态 Embedding
局限:描述可能丢失细节,增加 LLM 调用成本2.2 各架构对比
| 方案 | 检索精度 | 实现复杂度 | 成本 | 适用场景 |
|---|---|---|---|---|
| 多向量存储 | 高 | 中 | 中 | 专业多模态系统 |
| 统一嵌入 | 中 | 低 | 低 | 图文混合检索 |
| LLM 描述 | 中高 | 低 | 高 | 快速实现 |
2.3 多模态 RAG 完整流程
+------------------------------------------------------------------+
| 多模态 RAG Pipeline |
| |
| 1. 文档预处理 |
| PDF/网页/文档 |
| +-- 文本提取 -> 分块 -> Text Embedding -> [文本向量库] |
| +-- 图片提取 -> Img Embedding -> [图片向量库] |
| +-- 表格提取 -> Table Embedding -> [表格向量库] |
| +-- 保持原始数据(图片BASE64/表格HTML)用于后续生成 |
| |
| 2. 多路检索 |
| 查询 -> 文本编码 + 图片编码(如果是多模态查询) |
| -> 同时在文本/图片/表格向量库中检索 |
| -> 合并各模态的 Top-K 结果 |
| |
| 3. 结果融合 + 生成 |
| 将检索结果按相关性融合排序 |
| 文本块直接放入 Prompt |
| 图片以 Markdown 格式  嵌入 Prompt |
| 多模态 LLM (GPT-4o / Gemini) 处理多模态输入 |
| |
| 4. 输出 |
| 图文混合回答 |
+------------------------------------------------------------------+三、图解全景
多模态 RAG 的模态覆盖
支持的模态和检索方式:
输入模态 检索方式 生成端
+------------------+ +------------------+ +-------------+
| 文本 | | 文本 -> 文本 | | 多模态 LLM |
| 文章/代码/文档 |------->| 语义搜索 | | |
+------------------+ +------------------+ | GPT-4o |
+------------------+ +------------------+ | Gemini |
| 图片 | | 图片 -> 图片 | | Claude 3.5 |
| 图表/截图/流程图 |------->| CLIP 跨模态搜索 | | (视觉能力) |
+------------------+ +------------------+ | |
+------------------+ +------------------+ +-------------+
| 表格 | | 表格 -> 文本 |
| CSV/Excel/PDF表 |------->| 结构化/语义搜索 |
+------------------+ +------------------+
+------------------+ +------------------+
| 音视频 | | 音视频 -> 文本 |
| 会议/课程/产品 |------->| 转录后文本搜索 |
+------------------+ +------------------+四、实战验证
4.1 多向量存储方案的简化实现
python
# 多模态 RAG 简化实现(使用 LLM 描述图片)
from langchain.schema import Document
from langchain.vectorstores import Chroma
import base64
def describe_image(image_path: str, llm) -> str:
"""用多模态 LLM 描述图片内容"""
with open(image_path, "rb") as img_file:
b64_img = base64.b64encode(img_file.read()).decode()
response = llm.invoke([
{"role": "user", "content": [
{"type": "text", "text": "请详细描述这张图片中的内容和文字"},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64_img}"}}
]}
])
return response.content
# 为每个图片创建描述文档
image_docs = []
for img_path in image_paths:
description = describe_image(img_path, vision_llm)
image_docs.append(Document(
page_content=description,
metadata={"type": "image", "source": img_path}
))
# 文本和图片描述统一索引
all_docs = text_chunks + image_docs
vectorstore = Chroma.from_documents(all_docs, embedding_model)4.2 多模态检索示例
python
# 检索时结合文本和图片信息
query = "产品架构图是怎样的?"
retrieved = vectorstore.similarity_search(query, k=5)
for doc in retrieved:
if doc.metadata.get("type") == "image":
print(f"[图片] {doc.metadata['source']}")
print(f"描述: {doc.page_content[:100]}")
else:
print(f"[文本] {doc.page_content[:100]}")五、面试视角
| 问题 | 答案要点 |
|---|---|
| 多模态 RAG 解决了文本 RAG 的什么局限? | 文本 RAG 无法处理图片/表格/流程图等非文本信息。多模态 RAG 扩展了知识库覆盖范围,让 RAG 系统能理解和检索包含视觉内容的知识 |
| 三种多模态 RAG 方案的优劣? | 1) 多向量存储:精度高但实现复杂;2) 统一嵌入:简单但精度有限;3) LLM描述:快速实现但成本高。推荐生产用多向量存储 |
| 如何将图片检索结果提供给生成模型? | 多模态 LLM (GPT-4o/Gemini) 支持图片输入。将图片以 BASE64 或 URL 形式嵌入 Prompt 中,让模型"看到"图片 |
| 多模态 RAG 的主要挑战? | 1) 存储成本高(图片向量+原始数据);2) 跨模态对齐困难;3) 检索延迟增加;4) 多模态 LLM 成本更高;5) 评估指标不成熟 |
📚 相关链接
- **Embedding模型与向量化** — 文本 Embedding 基础
- **生成模型选择与Prompt设计** — 多模态生成模型选型
- **GraphRAG** — RAG 的另一个扩展方向:图谱增强
- <- 返回 **生成融合索引**