每周技术加速器:UltraRAG:突破传统RAG架构的创新与实践

欢迎来到我们的 「每周技术加速器」 专栏!

每周五,我们都会围绕一个前沿技术主题,展开一场深度的内部技术分享会。不仅是为了团队内部的碰撞与成长,也希望通过这样的形式,将我们的思考与实践记录、沉淀、分享给更多同行者。

本周,我们探讨的主题是:基于 Mcp 的 Rag 架构革新:ultra Rag 的实践与思考

本次技术分享会围绕 UltraRAG 展开讨论。UltraRAG 并非在"生成效果"层面进行局部优化,而是试图回答一个更上层、更长期的问题:

RAG 是否可以像分布式系统一样,被清晰地分层、标准化和模块化,从而具备可演进性?UltraRAG 给出的答案是肯定的。

从"能用的 RAG"到"架构级 RAG"

在大模型应用逐步走向生产化的今天,RAG(Retrieval‑Augmented Generation)已经不再是一个"是否需要"的问题,而是一个"如何设计、如何演进、如何规模化"的架构问题。

许多团队已经将 RAG 成功落地,但在进入真实业务和长期演进阶段后,往往会遇到一系列更本质的困惑:

●为什么系统功能不断叠加,却越来越难以修改和演进?

●为什么一次简单的检索或生成策略调整,都会牵动大量代码?

●为什么 RAG 难以像数据库、消息队列那样,沉淀为稳定、可复用的基础设施?

这些问题的根源,并不在模型效果本身,而在于RAG 的架构层次是否成立。

本次技术分享会围绕 UltraRAG 展开讨论。UltraRAG 并非在"生成效果"层面进行局部优化,而是试图回答一个更上层、更长期的问题:

RAG 是否可以像分布式系统一样,被清晰地分层、标准化和模块化,从而具备可演进性?

UltraRAG 给出的答案是肯定的。

作为首个基于 MCP(Model Context Protocol)的模块化 RAG 框架,UltraRAG 尝试通过协议化接口、分层架构与配置驱动机制,将 RAG 从"应用代码的一部分",提升为"可长期演进的系统架构"。

在进入具体技术细节之前,先给出贯穿全文的三条核心架构判断:

协议决定架构上限

配置是系统的控制面

RAG 正在走向工具化与实时化的基础设施阶段

从传统 RAG 说起:清晰流程下的结构性困境

1. 传统 RAG 的基本范式

从流程上看,传统 RAG 的整体逻辑非常清晰:

1.用户提出问题

2.问题向量化(Embedding)

3.向量数据库相似度检索

4.构建 Prompt

5.大语言模型生成答案

在这一过程中,通常涉及四个关键技术模块:

文档分块(Chunking): 将长文档切分为可检索的最小单元

嵌入模型(Embedding): 将文本映射到向量空间

向量数据库(Vector DB): 进行高效相似度搜索

提示词工程(Prompt Engineering): 组织上下文以引导生成

从"白板设计"的角度看,这一技术路径并不复杂。但在工程实践中,问题往往从这里开始显现。

2. 传统 RAG 框架的五大典型问题

在大量工程实践中,传统 RAG 框架逐渐暴露出一系列结构性问题,可以归纳为以下五个方面。

(1)组件强耦合,开发复杂度高

以 LangChain 等框架为代表,检索器、生成模型与业务逻辑往往在代码中直接绑定。一旦需要更换检索策略或模型后端,通常就需要修改核心代码。

其根本原因在于:缺乏统一的抽象层,组件之间高度耦合。

(2)配置分散,难以统一管理

模型参数、检索参数、Prompt 模板往往散落在不同代码位置,缺乏声明式配置机制,直接导致:

●参数不可追溯

●实验难以复现

●配置无法版本化管理

(3)调试困难,缺乏可观测性

在多数传统框架中,RAG 更像一个"黑箱":

●实际检索到了哪些文档?

●为什么选择这些内容?

●最终传入模型的 Prompt 具体是什么形态?

这些中间状态往往缺乏系统性的记录与可视化手段。

(4)扩展性受限

新增功能或能力通常意味着:

修改框架核心代码

这种非插件式架构,使得框架扩展成本高、生态难以形成。

(5)多模态支持薄弱

多数 RAG 框架在设计之初仅面向文本场景,对于图像、表格等复杂模态支持不足,往往需要通过"拼凑式"的方式进行补偿。

3. 核心矛盾的本质

上述问题虽然表现各异,但本质高度一致:

现有 RAG 框架大多是代码驱动、组件紧耦合的系统,缺乏统一协议与声明式抽象层。

