引言
"标准 RAG 系统把文档里的一切都当成文本来处理,但表格不是文本,公式不是文本,图片更不是文本。"
这是"每日一个开源项目"系列的第149篇文章 。今天的主角是 RAG-Anything------香港大学数据科学实验室(HKUDS)开源的全模态 RAG 框架,LightRAG 的多模态扩展版本。
一篇金融报告的 PDF,里面有文字、数据表格、折线图、数学公式。你把它丢进标准 RAG 系统,问"2023 年第三季度营收增长了多少":
- 表格被解析成乱七八糟的文本,行列关系丢失
- 图表完全被忽略(text-only parser 跳过图片)
- 公式变成 LaTeX 源码字符串,含义不明
你得到的回答质量,和把整个文档扔给 LLM 相比好不到哪里去。
RAG-Anything 的答案:给每种模态专门的结构化表示。表格变成行/列/单元格节点构成的子图,图片由视觉语言模型分析后变成带描述的实体,公式保留语义节点。所有模态融合进统一的知识图谱,检索时跨模态联合查询。
你将学到什么
- 为什么"把表格转成文本"会损失关键信息
- 双图融合架构:跨模态知识图谱 + 文本知识图谱如何构建和合并
- 5 阶段处理流水线的每个环节
- 三种查询模式:纯文本 / VLM 增强 / 多模态
- DocBench 和 MMLongBench 的基准测试数据
- 与 MMGraphRAG、LightRAG 的对比
前置知识
- 了解 RAG 的基本概念
- 了解知识图谱的基本概念(节点、边)
- Python 基础
项目背景
项目简介
RAG-Anything 是一个全模态 RAG 框架,基于 LightRAG 构建,把文本、图像、表格、公式作为知识图谱的一等实体(first-class entities)来处理,而不是把所有内容都降级为纯文本。
2026 年 6 月,LightRAG 将 RAG-Anything 原生集成进主项目,成为 LightRAG 多模态能力的官方实现。
作者/团队介绍
- 团队: 香港大学数据科学实验室(HKUDS)
- 作者: Zirui Guo、Xubin Ren、Lingrui Xu、Jiahao Zhang、Chao Huang
- arXiv: 2510.12323
- License: MIT
- PyPI :
raganything
项目数据
- ⭐ GitHub Stars: 21,900+
- 🍴 Forks: 2,500+
- 📄 License: MIT
核心问题:为什么"全部转文本"不够用
先把问题说清楚。
表格的结构信息在转文本时丢失
yaml
原始表格:
2021 2022 2023
收入 120亿 145亿 168亿
利润 18亿 22亿 31亿
增长率 15% 20.8% 42.3%
转成文本后(典型 text parser 的输出):
"收入 120亿 145亿 168亿 利润 18亿 22亿 31亿 增长率 15% 20.8% 42.3%"
行列关系全部丢失。问"2022 年的利润增长率是多少",系统可能把"22 亿"和"42.3%"联系在一起(都在 2022 和 2023 的数据里),产生错误答案。
图表对纯文本 parser 不可见
大多数文本提取工具直接跳过 PDF 里的图片和图表。这些内容往往包含文档最重要的洞察(趋势图、对比图、流程图),却完全从 RAG 系统的视野里消失了。
公式失去语义
csharp
LaTeX 源码:$\frac{\partial L}{\partial w} = -\frac{1}{N}\sum_{i=1}^{N} x_i(y_i - \sigma(w^Tx_i))$
这是 logistic regression 的梯度公式。
直接向量化这段 LaTeX 字符串,和"梯度下降"、"参数更新"没有语义关联。
系统架构:5 阶段流水线
yaml
文档(PDF/DOCX/PPTX/图片...)
↓
Stage 1: 文档解析(MinerU / Docling / PaddleOCR)
分解为文本块 + 图片 + 表格 + 公式 + 元素列表
↓
Stage 2: 内容路由
按模态类型分发到对应处理器
↓
Stage 3: 多模态分析
├── 图像处理器 → VLM 生成描述 + 提取实体
├── 表格处理器 → 行/列/单元格结构化节点
├── 公式处理器 → 符号节点 + 语义描述
└── 文本处理器 → 标准 NER + 关系提取
↓
Stage 4: 知识图谱索引(双图融合)
├── 跨模态知识图谱(非文本元素为锚节点)
├── 文本知识图谱(LightRAG 标准图)
└── 实体名对齐 → 融合为统一图 G=(V,E)
↓
Stage 5: 混合检索 + 生成
├── 结构导航(图遍历 + 关键词匹配)
├── 语义相似度(向量检索,跨模态嵌入)
└── VLM 增强生成(检索到图片时自动传给视觉模型)
双图融合架构
这是 RAG-Anything 最核心的设计。
跨模态知识图谱
每个非文本元素(图像、表格、公式)变成图谱中的锚节点:
表格处理:
less
原始表格(收入/利润/年份)
↓ 构建子图
[表格_收入利润对比]
├──[行: 收入]──[单元格: 120亿]──[列: 2021]
├──[行: 收入]──[单元格: 145亿]──[列: 2022]
├──[行: 利润]──[单元格: 18亿]──[列: 2021]
└── ...
边类型: row-of, column-of, header-applies-to
查询"2022 年利润"时,图谱可以精确导航到 行:利润 + 列:2022 的交叉节点,而不是在一串数字里猜。
图像处理:
css
图片(一张销售趋势折线图)
↓ VLM 分析
[图片实体: 销售趋势图_2021-2023]
├── 描述:显示 2021-2023 年销售额的上升趋势
├── [面板节点: 主图区]──[轴节点: X轴-年份]
├── [轴节点: Y轴-金额(亿)]
└── [标注节点: 2023年增幅42.3%]
图像的内容变成可检索的结构化节点,不再是黑盒。
公式处理:
scss
LaTeX 公式
↓ 语义分析
[公式实体: 逻辑回归梯度]
├── 符号节点:∂L, ∂w, σ(·), x_i, y_i
├── 语义描述:logistic regression 参数梯度计算公式
└── 关联关系:belongs_to → [算法: 逻辑回归]
文本知识图谱
对文档的文本部分,用标准的 LightRAG 方式做 NER 和关系提取。
融合
两张图通过实体名对齐合并:如果跨模态图谱的图像实体"销售趋势图"和文本图谱的"销售数据分析"指向同一个概念,它们通过实体名比对被连接在一起。
快速开始
安装:
bash
pip install raganything # 基础版
pip install 'raganything[all]' # 包含所有可选功能
完整初始化:
python
from raganything import RAGAnything, RAGAnythingConfig
import asyncio
# 配置
config = RAGAnythingConfig(
working_dir="./rag_storage",
parser="mineru", # mineru / docling / paddleocr
enable_image_processing=True,
enable_table_processing=True,
enable_equation_processing=True,
)
# LLM 和 Embedding 函数(OpenAI 兼容 API)
async def llm_func(prompt, ...): ...
async def vision_func(prompt, image_data, ...): ... # GPT-4o 或类似
async def embedding_func(texts): ...
rag = RAGAnything(
config=config,
llm_model_func=llm_func,
vision_model_func=vision_func,
embedding_func=embedding_func,
)
# 处理文档
await rag.process_document_complete(
file_path="annual_report.pdf",
output_dir="./output"
)
# 查询
result = await rag.aquery(
"2023 年第三季度的营收增长率是多少?",
mode="hybrid" # hybrid / local / global
)
print(result)
三种查询模式
纯文本模式(fast,走 LightRAG 标准流程):
python
result = await rag.aquery("公司的主要竞争优势是什么?", mode="local")
VLM 增强模式(检索到图片时自动传给视觉模型):
python
result = await rag.aquery("这张架构图说明了什么?", mode="hybrid")
# 当检索结果包含图片时,图片自动编码传给 vision_model_func
# 回答基于实际图片内容,不只是图片描述
多模态查询(直接注入特定内容类型):
python
result = await rag.aquery(
"分析这个表格里的趋势",
mode="hybrid",
content_type_filter=["table"] # 只检索表格内容
)
直接注入预解析内容
跳过内置 parser,使用自己已经解析好的内容:
python
content_list = [
{"content_type": "text", "content": "公司概况..."},
{"content_type": "table", "content": table_data, "caption": "财务数据"},
{"content_type": "image", "content": image_bytes, "caption": "产品架构图"},
]
await rag.ainsert_content_list(content_list)
基准测试结果
论文在两个长文档 QA 基准上评测:
DocBench(229 篇文档,平均 66 页):
| 系统 | 准确率 |
|---|---|
| RAG-Anything | 63.4% |
| MMGraphRAG | 61.0% |
| LightRAG | 58.4% |
| GPT-4o-mini(直接输入) | 51.2% |
MMLongBench(135 篇文档,平均 47.5 页):
| 系统 | 准确率 |
|---|---|
| RAG-Anything | 42.8% |
| LightRAG | 38.9% |
| MMGraphRAG | 37.7% |
| GPT-4o-mini(直接输入) | 33.5% |
100 页以上长文档的表现差异更大:RAG-Anything ~68% vs MMGraphRAG ~55%,超过 13 个百分点。文档越长,结构化表示的优势越明显------因为纯文本越长,"在噪声里找结构性信息"的难度越高。
消融实验关键结果:
- 去掉图谱构建(只用 chunk 检索):63.4% → 60.0%
- 去掉重排序器:只损失约 1 个百分点
- 结论:性能提升主要来自图谱架构本身,而非重排序技巧
支持的解析器
| 解析器 | 最适合 | 特点 |
|---|---|---|
| MinerU | PDF + 复杂排版 | 支持 GPU 加速,OCR 能力强 |
| Docling | Office 文档(DOCX/PPTX/XLSX) | 结构保留好,支持 HTML |
| PaddleOCR | 图像密集型 PDF | 擅长中文 OCR |
Office 格式(.doc/.ppt/.xls)需要 LibreOffice 转换:
bash
sudo apt-get install libreoffice
项目地址与资源
- 🌟 GitHub : HKUDS/RAG-Anything
- 📦 PyPI : raganything
- 📄 arXiv : 2510.12323
- 🔗 LightRAG : HKUDS/LightRAG
总结
RAG-Anything 解决的问题在实际企业文档处理中非常常见:合同、财报、学术论文、技术手册------这些文档里的核心信息往往就藏在表格和图表里,而不是纯文本段落里。把这些内容压缩成文本,然后说"RAG 处理文档",更像是在处理文档的影子。
双图融合架构(跨模态图谱 + 文本图谱合并)是合理的技术路径:用结构化节点表示表格的行列关系,用 VLM 把图片转成可检索的语义实体,用符号节点保留公式的语义。消融实验的结果进一步验证了图谱才是核心,不是检索后处理的技巧。
2026 年 6 月 LightRAG 把它原生集成进主项目,说明这套设计已经得到上游认可。对于需要处理包含图表、表格、公式的复杂文档的 RAG 系统,RAG-Anything 是目前开源生态里最完整的解决方案之一。
探索 PrimeSkills ------ 精选 AI Agent 与技能的市场,每一个都经过真实企业工作流验证,去掉浮夸,留下真正有用的。
欢迎访问我的个人主页,发现更多有价值的见解和有趣的产品。