芥末
发布于 2025-11-19 / 0 阅读
0
0

UltraRAG:基于 MCP 和 YAML 配置的 RAG 框架实践

UltraRAG 是一个面向 RAG(Retrieval-Augmented Generation,检索增强生成)的开源框架,由清华 THUNLP、东北大学 NEUIR、OpenBMB 等团队联合推出。它的重点不只是“把文档塞进向量库再问答”,而是把 RAG 系统里的检索、重排、生成、评估、语料构建等环节拆成标准化组件,再通过 MCP(Model Context Protocol,模型上下文协议)连接起来。

它解决的核心麻烦是:复杂 RAG 系统通常要写很多胶水代码。文档解析、切分、索引、检索、重排、大模型调用、结果评估,每个环节都可能换工具、换模型、换参数。UltraRAG 的做法是把这些环节变成可组合的 MCP Server,再用 YAML 配置声明 Pipeline,让实验流程更容易复现,也更容易替换其中某个模块。

项目地址和相关资源:

代码仓库:https://github.com/OpenBMB/UltraRAG
教程文档:https://ultrarag.openbmb.cn/
数据集:https://modelscope.cn/datasets/UltraRAG/UltraRAG_Benchmark

RAG 系统到底在解决什么问题

大语言模型本身会根据训练时学到的知识生成答案,但它有几个天然限制:

问题表现RAG 的处理方式
知识不够新模型不知道最新文档、内部知识库、企业制度回答前先检索外部知识
容易编造没有依据时仍可能生成看似合理的内容把检索到的证据交给模型
私有数据无法直接进入模型企业资料、论文、报告不在训练集中建立本地知识库或私有索引
长文档难一次性塞进上下文PDF、书籍、网页太长切分、索引、按问题召回片段

典型 RAG 流程可以画成这样:

flowchart LR
    A[用户问题] --> B[查询改写或问题理解]
    B --> C[检索器 Retriever]
    C --> D[候选文档片段]
    D --> E[重排器 Reranker]
    E --> F[高相关证据]
    F --> G[大模型 Generator]
    G --> H[带依据的回答]

    I[(知识库)] --> C
    J[文档解析与切分] --> I

一个最小可用的 RAG 系统通常包含三条链路:

  1. 语料构建链路:把 PDF、Word、网页、电子书等资料解析成统一格式,再切成适合检索的小块。
  2. 在线问答链路:用户提问后,从知识库里召回相关内容,再交给大模型生成答案。
  3. 评估分析链路:对检索命中率、回答准确性、引用证据等指标做评估,方便调参和对比实验。

UltraRAG 的价值就在于把这些链路标准化,而不是让每个项目都从零拼一套脚手架。

UltraRAG 的核心设计:RAG 组件 MCP Server 化

MCP 可以理解为大模型应用和外部工具之间的一套通信规范。模型应用不需要直接知道某个工具的内部实现,只要按照协议调用工具暴露出来的能力即可。

UltraRAG 把 RAG 里的关键组件封装成独立 MCP Server,每个 Server 对外提供函数级 Tool 接口。MCP Client 负责读取 YAML 配置,并按照配置把这些工具串成一条 Pipeline。

flowchart TB
    Y[YAML Pipeline 配置] --> C[MCP Client / Pipeline Runner]

    C --> P[Parser MCP Server<br/>文档解析与切分]
    C --> R[Retriever MCP Server<br/>文本/图像检索]
    C --> K[Reranker MCP Server<br/>候选结果重排]
    C --> G[Generator MCP Server<br/>大模型生成]
    C --> E[Evaluator MCP Server<br/>评估与指标统计]
    C --> V[Case Study Viewer<br/>结果浏览与分析]

    P --> KB[(知识库 / 索引)]
    KB --> R
    R --> K
    K --> G
    G --> E
    E --> V

这种结构有两个直接好处。

一是组件可以替换。比如检索器从向量检索换成混合检索,或者生成模型从一个 LLM(Large Language Model,大语言模型)换成另一个模型,理论上只需要调整对应模块的配置,而不是改完整业务代码。

