当前位置: 首页 > news >正文

别再把 RAG 当向量库外挂:RAGFlow 的总体架构,给了一个更真实的答案

先把那张“过于简单”的 RAG 架构图放一放很多人对 RAG 的第一印象仍然停留在一张非常简洁的架构图里前端负责提问后端负责调度向量库负责检索大模型负责回答。这张图当然没有错。它适合解释 RAG 的基本原理也足够让人快速理解“检索增强生成”这件事。但问题在于一旦系统从 Demo 走向真实业务这张图就开始不够用了。真实世界里的知识并不会乖乖地躺在一段段干净文本里。它可能藏在 PDF 的版面结构里夹在 Word 的表格中散落在 PPT 的图文关系里也可能来自扫描件、网页、Excel、图片、知识图谱、多语言查询、Agent 工具调用、MCP 协议接入甚至来自用户长期对话沉淀下来的 Memory。这时候RAG 就不再是“模型外挂一个向量库”那么简单。RAGFlow 值得拿来分析正在于它把这个问题摊开了。它对自己的定位已经不是一个狭义的“检索问答工具”而是一个面向 LLM 的 context layer文档理解、模板化切块、可追溯引用、异构数据接入、多路召回、融合重排、Agent 编排、Memory、MCP这些能力共同组成了它的系统边界。如果再看 RAGFlow 当前 main 分支的目录结构这种边界会更加清楚api、deepdoc、rag、agent、memory、mcp、web、docker、sdk/python 等模块并不是简单的功能堆叠而是在把一个生产级 RAG 引擎拆成不同职责的子系统。这也是为什么我认为RAGFlow 很适合作为这个系列的切入口。它不只是“功能很多”更重要的是它把许多真正决定生产可用性的部分暴露在了源码和部署结构里文档理解、异步任务执行、文档引擎、对象存储、会话与锁、Agent 运行时、Memory、MCP、SDK 接入、管理平面几乎都能在官方文档和仓库目录中找到对应位置。所以这篇文章不会急着进入 chunking、Hybrid Retrieval 或 Agent component 的细节。作为总览篇它更应该先回答一个底层问题一个生产级 RAG 引擎系统边界到底应该画到哪里哪些部分属于在线服务哪些部分属于离线加工哪些部分又是面向 Agent 和外部系统的运行时扩展面只有先把这张大图看清楚后面再去读 RAGFlow 的文档解析、索引构建、混合检索、GraphRAG、RAPTOR、Agent 与 Memory才不会把它们误解成一堆孤立的功能点。RAGFlow 的系统边界如果用一句话概括 RAGFlow 的边界它不是“一个模型服务”而是“一个上下文生产与消费平台”。平台的外侧是用户、文档、在线数据源、第三方应用与外部 Agent 客户端平台的内侧是 API Server、Task Executor、Document Parser/DeepDoc、RAG Core、Agent Runtime、Memory、MCP以及支撑它们运行的文档引擎、关系数据库、对象存储、缓存/锁服务。官方文档与部署配置明确把 Elasticsearch/Infinity、MySQL、MinIO、Redis 列为核心依赖Admin Service 文档还说明它负责监控 MySQL、Elasticsearch、Redis、MinIO 等关键组件的状态这意味着这些组件不是“可有可无的外挂”而是系统边界的组成部分。这张图不想画成一张“源码调用栈”。因为如果真按函数调用一层层画下去图很快就会变成一团线大家反而看不清 RAGFlow 的整体结构。所以这里画的是一张主链路图它参考了当前 main 分支的目录结构、几个关键入口文件以及官方文档里已经明确说明的组件关系。有些部分现在已经比较清楚。比如api/apps/__init__.py负责创建 Quart 应用并把_app.py、restful_apis/*.py、sdk/*.py这些路由动态注册进来api/ragflow_server.py负责初始化数据库、加载运行配置并启动 HTTP 服务docker/launch_backend_service.sh会同时启动多个task_executor.pyworker 和主服务进程MCP server 在官方文档里也被单独定义为一个补充 RAGFlow server 的独立组件。但也有一些更细的调用链尤其是 Agent 运行时里某个组件如何继续下探到 rag 内部再如何把结果交给 Memory、Sandbox 或其他工具。先把这条主链路看明白之后RAGFlow 里几个容易混在一起的角色就清楚多了。Web UI 负责和用户交互API Server 是统一入口Task Executor 负责处理解析、切块、索引这类重活Dataset 定义知识范围和权限边界DeepDoc / Document Parser 负责把复杂文档拆成系统能理解的结构Retriever 不是简单地“查向量库”而是在运行时把多路召回结果组织成可用上下文LLM 提供生成、向量化、重排等模型能力Agent 则在这些能力之上继续做流程编排、工具调用、Memory 引入和 Sandbox 执行。所以RAGFlow 不是把一堆功能并排放在一起而是围绕“原始数据如何变成可消费上下文”搭出了一条分层流水线。两条主链路数据写入链路只有把“写入链路”和“查询链路”分开看才能真正理解 RAGFlow。在写入侧官方 HTTP API 明确把“上传文档”和“解析文档”拆成两个动作先向 /api/v1/datasets/{dataset_id}/documents 上传文件再向 /api/v1/datasets/{dataset_id}/chunks 触发解析。上传后的原始文件存放在 MinIO 中而解析与索引相关的重量级工作则通过 Task Executor 完成。docker/launch_backend_service.sh 可以直接看到系统会并行启动多个 rag/svr/task_executor.py worker再启动 api/ragflow_server.py这说明 ingestion 从一开始就被设计成与在线请求解耦的异步数据平面。把这条链路再往里拆Task Executor 不是一个“黑箱队列消费者”它在源码里已经暴露出很强的架构含义。rag/svr/task_executor.py 中可以直接看到 init_kb、embedding、run_dataflow 等入口更关键的是run_dataflow 会从 UserCanvasService 读取 pipeline DSL然后实例化 rag.flow.pipeline.Pipeline 运行。这一点和 v0.21.0 release notes 中“Orchestratable ingestion pipeline”的表述完全对上RAGFlow 后来的 ingestion pipeline 不是另起炉灶而是把数据摄取当成可编排的图执行流程来落地。因此高层“数据写入链路”可以概括成这样原始文件 / URL / 数据源 → API Server → Dataset / Document 元数据落库 → 原件入 MinIO → Task Executor → DeepDoc / Parser → Chunker / Transformer / Indexer → Embedding / GraphRAG / RAPTOR 等增强 → 文档引擎写入同时保留 metadata / citation 所需信息。这条链路之所以重要是因为 RAGFlow 后续几乎所有“回答质量”能力都依赖它TOC、image table context window、auto-keyword、auto-question、auto-metadata、tag set、knowledge graph、RAPTOR本质上都发生在写入期或者依赖写入期产物。DeepDoc 在这里扮演的是“文档感知层”而不是简单文件读取器。它的 vision 模块覆盖 OCR、layout recognition、TSRparser 模块面向 PDF、DOCX、EXCEL、PPT 等格式。更关键的是官方 DeepDoc README 明确写到PDF parser 的输出不仅是文本还包括页码与矩形位置信息、表格裁剪图与自然语言化内容、图像与 caption 关系。这也是为什么 RAGFlow 能把 grounded citations 当成主打能力之一要做可追溯引用前提不是“回答里加个脚注”而是 ingest 时就没有丢文档结构。此外自 v0.17.0 起OCR/TSR/DLR 等视觉解析能力已与 chunking method 解耦这也是生产级系统才会认真做的边界切分。查询生成链路查询侧则是另一条完全不同的链路。它是一个单轮 AI 对话采用预定义 retrieval strategy也就是 weighted keyword similarity weighted vector similarity 的 hybrid search而 AI Chat/Agent Runtime 则允许配置 similarity threshold、vector weight、Top N、multi-turn optimization、cross-language search、rerank model、knowledge graph 等参数。没有 rerank 时是关键词分数与向量相似度混合有 rerank 时则是关键词分数与 rerank score 混合如果开启 knowledge graph又会进入实体、关系、community report 的另一套召回路径。所以高层“查询生成链路”应该写成这样用户问题 → Web / API / SDK / OpenAI-Compatible API / MCP → API Server / Agent Runtime → query understanding 或多轮优化 / 跨语言改写 / metadata 条件 → hybrid retrieval / rerank / GraphRAG / tag / TOC / image-table context window 等信号参与召回 → Top N context assembly → LLM generation → reference / citation → Web / API / SDK / MCP 输出。这里最容易被忽略的一点是Retriever 在生产级 RAG 里不是数据库适配器而是上下文装配器。它要决定查什么、查多少、按什么权重混合、哪些结果进入 prompt、哪些结果该剔除。rag 目录本身也在证明这一点。当前 main 分支下它并不止有一个 llm 包而是同时出现了 flow、graphrag、llm、nlp、prompts、raptor.py、advanced_rag 等结构其中 rag/llm 下又独立拆出了 chat_model.py、embedding_model.py、rerank_model.py、ocr_model.py、cv_model.py、sequence2txt_model.py 等适配层。这说明在 RAGFlow 的语义里“大模型能力”从来不只等于 chat model而是一个覆盖 chat、embedding、rerank、OCR、视觉、语音等多类模型的统一抽象层。更进一步看GraphRAG 与 RAPTOR 也被明确纳入运行时检索逻辑knowledge graph 相关 chunks 作为独立 chunk 参与检索官方 GraphRAG 文档说明这些图谱实体、关系和 community report 最终仍存入 document enginerag/raptor.py 里则能看到 cluster、summarization、layers 这些实现细节以及“需要显著内存、计算、token 成本”的官方提醒。最后Agent、Memory、MCP 把查询链路继续往系统边界外推。官方 Agents 文档把 Agent 定义为“前端无代码工作流编辑器 后端图式任务编排框架”v0.20.0 release notes 又说明 Agent 与 Workflow 已经统一编排并支持 multi-agent、planning、reflection、MCP importMemory 文档则明确区分 raw logs、semantic memory、episodic memory、working memoryMCP 文档还把 RAGFlow MCP server 定义为独立组件用于把 RAGFlow 的 datasets 以标准协议暴露给外部客户端。到这里RAG 引擎已经不只是“知识库问答系统”而是一个面向 Agent 运行时的 context infrastructure。源码目录怎么映射到架构层下面这张表是按系统职责做映射。源码目录架构层作用web展示层用户 Web UI 与 /admin 管理入口的前端工程README 给出了用户端和管理端访问路径package.json 显示该前端已迁移到 Vite并使用 React、react-router、tanstack/react-query 等依赖。api服务接入与控制层api/apps 负责动态注册 _app.py、restful_apis、sdk 路由api/ragflow_server.py 负责初始化数据库、运行时配置、插件并启动 HTTP 服务api/db 则承载模型、初始化数据与服务层。rag/svr后台执行层docker/launch_backend_service.sh 会并行启动多个 task_executor.py workerrag/svr/task_executor.py 里能看到 init_kb、embedding、run_dataflow 等 ingestion 关键入口。deepdoc文档理解层目录分成 vision 与 parser前者覆盖 OCR、layout、TSR后者负责 PDF、DOCX、EXCEL、PPT 等解析输出保留版面位置、表格、图像等结构信息。rag检索与上下文工程核心层根目录下包含 llm、flow、graphrag、nlp、prompts、raptor.py、advanced_rag 等模块对应模型适配、检索逻辑、Pipeline 执行、GraphRAG、RAPTOR 与 prompt 组织。agent运行时编排层目录包含 component、plugin、sandbox、templates、tools、canvas.py官方文档把它定义为无代码编辑器与图式任务编排框架的结合。memory记忆层目录下的 services、utils 对应 Memory 功能官方 docs 说明它管理 raw logs、semantic、episodic、working memory并支撑后续对话的上下文回流。mcp外部协议层目录拆分为 client 与 server官方文档明确 MCP server 是一个独立组件用来补充 RAGFlow server对接外部 MCP client。sdk/python集成层目录里有 ragflow_sdk 包与示例脚本官方 Python API 文档要求通过 pip install ragflow-sdk 使用属于面向系统外部集成的开发者入口。docker部署与基础设施层docker-compose.yml、.env、service_conf.yaml.template、docker/README.md 明确声明了 RAGFlow 与 document engine、MySQL、MinIO、Redis、Admin、MCP 等组件的启动与配置关系。这里还有一个特别值得强调的点Dataset 并不对应一个独立顶级目录。它更像一个横切的领域边界贯穿 api 的资源模型与权限、deepdoc 的解析配置、rag 的索引与检索范围、以及对象存储中的原始文件组织。官方 Python API 里创建 dataset 时就已经要求指定 chunk_method 与 parser_configHTTP API 中上传文档、解析文档、构建 GraphRAG、构建 RAPTOR又全部以 dataset 为操作边界。工程判断、阅读路径RAG 引擎为什么不能被看成一个“模型服务”到这里其实已经有了非常清楚的答案。第一它有明显不同的计算剖面。在线问答追求低时延而文档解析、OCR、布局识别、embedding、GraphRAG、RAPTOR、TOC、metadata 抽取这些写入期任务追求的是吞吐、稳定和可恢复。官方部署配置把 DOC_BULK_SIZE 与 EMBEDDING_BATCH_SIZE 单独暴露出来RAPTOR、knowledge graph、rerank、多轮优化也都在文档里被明确标注为会增加内存、计算、token 或时延成本。把这些活和 HTTP 在线服务硬塞进同一个“模型推理进程”最终一定会让系统同时丢掉吞吐和稳定性。第二它有明显不同的存储责任分工。MySQL 用于系统级业务数据与配置MinIO 保存原始上传文件Redis 提供 session、缓存或分布式锁能力文档引擎负责混合检索Admin Service 还要监控这些组件的健康状态。尤其是检索后端官方 FAQ 直接说了目前只有 Elasticsearch 与 Infinity 能满足 RAGFlow 的 hybrid search 要求因为很多开源向量数据库缺少 full-text search、phrase search 和高级 ranking 能力。这个判断很关键生产级 RAG 的底座不是“有向量库就行”而是“要有能支撑上下文工程的 document engine”。第三它有明显不同的运行时上下文来源。如果上下文只来自 datasetChat 也许已经够用但当上下文还来自 Memory、Tool、Sandbox、MCP、外部数据源甚至多 Agent 协作时系统就必须把检索从“查知识库”升级成“装配上下文”。这正是 RAGFlow 从 v0.20.0 以后不断把 Agent、MCP、Memory、ingestion pipeline 拉进同一套架构中的根本原因。源码阅读清单如果你准备继续往下读源码我建议按下面这个顺序而不是从rag/里随便找一个文件硬啃建议顺序入口为什么先看它第一站README.md先建立产品级心智模型RAGFlow 的定位、key features、system architecture、最近几个版本的演化方向都在这里有最高层说明。第二站docker/README.md、docker/.env、docker/service_conf.yaml.template、docker/docker-compose.yml这是“真实系统边界”最直白的地方。你会立刻知道 document engine、MySQL、MinIO、Redis、Admin、MCP、端口和运行参数之间的关系。第三站api/apps/__init__.py、api/ragflow_server.py、api/db/先把入口看懂。前者决定 API 怎么组织后者决定服务怎么启动api/db 决定业务资源、初始化与服务层边界。第四站rag/svr/task_executor.py这是 ingestion 真正落地的重心也是把“在线服务”和“离线加工”分开的证据文件。尤其要看 embedding、init_kb、run_dataflow。第五站deepdoc/README.md、deepdoc/parser/、deepdoc/vision/配合Select PDF parser文档这一组决定“文档是怎么被理解”的。先理解 OCR/layout/TSR 与 parser 输出你后面读 chunking、citation、图像表格召回才不会断层。第六站rag/llm/、rag/flow/、rag/graphrag/、rag/raptor.py配合Run retrieval test、Start AI chat、Construct knowledge graph文档这一组对应运行时的上下文工程。你会看到检索不是单一向量召回而是 hybrid retrieval、rerank、GraphRAG、RAPTOR 与 LLM 适配层的协作。第七站agent/、memory/、mcp/这是从“知识库 RAG”走向“Agent 上下文引擎”的扩展边界。先理解 Agent canvas、Memory 类型、MCP server/client 的角色再看具体 component 才不容易迷路。第八站web/与sdk/python/最后再回到产品表层看 UI 怎样暴露这些能力看 SDK 怎样把系统开放给外部应用。关键结论生产级 RAG 引擎的本体不是chat_model.py而是“上下文生产系统”。RAGFlow 的 README、目录结构与 release notes 都在指向同一个方向deep document understanding、hybrid retrieval、citation、Agent、Memory、MCP共同定义了它的系统价值。RAGFlow 的核心边界可以分成接入层、控制层、离线加工层、在线检索生成层和基础设施层。Web/UI、API Server、Task Executor、DeepDoc、RAG Core、Agent、Memory、MCP 与 MySQL/MinIO/Redis/document engine 之间并不是并列功能而是分层协作关系。写入链路和查询链路必须分开理解。写入链路解决“原始数据如何变成可检索上下文”查询链路解决“用户问题如何变成高质量 prompt context”。二者相互连接但不应混成一条线。Dataset 是知识与权限边界Task Executor 是数据加工车间Retriever 是上下文装配器Agent 是运行时编排器。这四个角色一旦分清RAGFlow 的目录就不再像“功能堆砌”而更像一套有明确职责的生产系统。RAG 引擎之所以不是单一模型服务是因为它必须同时解决异步加工、混合检索、原件留存、状态管理、协议开放与运行时扩展。这也是为什么官方会把 Elasticsearch/Infinity、MySQL、MinIO、Redis、Admin Service、MCP、Sandbox 这些组件都显式放进 docs 和部署配置里。学AI大模型的正确顺序千万不要搞错了2026年AI风口已来各行各业的AI渗透肉眼可见超多公司要么转型做AI相关产品要么高薪挖AI技术人才机遇直接摆在眼前有往AI方向发展或者本身有后端编程基础的朋友直接冲AI大模型应用开发转岗超合适就算暂时不打算转岗了解大模型、RAG、Prompt、Agent这些热门概念能上手做简单项目也绝对是求职加分王给大家整理了超全最新的AI大模型应用开发学习清单和资料手把手帮你快速入门学习路线:✅大模型基础认知—大模型核心原理、发展历程、主流模型GPT、文心一言等特点解析✅核心技术模块—RAG检索增强生成、Prompt工程实战、Agent智能体开发逻辑✅开发基础能力—Python进阶、API接口调用、大模型开发框架LangChain等实操✅应用场景开发—智能问答系统、企业知识库、AIGC内容生成工具、行业定制化大模型应用✅项目落地流程—需求拆解、技术选型、模型调优、测试上线、运维迭代✅面试求职冲刺—岗位JD解析、简历AI项目包装、高频面试题汇总、模拟面经以上6大模块看似清晰好上手实则每个部分都有扎实的核心内容需要吃透我把大模型的学习全流程已经整理好了抓住AI时代风口轻松解锁职业新可能希望大家都能把握机遇实现薪资/职业跃迁这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
http://www.zskr.cn/news/1398342.html

相关文章:

  • 美团面试官:为什么有时候选择「手搓」Agent,而不是直接用成熟框架?
  • FunASR模型文件到底藏哪儿了?手把手教你本地化部署与版本管理(Windows/macOS/Linux)
  • 告别GPIO模拟时序!用STM32的FSMC外设驱动TFTLCD,为什么又快又省事?
  • ArcGIS Pro二次开发:用C#代码玩转图层(Layer)的11个实用技巧(附工程源码)
  • 别再复制粘贴了!手把手教你从零写一个能用的.gitlab-ci.yml(附避坑清单)
  • 告别U盘和光盘:用清华同方同传软件给老旧电脑实验室做系统备份与还原
  • 图解First-Fit算法:手把手带你实现ucore Lab 2的物理内存分配器
  • 基于CLIP与BERT的多模态假新闻检测:特征对齐与层次化融合实战
  • Burp Suite Sequencer 深度解析:从token结构识别到业务逻辑逆向
  • Tomcat请求解析歧义漏洞深度解析:Host污染与路径逃逸协同利用
  • Tableau饼图设计原理与业务可信度实践指南
  • Frida Hook JNI动态注册函数的三大实战路径
  • 07.Day 7:植入顶级大脑 —— PEAK 框架与多维 ABLE 假设工程
  • SQL去重不是删数据,而是数据治理决策链
  • O4-Mini轻量大模型API实战:边缘部署与工业诊断落地指南
  • GNURadio实战:一台电脑插两个RTL-SDR电视棒,同时收听不同FM电台的完整配置流程
  • AI集成实战指南:从战略规划到持续运维的避坑与落地
  • 工业机器人少样本故障诊断:PTFM时频混合与原型学习实战
  • 数据管道静默失败监控:从数据质量到业务价值的全方位防御体系
  • 探索型与执行型AI智能体:设计哲学、技术实现与协同工作流
  • 从iris数据集实战出发:手把手教你用Python+sklearn玩转KMeans聚类与t-SNE可视化
  • 跨模态Transformer模型:成像测井图像与常规测井曲线的特征融合及岩性分类
  • 保姆级教程:用yum downloadonly搞定Docker离线包,一份包适配麒麟V10/CentOS 8
  • PlayIntegrityFix终极指南:简单三步解决Android设备认证难题
  • EEG微状态序列分析新范式:用NLP词嵌入技术解码大脑动态语法
  • 从地理空间数据云到可游玩地图:一份给独立开发者的真实世界地形创建全流程指南
  • 观察使用Taotoken后API调用的成功率和响应时间变化
  • NVIDIA Profile Inspector技术深度解析:驱动程序配置管理架构与实践指南
  • 情感分析实战:用Python和jieba给你的微博评论自动‘打标签’(附完整代码与词典)
  • 揭秘进程管理:从PID到PCB全解析