这也自然引出了一个关键问题:

是否可以构建一个 低代码、模块化、易扩展、可复用 的 RAG 架构?

UltraRAG 正是对这一问题的系统性回应。

UltraRAG:以配置与协议重构 RAG 架构

1. UltraRAG 的定位

UltraRAG 是首个基于 MCP 架构的模块化 RAG 框架。 其目标并非提供更多内置能力,而是重新定义 RAG 系统的组织方式:

●使用 YAML 配置 描述 RAG Pipeline

●使用 标准协议 连接检索、生成与工具

●使用 模块化设计 实现组件解耦

可以将其核心理念概括为一句话:

用配置描述系统行为,用协议连接系统能力。

2. UltraRAG 的核心特性

UltraRAG 具备以下五个显著特性:

●低代码: 核心流程通过 YAML 声明完成,显著降低工程复杂度

●模块化: Retriever、Generator、Parser 等组件完全解耦

●多模态原生支持: 文本、图像、表格统一建模与处理

●插件式扩展: 新增能力无需修改框架核心代码

●标准化接口: 基于 MCP 协议,实现工具级互操作

3. 从"代码耦合"到"配置解耦"

在传统 RAG 模式下:

●更换 Retriever 通常需要修改代码

●参数调优往往需要反复阅读与调整实现逻辑

而在 UltraRAG 中:

●Retriever 与 Generator 均通过配置独立声明

●后端类型、模型选择与超参数一目了然

●配置文件可进行版本管理、复用与对比

在这一模式下,配置本身即系统行为的完整描述。

UltraRAG 的关键技术:MCP 与三层架构

1. MCP:架构级协议,而非性能优化手段

MCP(Model Context Protocol)的核心目标,并非追求单点性能提升,而是实现:标准化、解耦与互操作

其作用可以类比 HTTP 在 Web 体系中的地位。

MCP 主要带来三方面价值:

工具解耦: 各类 Server 可独立运行、独立演进

统一接口: 基于 JSON-RPC,接入与集成成本极低

插件化扩展: 新增工具仅需实现 MCP 接口

2. UltraRAG 的三层架构设计

基于 MCP,UltraRAG 构建了清晰的三层体系结构:

Client 层: 负责读取 YAML 配置并编排 Pipeline

Server 层: 通过 MCP 暴露标准化能力接口

Backend 层: 具体实现(如 FAISS、vLLM、MinerU 等)

这一设计的核心原则在于:

上层仅依赖接口,而不依赖具体实现。

各组件可像积木一样被自由替换与升级。

3. 配置驱动的系统价值

配置驱动并不只是减少代码量,而是带来三种系统级能力:

  • 可追溯性:配置即系统文档
  • 可复现性:一个 YAML 对应一次完整实验
  • 可版本化:天然适配 Git 等版本管理工具

同时,YAML 的模板与继承机制,使得配置复用与组合成本极低。

4. 多模态能力与 MinerU 的集成

UltraRAG 的多模态能力并非后期补丁,而是源于架构层面的原生设计。

通过与 MinerU 的深度集成,系统能够:

  • 解析文档中的图像、表格与公式
  • 将表格转为 HTML、公式转为 LaTeX
  • 支持 100+ 语言的 OCR
  • 自动识别文档阅读顺序

这使 UltraRAG 在处理论文、财报与技术文档等复杂场景时具备显著优势。

技术启示与 RAG 的演进方向

1. 三条关键技术启示

(1)协议优于框架

长期来看,定义标准协议比构建封闭框架更具生命力。

(2)配置优于代码,但需明确边界

通用、确定性的系统行为适合配置化,特殊逻辑仍需通过代码实现。

(3)可观测性是生产级 RAG 的关键能力

RAG 系统不仅要"能跑",还需要"可解释、可调试、可优化"。

2. 从离线索引到 MCP-based 实时 RAG

RAG 技术正经历从离线索引向实时工具调用的重要转变。

传统 RAG 模式依赖预构建向量索引,存在知识更新滞后与维护成本高的问题。

基于 MCP 的实时 RAG 模式中,模型可以直接通过工具调用实时文档服务:

  • 无需预建索引
  • 知识始终保持最新
  • 维护成本显著降低

在这一趋势下,文档网站本身将逐步演进为 MCP Server。

3. 面向未来的三个发展趋势

  • Agent-based RAG: 由 Agent 动态决策何时、如何检索

  • 知识图谱融合: 结合向量语义能力与关系推理能力

  • 个性化 RAG: 根据用户行为动态调整检索与生成策略

这些趋势共同指向一个方向:

RAG 正在从静态系统,演进为动态、智能、可演进的知识基础设施。

