多模态 RAG 检索增强生成
多模态 RAG 将检索增强生成从纯文本扩展到图像、表格、文档等多模态知识源,使 LLM 能够利用视觉信息回答问题,是构建企业级知识问答系统的关键技术。
架构设计
多模态 RAG 系统的核心组件:
- 多模态文档解析:将 PDF/图片/表格等解析为结构化内容
- 多模态嵌入:将文本和图像编码到共享语义空间
- 混合检索:结合向量检索和关键词检索
- 多模态重排序:对检索结果进行相关性重排
- 多模态生成:将检索到的文本和图像输入 VLM 生成回答
python
from langchain.vectorstores import FAISS
from langchain.embeddings import CLIPEmbeddings
class MultimodalRAG:
"""多模态 RAG 系统"""
def __init__(self, clip_model, vlm, vector_store):
self.clip = clip_model
self.vlm = vlm
self.vector_store = vector_store
def index_document(self, document):
"""索引多模态文档"""
# 解析文档为文本块和图像
text_chunks = self.parse_text(document)
images = self.extract_images(document)
# 生成多模态嵌入
for chunk in text_chunks:
embed = self.clip.encode_text(chunk)
self.vector_store.add(embed, metadata={"type": "text", "content": chunk})
for img in images:
embed = self.clip.encode_image(img)
self.vector_store.add(embed, metadata={"type": "image", "content": img})
def query(self, question, top_k=5):
"""多模态检索与生成"""
# 编码查询
query_embed = self.clip.encode_text(question)
# 检索相关内容
results = self.vector_store.similarity_search(query_embed, k=top_k)
# 构建多模态上下文
context_text = [r for r in results if r["type"] == "text"]
context_images = [r for r in results if r["type"] == "image"]
# VLM 生成回答
answer = self.vlm.generate(question, context_text, context_images)
return answer文档解析策略
多模态 RAG 的文档解析是关键环节:
PDF 解析方案
| 方案 | 文本 | 表格 | 图像 | 布局 |
|---|---|---|---|---|
| PyMuPDF | ✓ | ✗ | ✓ | ✗ |
| Unstructured | ✓ | ✓ | ✓ | ✓ |
| Marker | ✓ | ✓ | ✓ | ✓ |
| Docling | ✓ | ✓ | ✓ | ✓ |
多模态 RAG 的三种范式
- 文本嵌入检索 + 文本生成:将图像描述为文本,使用文本 RAG
- 多模态嵌入检索 + 文本生成:用 CLIP 等多模态嵌入检索,但仅用文本生成
- 多模态嵌入检索 + 多模态生成:检索和生成均使用多模态模型
范式选择建议
- 纯文本文档 → 传统文本 RAG
- 含图表的文档 → 范式 2(多模态检索 + 文本生成)
- 需要视觉理解的问题 → 范式 3(全多模态)
混合检索策略
单一向量检索可能遗漏关键词精确匹配的内容,混合检索结合两者优势:
- 向量检索:语义相似度,擅长模糊匹配
- BM25 检索:关键词匹配,擅长精确查找
- 互易排名融合(RRF):合并两种检索的排名结果
挑战与优化
- 模态对齐:文本和图像的语义空间对齐质量影响检索精度
- 长文档处理:长 PDF 需要合理的分块策略
- 表格理解:表格的语义表示比纯文本更复杂
- 检索延迟:大规模知识库的检索延迟优化