InfiniFlow 开源 RAG 引擎 — 后端 Python + Go 双语言技术架构深度分析
RAGFlow 采用 Python 后端 + Go 微服务的混合架构,Python 负责 RAG 核心(解析/分块/向量化/检索/对话/Agent),Go 负责 API 网关/任务调度/数据持久化。
三个独立可执行服务 + 一个 CLI 工具,采用 Handler → Service → DAO 三层架构。
gin.H{"code":..., "data":..., "message":...}| 领域 | Handler | Service | DAO |
|---|---|---|---|
| 用户 | UserHandler | UserService | UserDAO |
| 租户 | TenantHandler | TenantService | TenantDAO, UserTenantDAO |
| 文档 | DocumentHandler | DocumentService | DocumentDAO |
| 分块 | ChunkHandler | ChunkService | DocEngine |
| 知识库 | KBHandler / DatasetsHandler | KBService / DatasetService | KbDAO |
| 对话 | ChatHandler / ChatSessionHandler | ChatService / ChatSessionService | ChatDAO, ChatSessionDAO |
| LLM | LLMHandler / ProvidersHandler | LLMService / ModelProviderService | LLMDAO, TenantLLMDAO |
| 搜索 | SearchHandler | SearchService | SearchDAO |
| 文件 | FileHandler | FileService | FileDAO |
| 记忆 | MemoryHandler | MemoryService | MemoryDAO |
| 连接器 | ConnectorHandler | ConnectorService | ConnectorDAO |
| 系统 | SystemHandler | SystemService | APITokenDAO |
| 实体 | 表名 | 关键字段 |
|---|---|---|
| User | user | AccessToken, Email, Password(PBKDF2), IsActive, IsSuperuser, RoleID |
| Tenant | tenant | LLMID, EmbdID, ASRID, RerankID, ParserIDs, Credit |
| Knowledgebase | knowledgebase | TenantID, EmbdID, ParserID, SimilarityThreshold, VectorSimilarityWeight |
| Document | document | KbID, ParserID, TokenNum, ChunkNum, Progress, Status |
| Chat (Dialog) | dialog | LLMID, LLMSetting, PromptConfig, KBIDs, SimilarityThreshold |
| ChatSession | conversation | DialogID, Message(json), Reference(json) |
| TenantLLM | tenant_llm | TenantID, LLMFactory, APIKey, APIBase, MaxTokens, UsedTokens |
| File | file | ParentID, TenantID, Name, Type, Location |
| APIToken | api_token | TenantID, Token, DialogID, Source |
| Memory | memory | TenantID, MemoryType, StorageType, EmbdID, LLMID |
| 解析器 | 适用场景 | 核心特点 |
|---|---|---|
| naive | 通用文档 | 支持 PDF/DOCX/TXT/MD/HTML/Excel/EPUB/JSON,7 种 PDF 引擎(DeepDOC/MinerU/Docling/PaddleOCR/TCADP/OpenDataLoader/VisionParser) |
| book | 书籍 | 按章节分块 |
| laws | 法律文件 | 按条款分块 |
| paper | 学术论文 | 结构化提取 |
| manual | 技术手册 | 按章节+表格 |
| qa | Q&A 格式 | 问答对提取 |
| table | 表格数据 | 表格结构化 |
| resume | 简历 | LLM 驱动字段提取 |
| presentation | PPT | 幻灯片解析 |
| picture | 图片 | Vision LLM 描述 |
| one | 整文档 | 单块输出 |
| audio | 音频 | ASR 转文字 |
| 邮件 | 邮件结构解析 |
{component_id@output_key} / {sys.query} / {env.var_name}DocumentHandler 接收上传 → FileService 存储(MinIO/S3/OSS)→ DocumentDAO 创建记录 → TaskDAO 创建解析任务
Go 端写入 Redis Stream → Python TaskExecutor 消费者组读取 → LoopLocalSemaphore 并发控制
按文件类型选择解析器 → OCR + 布局识别(XGBoost/ONNX) + 表格提取 → 输出 sections + tables
naive_merge 分块 → tokenize_chunks 生成 token 化结果 → rag_tokenizer 中文分词
Embedding 模型批量向量化(标题权重混合)→ insert_chunks 插入 ES/Infinity → 更新文档统计
GraphRAG(实体/关系提取 + 社区检测)/ RAPTOR(层次摘要)/ 记忆保存
ChatHandler / chat_api 接收问题 → 加载 Dialog 配置(LLM 设置、Prompt、相似度阈值、知识库列表)
中文分词(rag_tokenizer)→ 同义词扩展(Redis/WordNet)→ 词权重计算(TF-IDF)→ MatchTextExpr
向量检索(MatchDenseExpr)+ 全文检索(MatchTextExpr)→ RRF 融合 → 结果过滤 → 可选 Rerank
query_rewrite 查询改写 → 实体检索 → N-hop 关系扩展 → 与向量检索结果融合
检索结果 + Prompt 模板 → LLM 生成回答(含引用标注)→ 流式输出 → 保存会话历史
从 UserCanvas 读取 DSL JSON → 初始化组件实例 → 设置全局变量(query, user_id, files)
Begin → LLM/Retrieval/Tool → Categorize/Switch 分支 → Message 输出 → _run_batch 并行同层组件
LLM 生成 tool_calls → LLMToolPluginCallSession 执行 → retrieval/Google/Code Exec/ExeSQL 等 → MCP 工具
Message 组件流式输出 + TTS → 记录历史/引用 → 可选记忆保存(LLM 提取 → 分类存储 → 遗忘策略)
Go 负责 API 网关/认证/持久化/任务调度(高性能),Python 负责 RAG 核心/解析/检索/Agent(生态丰富)。通过 Redis Stream 和共享数据库协作,Token 签名/密码格式兼容 Python。
DocEngine 接口(ES/Infinity)、Storage 接口(MinIO/S3/OSS)、PDF 解析引擎(7种)、沙箱执行器(5种),工厂模式统一创建,运行时可切换。
向量检索 + 全文检索 + RRF 融合 + 可选 Rerank + 知识图谱检索。Dealer 统一编排多种检索策略,结果去重融合。
Go 端 Handler → Service → DAO 严格分层,每个领域独立封装。Python 端 API → Service → DB Service 对应分层。
Agent Canvas 基于 JSON DSL 定义工作流,DAG 拓扑执行,组件间变量引用传递,支持分支/循环/迭代/工具调用。
TenantID 贯穿所有数据模型,UserTenant 多对多关系。模型配置、Token 用量、文件存储均按租户隔离。
Redis Stream 消费者组任务队列,LoopLocalSemaphore 多级并发控制,Ingestion Worker gRPC 双向流注册,心跳监控 + 指数退避重连。
基础分块 → RAPTOR 层次摘要 → GraphRAG 知识图谱 → 记忆系统,四级知识增强层层递进,按需启用。