多模态 RAG 与智能体
多模态 Agent 不再局限于被动问答,而是通过检索增强、工具调用和物理交互,解决复杂的真实世界问题。
多模态 RAG 概述
| 类型 | 检索对象 | 生成模型 | 应用场景 |
|---|---|---|---|
| 文本 RAG | 文本向量 | LLM | 知识问答 |
| 多模态 RAG | 图像+文本 | MLLM | 文档理解、视觉问答 |
| 视觉 RAG | 文档页面图像 | VLM | PDF 检索 |
文档预处理:多模态 RAG 的基础
纯文本抽取可能丢失表格单元格关联、阅读顺序与图表视觉线索,具体损失取决于 PDF 与解析器;没有通用的“丢失 90%”比例。先把解析错、检索错和回答错分开测。
文档布局分析(DLA)
LayoutLM 家族演进
| 模型 | 创新点 | 应用场景 |
|---|---|---|
| LayoutLM | 2D位置编码(边界框坐标) | 表单理解 |
| LayoutLMv2 | 空间感知注意力 | 文档分类 |
| LayoutLMv3 | 统一文本图像预训练 | 文档问答 |
| LayoutLLM | 结合LLM多任务 | 通用文档智能 |
GNN(图神经网络)方案
核心思想:将文档页面建模为图
图表示要素
- 节点:文本块、图片、表格、标注
- 边:空间关系(相邻、包含、层级)
- 边界:图结构可表达空间关系,但倾斜/手写鲁棒性仍依赖检测、OCR 与训练覆盖
复杂表格识别
核心挑战:维护行列关系,尤其是合并单元格(row_span/col_span)
关键能力
- 明确识别合并单元格(row_span/col_span 属性)
- 处理无边框表格(通过对齐线索推断)
- 支持多行表头(层次化表头结构)
工具推荐
| 工具 | 技术栈 | 特点 |
|---|---|---|
img2table | OpenCV检测 + 多OCR后端 | 灵活性强 |
Camelot | PDF原生解析 | 专注PDF |
DeepDeSRT | 深度学习表格检测与结构识别研究 | 历史研究,不作为当前接口建议 |
数学与化学公式识别
Image-to-LaTeX 流程
主流模型
| 模型 | 技术 | 特点 |
|---|---|---|
| pix2tex / LaTeX-OCR | 视觉编码与序列解码 | 同一开源项目,不是两个独立方案 |
| Mathpix | 商用方案 | 产业级 |
输出格式依工具而定;pix2tex / LaTeX-OCR主要输出 LaTeX。数学公式识别也不能直接替代化学结构图识别。
图像与图表分析
VLM 描述 + RAG 增强
下面是历史 BLIP-2 调用示意,依赖 Transformers、模型权重和 chart_image,未执行推理。描述可用于召回候选,但数值、轴单位和图例必须回到原图/表格验证;后接 RAG 不能把错误 caption 自动变成正确证据。
# 使用BLIP-2描述图表
from transformers import Blip2Processor, Blip2ForConditionalGeneration
processor = Blip2Processor.from_pretrained("Salesforce/blip2-opt-2.7b")
model = Blip2ForConditionalGeneration.from_pretrained("Salesforce/blip2-opt-2.7b")
question = "What does this chart show?"
inputs = processor(chart_image, question, return_tensors="pt")
out = model.generate(**inputs)
caption = processor.decode(out[0], skip_special_tokens=True)
# 使用RAG检索领域知识进一步精细化描述
context = rag_retriever.search(caption)
detailed_desc = llm.generate(f"{caption}\n\nContext: {context}")逻辑阅读顺序检测
问题:多栏布局、嵌入式图表打乱了自然阅读顺序
技术方案
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 基于规则 | XY-Cut算法(递归切分) | 标准双栏论文 |
| 深度学习 | Graph Convolutional Network | 复杂布局 |
| 混合方法 | 规则 + 启发式 + DL | 通用文档 |
XY-Cut 算法
- 横向投影找最大空白带(Y-Cut)
- 纵向投影分左右栏(X-Cut)
- 递归处理每个区域
ColPali:端到端视觉 RAG
文本 PDF 可直接抽取,扫描件通常需要 OCR;视觉布局丰富的文档可比较 ColPali的页面多向量检索。它解决检索表示问题,不单独完成 RAG 答案生成与证据核验。
架构设计
Late Interaction 机制
传统 Dense Retrieval
doc_emb = mean(patch_embeddings) # 压缩为单向量
score = dot(query_emb, doc_emb)ColPali MaxSim
def maxsim(query_tokens, doc_patches):
# 仅有效 token;padding 必须先移除或用 mask 排除
# query_tokens: [M, D]
# doc_patches: [N, D]
scores = query_tokens @ doc_patches.T # [M, N]
max_scores = scores.max(dim=1).values # [M]
return max_scores.sum()S(q,d) = Σ_(i ∈ q) max_(j ∈ d) (q_i · d_j)优势分析
- 纯文本路径可能遗漏布局,需要额外图表表示
- OCR 错误传播,多阶段流水线
- 利用页面视觉线索做检索;精确证据区域还需定位与核验
- 页面级召回,仍可能召回错误或近似页面
应用场景
多向量索引需要存储页面的多个 patch 向量,MaxSim 的成本高于单向量点积。大库可先召回候选再做精确重排,比较压缩/池化对小字检索的损失。每页至少保存文档 ID、页码、图像哈希、原始尺寸、权限与版本;答案引用时将证据映射回原页坐标。
| 场景 | 传统方法问题 | ColPali 优势 |
|---|---|---|
| 表格检索 | OCR 丢失结构 | 直接编码表格图像 |
| 图表问答 | 需把图表转成可检索表示 | 页面视觉内容可参与检索 |
| 多栏文档 | 栏序混乱 | 视觉布局保留 |
| 手写文档 | OCR 错误率高 | VLM 直接理解 |
从页面检索到答案:保留两套证据粒度
2026-10-08 复核 ColPali 论文:其核心是页面图像的多向量检索,ViDoRe 主要测页级相关性。命中一页不能证明模型已读对该页的每个单元格,也不能证明联合多页结论完整。
实际索引同时保留 document_id + revision + page_id,解析出的文字/表格与原页建立坐标映射。文字检索与视觉检索先映射为同一页 ID,再去重与融合;不能把两种相似度直接相加。答案阶段按证据需求传原页、局部裁剪或表格,引用最终绑定到可复查的原文位置。
最小验收包含四组:仅靠文字可答、必须看图、跨页联合、文档无答案。分别报告页 Recall@K、完整证据覆盖、数值/单位正确率和引用支持;对同一页替换图表或遮挡关键区域,检查答案是否随证据改变。这个流程是基于论文能力边界的工程建议,本文未运行页面索引或视觉模型。
RT-2:具身智能
RT-2(Robotic Transformer 2)将多模态大模型转化为 VLA(Vision-Language-Action) 模型。
架构设计
动作 Token 空间
下例数值仅示意动作表示,不是可发给机器人的控制命令。量化范围、单位、坐标系和控制频率必须与机器人训练接口一致;RT-2的实验能力不能直接移植到不同硬件。
核心思想:将连续动作离散化为语言 Token
# 机器人动作空间
action = {
'x': 0.15, # 末端位置 x
'y': -0.02, # 末端位置 y
'z': 0.08, # 末端位置 z
'roll': 0.0, # 姿态
'pitch': 0.1,
'yaw': 0.0,
'gripper': 1, # 夹爪开合
'terminate': 0 # 是否结束
}
# 离散化为 Token
# 每个维度量化为 256 个 bin
action_tokens = [128, 120, 140, 128, 135, 128, 255, 0]
# 作为"外语"输入/输出 LLMCo-Fine-Tuning
涌现能力
论文展示了部分语义泛化案例,并不保证任意未见动作可执行
| 指令 | 所需能力 | 来源 |
|---|---|---|
| "把灭绝的动物捡起来" | 恐龙=灭绝动物 | VLM 世界知识 |
| "把泰勒·斯威夫特的专辑放到盒子里" | 识别专辑封面 | VLM 视觉理解 |
| "用可乐把这杯水填满" | 可乐=饮料 | VLM 常识推理 |
多模态 Agent 工作流
Agentic Patterns
多模态工具调用
示例:图片中的产品评价查询
用户:图中这款咖啡机的评价如何?
[上传咖啡机图片]
Agent 思考:需要先识别咖啡机型号,然后搜索评价
步骤1 - OCR 工具调用
输入:图片
输出:型号 "DeLonghi EC685"
步骤2 - 搜索工具调用
输入:{"query": "DeLonghi EC685 评价"}
输出:[搜索结果...]
步骤3 - 总结
输出:这款德龙 EC685 咖啡机总体评价良好,
优点是操作简单、出品稳定...工具类型
| 工具类型 | 示例 | 用途 |
|---|---|---|
| 视觉感知 | OCR、目标检测 | 理解图像内容 |
| 信息检索 | 搜索、RAG | 获取外部知识 |
| 执行操作 | 代码执行、API | 完成具体任务 |
| 生成工具 | 图像生成、TTS | 创建内容 |
规划与反思
多步规划
自我反思
def reflect(action_history, current_result, goal):
prompt = f"""
目标:{goal}
已执行的动作:{action_history}
当前结果:{current_result}
请分析:
1. 当前进度是否符合预期?
2. 是否需要调整策略?
3. 下一步应该做什么?
"""
return llm(prompt)多模态 Agent 框架
主流框架对比
下表保留历史方案供理解“规划—专家模型—结果整合”的分工,不是当前支持矩阵。落地前核查具体版本是否支持媒体传递、工具 schema、状态恢复与权限审计。
| 框架 | 特点 | 多模态支持 |
|---|---|---|
| LangChain | 生态丰富 | 通过扩展支持 |
| AutoGPT | 自主规划 | 有限 |
| JARVIS/HuggingGPT | 模型调度 | 原生多模态 |
| TaskMatrix | 微软方案 | 视觉+API |
HuggingGPT 架构
安全与对齐
多模态 Agent 风险
| 风险类型 | 描述 | 缓解措施 |
|---|---|---|
| 越狱攻击 | 图像中隐藏恶意指令 | 将 OCR/图片文字视为不可信数据,工具权限独立校验 |
| 工具滥用 | 调用危险 API | 权限控制 |
| 信息泄露 | 暴露敏感数据 | 输出审查 |
| 失控行为 | 机器人意外动作 | 安全边界 |
最佳实践
安全边界
- 最小权限原则:工具只给必要权限
- 人在回路:关键操作需人工确认
- 沙盒执行:代码在隔离环境运行
- 输出过滤:检查生成内容合规性
从检索到执行的验收链
以一份带图表的 PDF 为练习:标注问题、正确页码、证据区域、答案和“文档无答案”样本。建立文本解析检索、页面视觉检索与混合方案三条基线。
| 阶段 | 指标/证据 | 失败时先查 |
|---|---|---|
| 解析/索引 | 页面完整率、坐标回映、表格结构准确率 | 缩放、旋转、OCR 与页面版本 |
| 检索 | Recall@K、nDCG、权限过滤后召回 | 查询表示、长尾概念、索引压缩 |
| 回答 | 引用正确页/区域、数字与单位准确率 | 图像预算、证据可读性、引用绑定 |
| 工具执行 | 成功率、重试/取消、重复副作用 | 参数校验、幂等键、事务状态 |
只把 caption 送给生成器会丢失原图细节,精确数字任务应同时提供原图裁剪或解析表格。Agent 识别产品型号不确定时应保留候选,不能立刻据此执行购买/删除等动作。超过工具次数或耗时预算时输出已验证结果与未完成部分;“自我反思”不是无限重试机制。
参考资源
| 资源 | 说明 |
|---|---|
| ColPali | 视觉 RAG |
| RT-2 | 具身智能 |
| PaLM-E | 具身语言模型 |
| HuggingGPT | 模型调度 |
| TaskMatrix | 视觉 Agent |