Demo演示

UR-v2 的使用流程主要包括以下三个阶段:

  • 编写 Pipeline 配置文件
  • 编译 Pipeline 并调整参数
  • 运行 Pipeline

此外,还可以通过可视化工具对运行结果进行分析与评估。

数据: 使用 ultrarag 提供的10条样例数据

嵌入编码: MiniCPM-Embedding-Light

生成答案模型: Qwen3-8B

最终准确率: 10%

Step 1:编写 Pipeline 配置文件

在examples文件夹中创建并编写 Pipeline 配置文件:

diff 复制代码
servers:
  benchmark:servers/benchmark
  retriever:servers/retriever
  prompt:servers/prompt
  generation:servers/generation
  evaluation:servers/evaluation
  custom:servers/custom

pipeline:
-benchmark.get_data
-retriever.retriever_init
-retriever.retriever_embed
-retriever.retriever_index
-retriever.retriever_search
-generation.generation_init
-prompt.qa_rag_boxed
-generation.generate
-custom.output_extract_from_boxed
-evaluation.evaluate

UR-v2 的 Pipeline 配置文件需要包含以下两个部分:

  • servers:声明当前流程所依赖的各个模块(Server)。例如,检索阶段需要使用 retriever Server。

  • pipeline:定义各 Server 中功能函数(Tool)的调用顺序。本示例展示了从数据加载、检索编码与索引构建,到生成与评测的完整流程。

Step 2:编译 Pipeline 并调整参数

在运行代码前,首先需要配置运行所需的参数。UR-v2 提供了快捷的 build 指令,可自动生成当前 Pipeline 所依赖的完整参数文件。 系统会读取各个 Server 的 parameter.yaml 文件,解析本次流程中涉及的全部参数项,并统一汇总生成到一个独立的配置文件中。执行以下命令:

arduino 复制代码
printf("hello world!");

执行后,终端将输出如下内容:

系统会在examples/parameters/文件夹下生成对应的参数配置文件。打开文件后,可根据实际情况修改相关参数,例如:

vbnet 复制代码
benchmark:
benchmark:
# key_map:定义数据字段的映射关系,将数据集中字段名映射为标准字段
key_map:
gt_ls:golden_answers# 答案字段名
q_ls:question# 问题字段名
limit:-1# 限制加载样本数量,-1 表示加载全部
name:nq# 数据集名称(如 Natural Questions)
path:data/sample_nq_10.jsonl# 数据文件路径
seed:42# 随机种子,保证实验可复现
shuffle:false# 是否打乱样本顺序,false 表示按原顺序加载

custom: {}                    # 自定义 Server,此处为空(当前函数无参数)

evaluation:
# metrics:指定评测指标,可按需增删
metrics:
-acc# 准确率(Accuracy)
-f1# F1 值
-em# Exact Match
-coverem# 覆盖率式 Exact Match
-stringem# 字符串级匹配
-rouge-1# Rouge-1 指标
-rouge-2# Rouge-2 指标
-rouge-l# Rouge-L 指标
save_path:output/evaluate_results.json# 评测结果保存路径

generation:
backend:vllm# 推理后端,可选 vllm / openai / hf
backend_configs:
hf:# HuggingFace 本地推理配置
batch_size:8
gpu_ids:2,3
model_name_or_path:openbmb/MiniCPM4-8B
trust_remote_code:true# 允许加载带自定义代码的模型
openai:# OpenAI API 推理配置
api_key:''# OpenAI API 密钥
base_delay:1.0# 重试间隔时间(秒)
base_url:http://localhost:8000/v1
concurrency:8# 并发请求数
model_name:MiniCPM4-8B
retries:3# 最大重试次数
vllm:# vLLM 推理引擎配置
dtype:auto# 自动选择精度(如 fp16/bf16)
gpu_ids:2,3# 指定 GPU ID
gpu_memory_utilization:0.9# GPU 显存利用率上限
model_name_or_path:openbmb/MiniCPM4-8B
model_name_or_path:Qwen/Qwen3-8B
trust_remote_code:true
sampling_params:# 采样参数(影响生成多样性)
chat_template_kwargs:
enable_thinking:false# 是否启用思维链模式
max_tokens:2048# 最大生成长度
temperature:0.7# 温度系数(越高越随机)
top_p:0.8# nucleus sampling 阈值
system_prompt:''# 系统提示词(可留空)

prompt:
template:prompt/qa_boxed.jinja
template:prompt/qa_rag_boxed.jinja# 使用的 Prompt 模板路径(Jinja 格式)

