Skip to content

多模态 RAG 与智能体

多模态 Agent 不再局限于被动问答,而是通过检索增强、工具调用和物理交互,解决复杂的真实世界问题。


多模态 RAG 概述

类型检索对象生成模型应用场景
文本 RAG文本向量LLM知识问答
多模态 RAG图像+文本MLLM文档理解、视觉问答
视觉 RAG文档页面图像VLMPDF 检索

文档预处理:多模态 RAG 的基础

传统 RAG 的痛点:pdf_to_text() 丢失了排版、表格、公式等 90% 的关键信息!

文档布局分析(DLA)

LayoutLM 家族演进

模型创新点应用场景
LayoutLM2D位置编码(边界框坐标)表单理解
LayoutLMv2空间感知注意力文档分类
LayoutLMv3统一文本图像预训练文档问答
LayoutLLM结合LLM多任务通用文档智能

GNN(图神经网络)方案

核心思想:将文档页面建模为图

图表示要素

  • 节点:文本块、图片、表格、标注
  • :空间关系(相邻、包含、层级)
  • 优势:对倾斜、手写文档鲁棒性强

复杂表格识别

核心挑战:维护行列关系,尤其是合并单元格(row_span/col_span)

关键能力

  • 明确识别合并单元格(row_span/col_span 属性)
  • 处理无边框表格(通过对齐线索推断)
  • 支持多行表头(层次化表头结构)

工具推荐

工具技术栈特点
img2tableOpenCV检测 + 多OCR后端灵活性强
CamelotPDF原生解析专注PDF
DeepDeSRTTransformer 端到端深度学习

数学与化学公式识别

Image-to-LaTeX 流程

主流模型

模型技术特点
Pix2TexTransformer + CTC开源
LaTeX-OCRViT Encoder + Decoder高准确率
Mathpix商用方案产业级

输出格式:LaTeX、MathML、ASCII Math

图像与图表分析

VLM 描述 + RAG 增强

python
# 使用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 算法

  1. 横向投影找最大空白带(Y-Cut)
  2. 纵向投影分左右栏(X-Cut)
  3. 递归处理每个区域

ColPali:端到端视觉 RAG

传统 PDF 检索需要 OCR,丢失排版、图表等视觉信息。ColPali 直接用 VLM 编码文档页面。

架构设计

Late Interaction 机制

传统 Dense Retrieval

doc_emb = mean(patch_embeddings)  # 压缩为单向量
score = dot(query_emb, doc_emb)

ColPali MaxSim

python
def maxsim(query_tokens, doc_patches):
    # 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) = \sum_{i \in q} \max_{j \in d} (q_i \cdot d_j)$$

优势分析

OCR + Dense

- 丢失排版信息,图表无法检索
- OCR 错误传播,多阶段流水线

VS
ColPali

- 保留视觉布局,图表精准定位,端到端训练
- 所见即所得

应用场景

场景传统方法问题ColPali 优势
表格检索OCR 丢失结构直接编码表格图像
图表问答无法处理图表内容可检索
多栏文档栏序混乱视觉布局保留
手写文档OCR 错误率高VLM 直接理解

RT-2:具身智能

RT-2(Robotic Transformer 2)将多模态大模型转化为 VLA(Vision-Language-Action) 模型。

架构设计

动作 Token 空间

核心思想:将连续动作离散化为语言 Token

python
# 机器人动作空间
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]
# 作为"外语"输入/输出 LLM

Co-Fine-Tuning

涌现能力

训练数据中未见过的指令也能执行

指令所需能力来源
"把灭绝的动物捡起来"恐龙=灭绝动物VLM 世界知识
"把泰勒·斯威夫特的专辑放到盒子里"识别专辑封面VLM 视觉理解
"用可乐把这杯水填满"可乐=饮料VLM 常识推理

多模态 Agent 工作流

Agentic Patterns

多模态工具调用

示例:图片中的产品评价查询

用户:图中这款咖啡机的评价如何?
[上传咖啡机图片]

Agent 思考:需要先识别咖啡机型号,然后搜索评价

步骤1 - OCR 工具调用
  输入:图片
  输出:型号 "DeLonghi EC685"

步骤2 - 搜索工具调用
  输入:{"query": "DeLonghi EC685 评价"}
  输出:[搜索结果...]

步骤3 - 总结
  输出:这款德龙 EC685 咖啡机总体评价良好,
         优点是操作简单、出品稳定...

工具类型

工具类型示例用途
视觉感知OCR、目标检测理解图像内容
信息检索搜索、RAG获取外部知识
执行操作代码执行、API完成具体任务
生成工具图像生成、TTS创建内容

规划与反思

多步规划

自我反思

python
def reflect(action_history, current_result, goal):
    prompt = f"""
    目标:{goal}
    已执行的动作:{action_history}
    当前结果:{current_result}
    
    请分析:
    1. 当前进度是否符合预期?
    2. 是否需要调整策略?
    3. 下一步应该做什么?
    """
    return llm(prompt)

多模态 Agent 框架

主流框架对比

框架特点多模态支持
LangChain生态丰富通过扩展支持
AutoGPT自主规划有限
JARVIS/HuggingGPT模型调度原生多模态
TaskMatrix微软方案视觉+API

HuggingGPT 架构


安全与对齐

多模态 Agent 风险

风险类型描述缓解措施
越狱攻击图像中隐藏恶意指令输入过滤
工具滥用调用危险 API权限控制
信息泄露暴露敏感数据输出审查
失控行为机器人意外动作安全边界

最佳实践

安全边界

  1. 最小权限原则:工具只给必要权限
  2. 人在回路:关键操作需人工确认
  3. 沙盒执行:代码在隔离环境运行
  4. 输出过滤:检查生成内容合规性

参考资源

资源说明
ColPali视觉 RAG
RT-2具身智能
PaLM-E具身语言模型
HuggingGPT模型调度
TaskMatrix视觉 Agent

基于 VitePress 构建