前言
最近完成了一个基于 RAGFlow + LangChain 的企业知识库智能问答系统。这篇文章对项目的整体架构、技术选型和模块划分做一个总览,后续文章会逐一深入每个模块的实现细节。
技术栈
| 知识库引擎 | RAGFlow SDK |
| LLM 框架 | LangChain |
| 模型服务 | 通义千问 (DashScope API) |
| 后端框架 | FastAPI |
| 数据库 | MongoDB (会话记忆持久化) |
| 前端 | Vue 3 + Element Plus + Vite |
整体架构
┌─────────────────────────────────────┐
│ Vue.js 前端 (ui/) │
│ Element Plus + EventSource 流式 │
└──────────────┬──────────────────────┘
│ HTTP / SSE
┌──────────────▼──────────────────────┐
│ FastAPI 接口层 (api/) │
│ 路由、CORS、请求模型、流式响应 │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ 核心调度层 (output/) │
│ 会话管理、处理器缓存、流式转发 │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ LangChain 工具层 │
│ ┌─────────┬──────────┬──────────┐ │
│ │ 意图识别 │ 处理链 │ 记忆管理 │ │
│ │ intent │ chains │ memory │ │
│ └─────────┴──────────┴──────────┘ │
└──────────────┬──────────────────────┘
│
┌──────────────▼──────────────────────┐
│ RAGFlow 集成层 │
│ ┌─────────┬──────────┬──────────┐ │
│ │会话管理 │ 助手选择 │ 知识检索 │ │
│ └─────────┴──────────┴──────────┘ │
│ RAGFlow 知识库引擎 │
└─────────────────────────────────────┘
模块职责
api/ — 接口层
-
main.py: FastAPI 应用定义,提供 /api/chat(普通)和 /api/chat/stream(SSE 流式)两个聊天接口,以及 /api/memory/clear 清除会话记忆
-
run_api.py: 启动脚本
output/ — 调度层
-
main_service.py: 管理多个会话的处理器实例(字典缓存),对外暴露 get_response() 流式生成器和 clear_session_memory() 清理函数
Langchain_utils/ — 智能处理层
-
intent.py: 意图识别,使用 LangChain tool-calling 判断用户是想查知识库还是闲聊
-
chains.py: 两条处理链——知识库链(检索增强生成)和通用对话链(纯 LLM 回答)
-
memory.py: 基于 MongoDB 的对话记忆持久化
-
processor.py: 统一处理器,串联记忆加载 → 意图识别 → 链选择 → 流式输出
-
config.py: MongoDB 连接配置
RAGFlow_mcp/ — RAGFlow 集成层
-
chat.py: 对外极简封装,提供 RAGFlow_chat() 和 get_assistants()
-
handler.py: 分析用户输入的意图(查列表/指定助手/自动选择),路由到对应工具
-
tool.py: 三种工具——列出助手、指定助手回答、自动选择助手回答
RAGFlow_utils/ — RAGFlow 底层工具
-
create_ask_delete.py: 创建临时会话 → 提问 → 获取答案 → 删除会话,用于单次查询
-
list_chat_assistant.py: 获取所有聊天助手及其关联知识库
-
query_enhancer.py: 查询增强,解决代词指代和上下文依赖问题
ui/ — 前端
-
Vue 3 + Element Plus,支持流式接收(EventSource)和普通请求两种模式
请求处理全流程
一个用户问题的完整处理链路:
用户输入问题
↓
FastAPI 接收请求(带 session_id)
↓
output/main_service 查找/创建该会话的 processor
↓
processor 加载 MongoDB 中的对话历史
↓
intent.detect_intent() 判断意图(knowledge_base / general_chat)
↓
根据意图选择 chain:
– knowledge_chain → 查询增强 → RAGFlow 检索 → LLM 总结
– general_chain → 直接 LLM 对话
↓
流式输出 chunk(SSE → 前端逐字渲染)
↓
对话存入 MongoDB 记忆
关键设计决策
为什么用临时会话模式? RAGFlow 原生会话会累积历史。项目采用"创建→提问→获取答案→删除"的单次模式,每次查询都是全新的临时会话,避免 RAGFlow 侧会话膨胀,由 LangChain 侧负责对话记忆管理。
为什么有两层意图识别?
-
RAGFlow_mcp/handler.py 识别用户想用哪个助手(第一层)
-
Langchain_utils/intent.py 识别用户是否需要查知识库(第二层)
两层分工不同:第一层做助手路由,第二层做知识库/闲聊二分类。
为什么模块拆得这么细? 每个模块职责单一,方便独立测试和修改。比如想换一个 LLM 服务商,只需改 chains.py 和 intent.py 中的模型初始化,不影响其他模块。
小结
本文梳理了"万象智识库"的整体架构和模块划分。核心思路是:FastAPI 做接口、LangChain 做编排、RAGFlow 做检索、MongoDB 做记忆。后续文章会逐一深入每个模块的实现细节。

