# Ragflow-Plus 开发指南
1. 目的与范围 #
本文档为 Ragflow-Plus 系统的开发指南,旨在帮助开发者理解系统架构、开发流程和最佳实践。本文档涵盖前端开发、后端服务架构、RAG 和 NLP 实现,以及基础设施和文档系统。
有关系统架构概述,请参阅 系统架构。有关 API 参考,请参阅 API 参考。
2. 系统架构概述 #
Ragflow-Plus 采用分层架构设计,包含前端层、API 层、服务层和数据存储层。
2.1 核心架构组件 #
系统核心架构组件包括:
┌─────────────────────────────────────────┐
│ 前端层 (Frontend Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ React │ │ Vue.js │ │ TypeScript│ │
│ │ (用户) │ │ (管理) │ │ │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘
↕
┌─────────────────────────────────────────┐
│ API 层 (API Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ Flask │ │ RESTful │ │ SSE │ │
│ │ (后端) │ │ API │ │流式 │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘
↕
┌─────────────────────────────────────────┐
│ 服务层 (Service Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ RAG引擎 │ │ NLP处理 │ │文档处理│ │
│ │ │ │ │ │ │ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘
↕
┌─────────────────────────────────────────┐
│ 数据存储层 (Storage Layer) │
│ ┌──────────┐ ┌──────────┐ ┌──────┐ │
│ │ MySQL │ │Elasticsearch│ │MinIO│ │
│ │ (元数据) │ │ (索引) │ │(文件)│ │
│ └──────────┘ └──────────┘ └──────┘ │
└─────────────────────────────────────────┘2.2 请求处理流程 #
请求处理流程如下:
- 前端请求:用户通过 React 或 Vue.js 前端发起请求
- API 路由:Flask 路由层接收请求并验证
- 服务处理:服务层执行业务逻辑
- 数据访问:数据访问层与存储系统交互
- 响应返回:处理结果通过 API 层返回前端
3. 前端开发 #
Ragflow-Plus 包含两个独立的前端应用:用户前端(React)和管理前端(Vue.js)。
3.1 用户前端架构 #
用户前端使用 React + TypeScript 构建,位于 web/src/ 目录。
3.1.1 项目结构 #
web/
├── src/
│ ├── pages/ # 页面组件
│ │ ├── chat/ # 聊天界面
│ │ ├── write/ # 文档编写
│ │ └── add-knowledge/ # 知识库管理
│ ├── components/ # 通用组件
│ ├── services/ # API 服务
│ ├── hooks/ # React Hooks
│ ├── utils/ # 工具函数
│ └── locales/ # 国际化文件
├── public/ # 静态资源
└── package.json # 依赖配置3.1.2 技术栈 #
- 框架:React 18+
- 语言:TypeScript
- 状态管理:React Context + Hooks
- 路由:React Router
- HTTP 客户端:Axios
- 国际化:react-i18next
- 样式:CSS Modules + Tailwind CSS
3.2 组件开发模式 #
3.2.1 函数组件模式 #
使用函数组件和 Hooks:
import React, { useState, useEffect } from 'react';
interface ChatProps {
knowledgeBaseId: string;
}
const ChatComponent: React.FC<ChatProps> = ({ knowledgeBaseId }) => {
const [messages, setMessages] = useState<Message[]>([]);
const [input, setInput] = useState('');
useEffect(() => {
// 加载对话历史
loadConversation(knowledgeBaseId);
}, [knowledgeBaseId]);
const handleSend = async () => {
// 发送消息逻辑
};
return (
<div className="chat-container">
{/* 聊天界面 */}
</div>
);
};3.2.2 自定义 Hooks #
创建可复用的自定义 Hooks:
// hooks/useChat.ts
export const useChat = (knowledgeBaseId: string) => {
const [messages, setMessages] = useState<Message[]>([]);
const [loading, setLoading] = useState(false);
const sendMessage = async (content: string) => {
setLoading(true);
try {
const response = await chatService.sendMessage({
knowledgeBaseId,
content
});
setMessages(prev => [...prev, response]);
} finally {
setLoading(false);
}
};
return { messages, sendMessage, loading };
};3.3 管理前端架构 #
管理前端使用 Vue.js + TypeScript 构建,位于 management/web/src/ 目录。
3.3.1 项目结构 #
management/web/
├── src/
│ ├── pages/ # 页面组件
│ │ ├── user/ # 用户管理
│ │ ├── team/ # 团队管理
│ │ └── knowledgebase/ # 知识库管理
│ ├── components/ # 通用组件
│ ├── common/ # 公共模块
│ │ ├── apis/ # API 客户端
│ │ └── composables/ # Composables
│ └── http/ # HTTP 配置
└── package.json3.3.2 技术栈 #
- 框架:Vue.js 3
- 语言:TypeScript
- UI 库:Element Plus
- 状态管理:Pinia(可选)
- 路由:Vue Router
- HTTP 客户端:Axios
3.3.3 Composition API 模式 #
使用 Composition API 和 <script setup>:
<script setup lang="ts">
import { ref, onMounted } from 'vue';
import { useUserService } from '@/common/composables/useUserService';
const { users, loading, fetchUsers } = useUserService();
const searchQuery = ref('');
onMounted(() => {
fetchUsers();
});
const handleSearch = () => {
fetchUsers({ query: searchQuery.value });
};
</script>
<template>
<div class="user-management">
<el-input v-model="searchQuery" @keyup.enter="handleSearch" />
<el-table :data="users" :loading="loading">
<!-- 表格内容 -->
</el-table>
</div>
</template>4. 后端服务架构 #
后端服务采用 Flask 框架,采用分层架构设计。
4.1 服务层设计 #
服务层位于 api/ 和 management/server/ 目录,负责业务逻辑处理。
4.1.1 核心服务模块 #
- 对话服务:
api/db/services/dialog_service.py - 知识库服务:
api/db/services/knowledgebase_service.py - 文档服务:
api/db/services/document_service.py - 用户服务:
management/server/services/users/service.py - 团队服务:
management/server/services/teams/service.py
4.1.2 服务层模式 #
# services/knowledgebase_service.py
class KnowledgebaseService:
def __init__(self):
self.db = get_db_connection()
self.es = get_es_connection()
def create_knowledgebase(self, name: str, tenant_id: str) -> dict:
"""创建知识库"""
# 1. 数据库操作
kb = self.db.create_knowledgebase(name, tenant_id)
# 2. Elasticsearch 索引创建
self.es.create_index(kb.id)
# 3. 返回结果
return kb.to_dict()
def add_document(self, kb_id: str, file_id: str) -> dict:
"""添加文档到知识库"""
# 文档处理逻辑
pass4.2 API 路由架构 #
API 路由层负责请求处理和响应格式化。
4.2.1 路由组织 #
api/
├── apps/
│ ├── __init__.py # Flask 应用初始化
│ ├── dialog_app.py # 对话 API
│ ├── api_app.py # 核心 API
│ └── sdk_app.py # SDK API
└── routes/
└── knowledgebases/
└── routes.py # 知识库路由4.2.2 路由模式 #
# routes/knowledgebases/routes.py
from flask import Blueprint, request, jsonify
from services.knowledgebase_service import KnowledgebaseService
kb_bp = Blueprint('knowledgebases', __name__, url_prefix='/api/v1/knowledgebases')
@kb_bp.route('', methods=['POST'])
def create_knowledgebase():
"""创建知识库"""
data = request.json
service = KnowledgebaseService()
try:
kb = service.create_knowledgebase(
name=data['name'],
tenant_id=data['tenant_id']
)
return jsonify({'code': 0, 'data': kb}), 201
except Exception as e:
return jsonify({'code': 500, 'message': str(e)}), 5004.3 数据库连接架构 #
系统使用连接池管理数据库连接。
4.3.1 连接管理 #
# database.py
import pymysql
from contextlib import contextmanager
_pool = None
def get_db_connection():
"""获取数据库连接"""
global _pool
if _pool is None:
_pool = pymysql.connect(
host=settings.MYSQL_HOST,
port=settings.MYSQL_PORT,
user=settings.MYSQL_USER,
password=settings.MYSQL_PASSWORD,
database=settings.MYSQL_DATABASE,
charset='utf8mb4'
)
return _pool
@contextmanager
def get_db_cursor():
"""获取数据库游标(上下文管理器)"""
conn = get_db_connection()
cursor = conn.cursor()
try:
yield cursor
conn.commit()
except Exception as e:
conn.rollback()
raise e
finally:
cursor.close()4.4 依赖管理 #
使用 requirements.txt 管理 Python 依赖。
4.4.1 核心依赖 #
# 核心框架
flask==3.0.0
flask-cors==4.0.0
# 数据库
pymysql==1.1.0
sqlalchemy==2.0.0
# 搜索引擎
elasticsearch==8.11.0
# 对象存储
minio==7.2.0
# AI/ML
transformers==4.49.0
torch==2.1.0
# 工具库
python-dotenv==1.0.04.5 配置管理 #
使用环境变量和配置文件管理应用配置。
4.5.1 配置加载 #
# settings.py
import os
from dotenv import load_dotenv
load_dotenv()
class Settings:
# 数据库配置
MYSQL_HOST = os.getenv('MYSQL_HOST', 'localhost')
MYSQL_PORT = int(os.getenv('MYSQL_PORT', 3306))
MYSQL_USER = os.getenv('MYSQL_USER', 'root')
MYSQL_PASSWORD = os.getenv('MYSQL_PASSWORD', '')
MYSQL_DATABASE = os.getenv('MYSQL_DATABASE', 'ragflow')
# Elasticsearch 配置
ES_HOST = os.getenv('ES_HOST', 'localhost')
ES_PORT = int(os.getenv('ES_PORT', 9200))
# MinIO 配置
MINIO_ENDPOINT = os.getenv('MINIO_ENDPOINT', 'localhost:9000')
MINIO_ACCESS_KEY = os.getenv('MINIO_ACCESS_KEY', '')
MINIO_SECRET_KEY = os.getenv('MINIO_SECRET_KEY', '')
settings = Settings()5. RAG 和 NLP 实现 #
RAG 和 NLP 模块是系统的核心,负责文档处理、向量化和检索。
5.1 RAG 引擎架构 #
RAG 引擎位于 rag/ 目录,包含以下核心模块:
- 文档处理:
rag/nlp/document_parser.py - 向量化:
rag/llm/embedding/ - 检索:
rag/search/ - LLM 集成:
rag/llm/
5.2 文档处理流程 #
# rag/nlp/document_parser.py
class DocumentParser:
def parse(self, file_path: str, kb_id: str) -> List[Chunk]:
"""解析文档"""
# 1. 文件类型检测
file_type = self.detect_file_type(file_path)
# 2. MinerU 处理(如果是图像或PDF)
if file_type in ['pdf', 'image']:
content = self.mineru_parse(file_path)
else:
content = self.text_parse(file_path)
# 3. 文本分块
chunks = self.chunk_text(content)
# 4. 向量化
embeddings = self.embed_chunks(chunks)
# 5. 存储到 Elasticsearch
self.store_chunks(kb_id, chunks, embeddings)
return chunks5.3 检索实现 #
# rag/search/searcher.py
class Searcher:
def search(self, query: str, kb_id: str, top_k: int = 5) -> List[Chunk]:
"""混合检索"""
# 1. 查询向量化
query_embedding = self.embed_query(query)
# 2. 向量检索
vector_results = self.vector_search(query_embedding, kb_id, top_k)
# 3. 全文检索
text_results = self.text_search(query, kb_id, top_k)
# 4. 结果融合
merged_results = self.merge_results(vector_results, text_results)
# 5. 重排序
reranked_results = self.rerank(query, merged_results)
return reranked_results6. 基础设施与文档 #
6.1 容器构建与部署 #
系统使用 Docker 进行容器化部署。
6.1.1 Dockerfile 结构 #
# Dockerfile
FROM python:3.10-slim
WORKDIR /app
# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制代码
COPY . .
# 启动服务
CMD ["python", "api/ragflow_server.py"]6.1.2 Docker Compose 配置 #
# docker-compose.yml
version: '3.8'
services:
ragflow:
build: .
ports:
- "9380:9380"
environment:
- MYSQL_HOST=mysql
- ES_HOST=es01
depends_on:
- mysql
- es01
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=infini_rag_flow
es01:
image: elasticsearch:8.11.0
environment:
- discovery.type=single-node6.2 开发环境配置 #
6.2.1 本地开发设置 #
克隆仓库
git clone https://github.com/zstar1003/ragflow-plus.git cd ragflow-plus安装依赖
`bash后端 #
pip install -r requirements.txt
前端(用户) #
cd web npm install
前端(管理) #
cd management/web npm install
3. **环境变量配置**
```bash
# .env
MYSQL_HOST=localhost
MYSQL_PORT=3306
ES_HOST=localhost
ES_PORT=9200- 启动服务
`bash后端 #
python api/ragflow_server.py
前端(用户) #
cd web npm run dev
前端(管理) #
cd management/web npm run dev
### 6.3 文档系统实现
系统使用 Markdown 文档和代码注释生成文档。
#### 6.3.1 代码文档规范
```python
def create_knowledgebase(name: str, tenant_id: str) -> dict:
"""
创建知识库
Args:
name: 知识库名称
tenant_id: 租户ID
Returns:
dict: 知识库信息
Raises:
ValueError: 如果名称已存在
"""
pass6.4 开发工作流基础设施 #
6.4.1 Git 工作流 #
分支策略
main:主分支,生产环境代码develop:开发分支feature/*:功能分支bugfix/*:修复分支
提交规范
feat::新功能fix::修复bugdocs::文档更新refactor::代码重构
6.4.2 代码质量 #
- 代码检查:使用
pylint和eslint - 格式化:使用
black(Python)和prettier(TypeScript) - 测试:编写单元测试和集成测试
7. 最佳实践 #
7.1 前端开发最佳实践 #
- 组件设计:保持组件小而专注
- 状态管理:合理使用 Context 和 Hooks
- 性能优化:使用
React.memo和useMemo - 错误处理:实现全局错误边界
- 类型安全:充分利用 TypeScript 类型系统
7.2 后端开发最佳实践 #
- 服务层分离:业务逻辑放在服务层
- 错误处理:统一异常处理机制
- 日志记录:使用结构化日志
- 数据库操作:使用事务保证数据一致性
- API 设计:遵循 RESTful 规范
7.3 测试策略 #
- 单元测试:测试单个函数和组件
- 集成测试:测试模块间交互
- 端到端测试:测试完整用户流程
8. 总结 #
本文档介绍了 Ragflow-Plus 的开发指南,包括:
- 系统架构:分层架构设计
- 前端开发:React 和 Vue.js 开发模式
- 后端服务:Flask 服务架构
- RAG 实现:文档处理和检索流程
- 基础设施:容器化和开发环境配置
通过遵循本文档的指南和最佳实践,您可以有效地参与 Ragflow-Plus 的开发工作。