二是实验可以复现。RAG 实验最怕“代码里藏了参数”,比如 chunk size、top-k、rerank 模型、prompt 模板、评估指标都散落在脚本里。UltraRAG 倾向于把这些选择写进 YAML,方便保存、比较和复跑。

YAML 配置在 RAG Pipeline 里负责什么

YAML(YAML Ain't Markup Language,一种常见配置文件格式)适合描述层级结构。UltraRAG 用它声明一个 RAG Pipeline,包括数据来源、解析方式、检索器、生成模型、评估任务等。

可以把 YAML 配置看成一份“实验说明书”:

# 这是简化后的结构示意,用来说明 UltraRAG 配置驱动的思想。
# 实际字段以官方文档为准。

pipeline:
  name: paper_qa_demo

data:
  source:
    type: pdf
    path: ./data/attention_is_all_you_need.pdf

parser:
  engine: mineru
  split:
    chunk_size: 512
    chunk_overlap: 64

index:
  type: vector
  embedding_model: your-embedding-model
  output_dir: ./indexes/paper_qa_demo

retriever:
  top_k: 20

reranker:
  enabled: true
  top_k: 5

generator:
  model: your-llm
  prompt_template: ./prompts/qa_with_citations.txt

evaluation:
  enabled: true
  metrics:
    - retrieval_recall
    - answer_quality

真正运行时,配置文件会驱动多个步骤:

flowchart LR
    A[编写 YAML 配置] --> B[编译 Pipeline]
    B --> C[检查组件与参数]
    C --> D[构建知识库]
    D --> E[运行问答]
    E --> F[生成结果]
    F --> G[评估与可视化分析]

这不代表完全不需要工程配置。模型 API Key、GPU 环境、依赖安装、数据路径、向量库位置仍然要准备好。UltraRAG 降低的是 RAG 流程编排和实验切换的成本,而不是替代所有部署工作。

2.1 版本的三个重点能力

UltraRAG 2.1 主要强化了多模态、知识接入和统一工作流。

原生多模态:文本、图像、PDF 版面一起处理

传统 RAG 通常只处理纯文本。PDF 里的表格、公式、图表、多栏排版经常会在解析阶段丢失信息,导致模型回答时只能看到不完整的文本。

UltraRAG 的多模态能力把文本和图像纳入同一套框架,尤其是 VisRAG Pipeline 可以支持从 PDF 到多模态问答的闭环。

flowchart LR
    A[PDF 文档] --> B[PDF 解析]
    B --> C[文本内容]
    B --> D[页面图像]
    B --> E[表格 / 公式 / 图表布局]

    C --> F[文本索引]
    D --> G[视觉索引]
    E --> H[结构化信息]

    I[用户问题] --> J[多模态检索]
    F --> J
    G --> J
    H --> J

    J --> K[相关页面与片段]
    K --> L[多模态生成模型]
    L --> M[答案]

这类设计适合处理论文、咨询报告、技术白皮书、财报等文档。比如用户问“论文中的表 4 说明了什么”,系统不能只看正文段落,还需要定位到表格所在页面,并理解表格内容。多模态 RAG 的意义就在这里。

知识接入与语料构建自动化

构建 RAG 知识库时,最耗时的环节常常不是检索,而是“把资料变成可检索语料”。

UltraRAG 支持多格式文档解析,例如 Word、电子书、网页存档等,并提供自动分块能力。对于 PDF,它集成了 MinerU,用来处理复杂版面、多栏结构、表格和图文混排。

常见文档处理差异如下:

文档类型主要难点UltraRAG 侧重点
普通文本内容长、需要合理切分自动分块、统一格式
Word标题层级、列表、表格保留结构后构建语料
PDF多栏、页眉页脚、公式、图表MinerU 解析与版面还原
报告/论文图表和正文互相引用文本与页面图像共同检索
网页存档HTML 噪声、导航栏、广告区域清洗后进入知识库

PDF 解析尤其重要。很多 RAG 效果差不是因为模型不行,而是解析阶段把关键信息弄丢了。比如表格被拆成乱码,公式被忽略,多栏正文顺序错乱,都会直接影响最终回答。

统一工作流:检索、生成、评估放进同一套 Pipeline

RAG 不是只要能回答就结束。想要真正调优,需要回答这些问题:

  • 检索阶段有没有找到正确证据?
  • top-k 取多少合适?
  • 是否需要 rerank?
  • 哪个解析器对 PDF 效果更好?
  • 哪个生成模型更稳定?
  • 回答有没有引用到正确来源?
  • 多模态任务中,视觉信息有没有被用上?

UltraRAG 把检索、生成、评估串成统一流程,适合做实验对比。

flowchart TB
    A[实验配置 A<br/>检索器 1 + 模型 1] --> E[统一评估]
    B[实验配置 B<br/>检索器 2 + 模型 1] --> E
    C[实验配置 C<br/>检索器 1 + 模型 2] --> E
    D[实验配置 D<br/>不同 PDF 解析策略] --> E

    E --> F[指标对比]
    E --> G[Case Study Viewer]
    G --> H[逐条查看问题、证据、回答]

对于研究和内部评测来说,这比手工写多个脚本更容易管理。

两个典型使用场景

论文问答:理解表格、公式和正文关系

以《Attention is All You Need》这类论文为例,用户可能会问:

论文中的表 4 具体说了什么?请结合上下文解释它的含义。

普通文本 RAG 可能只能召回表格附近的文字,表格本体如果解析失败,模型就无法准确解释。多模态 Pipeline 会同时利用页面图像、表格结构和正文内容,让答案更接近人类阅读 PDF 时的方式。

关键流程如下:

sequenceDiagram
    participant U as 用户
    participant P as UltraRAG Pipeline
    participant R as 多模态检索器
    participant M as 生成模型

    U->>P: 提问:表 4 说明什么?
    P->>R: 检索文本片段和页面图像
    R-->>P: 返回表格所在页面、相关正文
    P->>M: 组织证据和问题
    M-->>P: 生成解释性答案
    P-->>U: 返回答案与依据

咨询报告问答:结合图表和正文总结结论

麦肯锡《生成式人工智能的经济潜力》这类报告往往包含大量图表。用户可能会问:

生成式 AI 最有潜力影响哪些企业职能?请结合图表和正文说明它们对组织生产力的影响。

这类问题不能只抽取一句话。系统需要从多个页面中检索相关图表、图注、段落,再把它们合成一个结构化回答。多模态 RAG 的优势在于可以把图表作为证据来源之一,而不是只依赖 OCR 后的零散文字。

适合和不适合的场景

场景是否适合 UltraRAG原因
快速搭建 RAG 实验 Pipeline适合YAML 配置能减少脚本编排成本
论文、报告、财报问答适合多模态和 PDF 解析能力有用
需要比较多个检索器、模型、参数适合配置化流程便于复现和评估
企业内部知识库原型验证适合多格式文档接入能缩短准备时间
只做一个极简单的 FAQ Bot不一定适合直接用轻量向量库和 LLM SDK 可能更快
对线上延迟极度敏感的生产系统需要二次工程化MCP 调用、重排、多模态处理都可能增加链路耗时
已有成熟 RAG 平台且流程固定不一定适合迁移成本可能高于收益

UltraRAG 更像一个面向复杂 RAG 实验和多模态文档问答的框架,而不是一个“一键上线所有场景”的成品系统。

上手流程

UltraRAG 支持 Conda 环境和 Docker 两类部署方式。实际命令要以仓库和官方文档为准,常见流程大致如下。

使用 Conda 准备环境

git clone https://github.com/OpenBMB/UltraRAG.git
cd UltraRAG

conda create -n ultrarag python=3.10
conda activate ultrarag

pip install -r requirements.txt

如果涉及本地大模型、向量模型或多模态模型,还需要根据模型要求准备 GPU 驱动、CUDA、模型权重或 API Key。

使用 Docker 部署

git clone https://github.com/OpenBMB/UltraRAG.git
cd UltraRAG

# 具体 Dockerfile、compose 文件名以仓库为准
docker build -t ultrarag .
docker run --rm -it ultrarag

Docker 的优势是环境更容易固定,适合复现实验;Conda 更适合本地调试和修改源码。

运行一个 Pipeline

使用 UltraRAG 时,核心动作可以压缩成三步:

  1. 准备知识源和模型配置。
  2. 编写 YAML Pipeline。
  3. 编译并运行 Pipeline,查看生成结果和评估结果。

官方快速开始文档:

https://ultrarag.openbmb.cn/pages/cn/getting_started/quick_start

一个实践项目里,目录可以按这种方式组织:

rag-demo/
├── data/
│   └── report.pdf
├── configs/
│   └── report_qa.yaml
├── prompts/
│   └── qa_with_evidence.txt
├── indexes/
└── outputs/

这种结构的好处是数据、配置、提示词、索引和输出彼此分离。后续要比较不同模型或不同检索参数,只需要增加新的 YAML 配置,而不是复制一堆脚本。

Case Study Viewer 适合排查什么问题

UltraRAG 内置 Case Study Viewer,用来交互式浏览实验结果。它的价值不是“看起来更直观”,而是帮助定位 RAG 链路里到底哪一步出了问题。

常见排查方式:

现象可能原因排查点
回答不相关检索没召回正确内容查看 top-k 文档片段
回答漏掉图表信息PDF 图像或表格没有进入检索链路检查解析结果和多模态索引
答案有依据但表达混乱Prompt 或生成模型不合适对比不同 prompt 模板
检索结果很多但噪声大chunk 太碎或检索器不合适调整分块参数、增加 rerank
实验结果波动参数没有固定或模型调用不稳定固化 YAML、保存输出和评估记录

RAG 调优不能只看最终答案,必须看中间证据。Viewer 的作用就是把问题、检索结果、生成答案和评估信息放在一起,方便逐条分析。

使用时需要注意的坑

YAML 降低编排成本,但不等于没有工程成本

配置化可以减少胶水代码,但系统仍然依赖模型服务、文档解析工具、向量索引、存储路径和运行环境。尤其是多模态 Pipeline,对显存、解析速度和模型能力都有更高要求。

PDF 解析质量会直接影响问答质量

如果 PDF 解析阶段把多栏正文顺序打乱,或者表格被拆坏,后面的检索和生成很难补救。处理论文、报告、财报时,应该先抽样检查解析结果,而不是直接批量入库。

多模态 RAG 成本更高

文本检索通常比较快,多模态检索和页面图像理解会带来额外计算成本。对线上应用来说,需要在准确率、延迟和成本之间做取舍。

评估指标要和业务问题对应

通用 Benchmark 能帮助比较模型和检索器,但企业知识库、论文问答、报告解读的评价重点并不相同。比如论文问答更关注证据定位和解释准确性,企业制度问答更关注可追溯和低幻觉率。

MCP 化组件适合扩展,但要关注链路稳定性

把组件拆成 MCP Server 后,每个模块更容易替换,也更容易独立调试。但组件越多,链路中的网络调用、序列化、错误处理和版本兼容问题也越多。生产环境需要补充日志、重试、超时控制和监控。

小结

UltraRAG 的核心思路是把 RAG 系统拆成标准化组件,通过 MCP 连接,再用 YAML 描述完整 Pipeline。它适合做复杂 RAG 实验、多模态 PDF 问答、知识库构建和评估对比。

如果目标是处理大量论文、报告、图表型 PDF,或者需要频繁比较不同检索器、生成模型和参数组合,UltraRAG 的配置化工作流会很有帮助。若只是搭一个简单问答 Demo,轻量级向量库加模型 API 可能更直接。对于严肃的 RAG 项目,UltraRAG 更适合作为实验与原型框架,再根据线上要求补齐工程化能力。


评论