HKUDS/RAG-Anything

GitHub Trending (daily) 工具

摘要

HKUDS 发布 RAG-Anything:基于 LightRAG 的开源一站式多模态检索增强生成框架。

“RAG-Anything:一站式 RAG 框架”
查看原文
查看缓存全文

缓存时间: 2026/04/21 14:25

HKUDS/RAG-Anything 源码:https://github.com/HKUDS/RAG-Anything

🚀 RAG-Anything:一站式 RAG 框架 — —

🎉 新闻

  • [2025.10]🎯📢 🚀 我们发布了 RAG-Anything 技术报告(http://arxiv.org/abs/2510.12323),立即访问获取最新研究成果。
  • [2025.08]🎯📢 🔍 RAG-Anything 新增 VLM 增强查询 模式!当文档包含图片时,系统自动将其送入 VLM 进行多模态分析,融合视觉与文本上下文,洞察更深入。
  • [2025.07]🎯📢 RAG-Anything 新增上下文配置模块,可智能整合相关上下文信息,增强多模态内容处理。
  • [2025.07]🎯📢 🚀 RAG-Anything 现已支持多模态查询,无缝处理文本、图像、表格、公式,RAG 能力再升级。
  • [2025.07]🎯📢 🎉 RAG-Anything GitHub 星标破 1k🌟!感谢大家的鼎力支持与宝贵贡献。

🏗️ 算法与架构

核心算法

RAG-Anything 实现高效多阶段多模态流水线,在智能编排与跨模态理解基础上,将传统 RAG 架构无缝扩展至多元内容模态。
📄 文档解析 → 🧠 内容理解 → 🔍 知识图谱 → 🎯 智能检索

1. 文档解析阶段

系统通过自适应内容分解实现高保真文档抽取,智能切分异构元素并保持上下文关系,通用格式兼容由专用优化解析器完成。
关键组件:

  • ⚙️ MinerU 集成:借助 MinerU(https://github.com/opendatalab/MinerU)高保真提取文档结构,跨复杂版式保持语义。
  • 🧩 自适应内容分解:自动将文档划分为连贯文本块、视觉元素、结构化表格、数学公式及专用内容,同时保留上下文关系。
  • 📁 全格式支持:通过专用优化解析器全面处理 PDF、Office(DOC/DOCX/PPT/PPTX/XLS/XLSX)、图片及新兴格式。

2. 多模态内容理解与处理

系统自动分类并路由内容至最优通道,采用并发流水线并行处理文本与多模态数据,转换过程中保留文档层级与关系。
关键组件:

  • 🎯 自主内容分类与路由:自动识别、分类并路由不同内容类型至最优执行通道。
  • ⚡ 并发多流水线架构:文本与多模态内容通过专用流水线并发执行,最大化吞吐同时保证内容完整性。
  • 🏗️ 文档层级抽取:转换过程中抽取并保留原文档层级及元素间关系。

3. 多模态分析引擎

系统针对异构数据模态部署模态感知处理单元:
专用分析器:

  • 🔍 视觉内容分析器
    – 集成视觉模型进行图像分析。
    – 基于视觉语义生成上下文相关描述。
    – 抽取视觉元素间空间关系与层级结构。
  • 📊 结构化数据解释器
    – 系统化解释表格与结构化数据。
    – 通过统计模式识别进行数据趋势分析。
    – 识别跨表语义关系与依赖。
  • 📐 数学表达式解析器
    – 高精度解析复杂数学表达式与公式。
    – 原生支持 LaTeX,与学术工作流无缝集成。
    – 建立数学方程与领域知识库的概念映射。
  • 🔧 可扩展模态处理器
    – 提供可配置框架,支持自定义与新兴内容类型。
    – 通过插件架构动态集成新模态处理器。
    – 支持运行时配置专用流水线。

4. 多模态知识图谱索引

多模态知识图谱构建模块将文档内容转为结构化语义表示,抽取多模态实体、建立跨模态关系并保留层级组织,应用加权相关性评分以优化知识检索。
核心功能:

  • 🔍 多模态实体抽取:将重要多模态元素转为知识图谱实体,含语义注释与元数据保留。
  • 🔗 跨模态关系映射:通过自动关系推理算法,建立文本实体与多模态组件间的语义连接与依赖。
  • 🏗️ 层级结构保留:通过“belongs_to”关系链保留原文档组织,维护逻辑层级与章节依赖。
  • ⚖️ 加权关系评分:基于语义邻近度与上下文重要性,为关系类型分配定量相关性评分。

5. 模态感知检索

混合检索系统融合向量相似度搜索与图遍历算法,实现全面内容检索;采用模态感知排序机制,保持检索元素间关系一致性,确保上下文整合的信息交付。
检索机制:

  • 🔀 向量-图谱融合:结合向量相似度与图遍历,利用语义嵌入与结构关系实现全面检索。
  • 📊 模态感知排序:根据内容类型相关性自适应评分,按查询模态偏好调整排序。
  • 🔗 关系一致性维护:保持检索元素间语义与结构关系,确保信息连贯与上下文完整。

🚀 快速开始

开启你的 AI 之旅

安装

方案 1:PyPI 安装(推荐)

# 基础安装  
pip install raganything  

# 带扩展格式支持的可选依赖:  
pip install 'raganything[all]'        # 全部可选特性  
pip install 'raganything[image]'      # 图像格式转换(BMP、TIFF、GIF、WebP)  
pip install 'raganything[text]'       # 文本文件处理(TXT、MD)  
pip install 'raganything[image,text]' # 多特性组合  

方案 2:源码安装

# 安装 uv(如未安装)  
curl -LsSf https://astral.sh/uv/install.sh | sh  

# 克隆并使用 uv 配置项目  
git clone https://github.com/HKUDS/RAG-Anything.git  
cd RAG-Anything  

# 在虚拟环境安装包及依赖  
uv sync  

# 若遇到网络超时(尤其 opencv 包):  
# UV_HTTP_TIMEOUT=120 uv sync  

# 使用 uv 直接运行(推荐)  
uv run python examples/raganything_example.py --help  

# 安装可选依赖  
uv sync --extra image --extra text   # 指定扩展  
uv sync --all-extras                 # 全部扩展  

可选依赖

  • [image] – 支持 BMP、TIFF、GIF、WebP 图像格式(需 Pillow)
  • [text] – 支持 TXT、MD 文件(需 ReportLab)
  • [all] – 包含全部 Python 可选依赖

⚠️ Office 文档处理要求:

  • 需安装 LibreOffice 以处理 .doc/.docx/.ppt/.pptx/.xls/.xlsx
  • 官网下载:https://www.libreoffice.org/download/download/
  • Windows:官网下载安装包
  • macOSbrew install --cask libreoffice
  • Ubuntu/Debiansudo apt-get install libreoffice
  • CentOS/RHELsudo yum install libreoffice

检查 MinerU 安装:

# 验证安装  
mineru --version  

# 检查配置  
python -c "from raganything import RAGAnything; rag = RAGAnything(); print('✅ MinerU 安装正常' if rag.check_parser_installation() else '❌ MinerU 安装异常')"  

模型首次使用自动下载。如需手动下载,参考 MinerU 模型源配置(https://github.com/opendatalab/MinerU/blob/master/README.md#22-model-source-configuration)。

使用示例

1. 端到端文档处理

import asyncio  
from raganything import RAGAnything, RAGAnythingConfig  
from lightrag.llm.openai import openai_complete_if_cache, openai_embed  
from lightrag.utils import EmbeddingFunc  

async def main():  
    # 配置 API  
    api_key = "your-api-key"  
    base_url = "your-base-url"  # 可选  

    # 创建 RAGAnything 配置  
    config = RAGAnythingConfig(  
        working_dir="./rag_storage",  
        parser="mineru",          # 解析器:mineru、docling 或 paddleocr  
        parse_method="auto",      # 解析方式:auto、ocr 或 txt  
        enable_image_processing=True,  
        enable_table_processing=True,  
        enable_equation_processing=True,  
    )  

    # 定义 LLM 函数  
    def llm_model_func(prompt, system_prompt=None, history_messages=[], **kwargs):  
        return openai_complete_if_cache(  
            "gpt-4o-mini", prompt, system_prompt=system_prompt,  
            history_messages=history_messages, api_key=api_key, base_url=base_url, **kwargs  
        )  

    # 定义视觉模型函数(用于图像处理)  
    def vision_model_func(prompt, system_prompt=None, history_messages=[],  
                          image_data=None, messages=None, **kwargs):  
        if messages:  # 多模态 VLM 增强查询  
            return openai_complete_if_cache(  
                "gpt-4o", "", system_prompt=None, history_messages=[],  
                messages=messages, api_key=api_key, base_url=base_url, **kwargs  
            )  
        elif image_data:  # 单图模式  
            return openai_complete_if_cache(  
                "gpt-4o", "", system_prompt=None, history_messages=[],  
                messages=[  
                    {"role": "system", "content": system_prompt} if system_prompt else None,  
                    {  
                        "role": "user",  
                        "content": [  
                            {"type": "text", "text": prompt},  
                            {  
                                "type": "image_url",  
                                "image_url": {"url": f"data:image/jpeg;base64,{image_data}"},  
                            },  
                        ],  
                    } if image_data else {"role": "user", "content": prompt},  
                ],  
                api_key=api_key, base_url=base_url, **kwargs,  
            )  
        else:  # 纯文本  
            return llm_model_func(prompt, system_prompt, history_messages, **kwargs)  

    # 定义嵌入函数  
    embedding_func = EmbeddingFunc(  
        embedding_dim=3072,  
        max_token_size=8192,  
        func=lambda texts: openai_embed.func(  
            texts, model="text-embedding-3-large", api_key=api_key, base_url=base_url  
        ),  
    )  

    # 初始化 RAGAnything  
    rag = RAGAnything(  
        config=config,  
        llm_model_func=llm_model_func,  
        vision_model_func=vision_model_func,  
        embedding_func=embedding_func,  
    )  

    # 处理文档  
    await rag.process_document_complete(  
        file_path="path/to/your/document.pdf",  
        output_dir="./output",  
        parse_method="auto"  
    )  

    # 查询已处理内容  
    # 纯文本查询  
    text_result = await rag.aquery(  
        "图表和表格中的主要发现是什么?", mode="hybrid"  
    )  
    print("文本查询结果:", text_result)  

    # 多模态查询  
    multimodal_result = await rag.aquery_with_multimodal(  
        "解释这个公式及其与文档内容的相关性",  
        multimodal_content=[{  
            "type": "equation",  
            "latex": "P(d|q) = \\frac{P(q|d) \\cdot P(d)}{P(q)}",  
            "equation_caption": "文档相关性概率"  
        }],  
        mode="hybrid"  
    )  
    print("多模态查询结果:", multimodal_result)  

if __name__ == "__main__":  
    asyncio.run(main())  

2. 直接多模态内容处理

import asyncio  
from lightrag import LightRAG  
from lightrag.llm.openai import openai_complete_if_cache, openai_embed  
from lightrag.utils import EmbeddingFunc  
from raganything.modalprocessors import ImageModalProcessor, TableModalProcessor  

async def process_multimodal_content():  
    # 配置 API  
    api_key = "your-api-key"  
    base_url = "your-base-url"  # 可选  

    # 初始化 LightRAG  
    rag = LightRAG(  
        working_dir="./rag_storage",  
        llm_model_func=lambda prompt, system_prompt=None, history_messages=[], **kwargs:  
            openai_complete_if_cache(  
                "gpt-4o-mini", prompt, system_prompt=system_prompt,  
                history_messages=history_messages, api_key=api_key, base_url=base_url, **kwargs  
            ),  
        embedding_func=EmbeddingFunc(  
            embedding_dim=3072,  
            max_token_size=8192,  
            func=lambda texts: openai_embed.func(  
                texts, model="text-embedding-3-large", api_key=api_key, base_url=base_url  
            ),  
        ),  
    )  
    await rag.initialize_storages()  

    # 处理图像  
    image_processor = ImageModalProcessor(  
        lightrag=rag,  
        modal_caption_func=lambda prompt, system_prompt=None, history_messages=[],  
        image_data=None, **kwargs:  
            openai_complete_if_cache(  
                "gpt-4o", "", system_prompt=None, history_messages=[],  
                messages=[  
                    {"role": "system", "content": system_prompt} if system_prompt else None,  
                    {  
                        "role": "user",  
                        "content": [  
                            {"type": "text", "text": prompt},  
                            {  
                                "type": "image_url",  
                                "image_url": {"url": f"data:image/jpeg;base64,{image_data}"},  
                            },  
                        ],  
                    } if image_data else {"role": "user", "content": prompt},  
                ],  
                api_key=api_key, base_url=base_url, **kwargs,  
            ) if image_data else openai_complete_if_cache(  
                "gpt-4o-mini", prompt, system_prompt, history_messages, **kwargs  
            ),  
    )  

相似文章

RAG-Anything:全能型 RAG 框架

Papers with Code Trending

RAG-Anything 是一个全新的开源框架,通过整合跨模态关系和语义匹配来增强多模态知识检索,在复杂的基准测试中表现优于现有方法。

Disco-RAG: 话语感知检索增强生成

arXiv cs.CL

Disco-RAG 提出了一个话语感知的检索增强生成框架,通过块内话语树和块间修辞图整合话语信号,以改进大语言模型的知识综合能力。该方法在问答和摘要生成基准测试中达到最先进的效果,无需微调。