retriever:
backend:sentence_transformers# 向量化后端,可选 sentence_transformers / infinity / openai
backend_configs:
infinity:# Infinity-Emb 推理配置
bettertransformer:false
device:cuda
model_warmup:false
pooling_method:auto
trust_remote_code:true
openai:# OpenAI Embedding API 配置
api_key:''
base_url:https://api.openai.com/v1
model_name:text-embedding-3-small
sentence_transformers:# SentenceTransformers 本地配置
device:cuda
sentence_transformers_encode:
encode_chunk_size:10000# 每批编码文本数量
normalize_embeddings:false# 是否归一化嵌入向量
psg_prompt_name:document# passage 编码提示词名称
psg_task:null# passage 任务类型
q_prompt_name:query# query 编码提示词名称
q_task:null# query 任务类型
trust_remote_code:true
batch_size:16# 向量化批大小
corpus_path:data/corpus_example.jsonl# 语料库路径
embedding_path:embedding/embedding.npy# 向量保存路径
faiss_use_gpu:true# 是否启用 GPU 加速的 Faiss
gpu_ids:0,1# 指定 GPU 设备
index_chunk_size:50000# 每批构建索引的文档数
index_path:index/index.index# 索引文件保存路径
is_multimodal:false# 是否为多模态检索(图文混合)
model_name_or_path:openbmb/MiniCPM-Embedding-Light
model_name_or_path:Qwen/Qwen3-Embedding-0.6B# 向量化模型路径
overwrite:false# 是否覆盖已有 embedding / index
query_instruction:''# query 前置指令(可为空)
top_k:5# 检索返回的 Top-K 文档数

可以根据实际情况修改参数,例如:

  • 将 template 调整为RAG模版 prompt/qa_rag_boxed.jinja;
  • 替换检索器与生成器的 model_name_or_path 为本地下载的模型路径;
  • 若在多 GPU 环境下运行,可修改 gpu_ids 以匹配可用设备

Step 3:运行 Pipeline

当参数配置完成后,即可一键运行完整流程。执行以下命令:

arduino 复制代码
ultrarag run examples/rag_full.yaml

系统将依次执行配置文件中定义的各个 Server 与 Tool,并在终端中实时输出运行日志与进度信息:

运行结束后,结果(如生成内容、评测报告等)将自动保存在对应的输出路径中,如

/output/memory_nq_demo_rag_20251203_031625.json

可直接用于后续分析与可视化展示

可视化测评

在运行完成 yaml 文件后,系统会在 output 文件夹下自动生成一份 memory 日志文件,例如:

/output/memory_nq_demo_rag_20251203_031625.json 。

只需执行以下命令,即可启动 Case Study 可视化网站

css 复制代码
python ./script/case_study.py \
  --data output/memory_nq_demo_rag_20251203_031625.json \
  --host 0.0.0.0 \
  --port 8080 \
  --title "Case Study Viewer"

可视化测评界面:

包含具体的 RAG 执行步骤,以及各个步骤执行结果

检索回的内容:

拼接后的prompt:

模型输出内容:

结语

UltraRAG 仍处于早期发展阶段,但其所代表的方向已经十分清晰:

  • 在架构层面,强调协议化与模块化

  • 在工程层面,强调配置驱动与可观测性

  • 在系统形态上,走向实时化与工具化

对于正在构建或规划下一代 RAG 系统的团队而言,UltraRAG 与 MCP 所提供的思路,具有重要的参考价值。

相关推荐
TTGGGFF3 小时前
控制系统建模仿真(四):线性控制系统的数学模型
人工智能·算法
UXbot3 小时前
UI设计工具推荐合集
前端·人工智能·ui
kicikng3 小时前
智能体来了(西南总部)实战指南:AI调度官与AI Agent指挥官的Prompt核心逻辑
人工智能·prompt·多智能体系统
抓个马尾女孩3 小时前
为什么self-attention除以根号dk而不是其他值
人工智能·深度学习·机器学习·transformer
叫我辉哥e13 小时前
新手进阶Python:办公看板集成ERP跨系统同步+自动备份+AI异常复盘
开发语言·人工智能·python
Loo国昌3 小时前
【LangChain1.0】第五阶段:RAG高级篇(高级检索与优化)
人工智能·后端·语言模型·架构
伊克罗德信息科技3 小时前
技术分享 | 用Dify搭建个人AI知识助手
人工智能
TOPGUS3 小时前
谷歌发布三大AI购物新功能:从对话式搜索到AI代你下单
大数据·人工智能·搜索引擎·chatgpt·谷歌·seo·数字营销
Godspeed Zhao3 小时前
从零开始学AI4——背景知识3
人工智能