Skip to content

FastAPI 后端工程治理

目前需要改进一下基于fastapi后端的一些架构设计

后端项目结构概述

整体结构如下:

bash
RagBackend/
├── .dockerignore
├── .env.example
├── .gitignore
├── .python-version
├── ASF_SRE/                    # 软件研发效能相关模块
   └── SRE_mian.py
├── Dockerfile
├── RAGF_User_Management/      # 用户管理模块
   ├── LogonAndLogin.py       # 注册和登录功能
   ├── QQ_Login.py            # QQ登录功能
   ├── Reset_Password.py      # 密码重置功能
   ├── User_Management.py     # 用户管理功能
   ├── User_settings.py       # 用户设置功能
   └── db_config.py           # 数据库配置
├── RAG_M/                     # 核心RAG应用模块
   ├── Pipfile
   ├── Pipfile.lock
   ├── RAG_app.py             # RAG核心应用程序
   ├── README.md
   ├── requirements.txt
   └── src/                   # RAG源代码
       ├── __init__.py
       ├── agent/             # 智能代理模块
       ├── api/               # API接口
       ├── ingestion/         # 数据摄取模块
       ├── models/            # 模型相关
       ├── rag/               # RAG核心逻辑
       ├── scripts/           # 脚本文件
       └── vectorstore/       # 向量存储
├── agent_tools/               # 智能体工具
   ├── __init__.py
   ├── agent_advanced.py
   ├── enterprise_tools.py
   └── web_search_tool.py
├── assets/                    # 资源文件
├── audit/                     # 审计日志
   ├── __init__.py
   └── audit_log.py
├── billing/                   # 计费管理
   ├── __init__.py
   └── billing_manager.py
├── chat_units/                # 聊天功能单元
   └── chat_management/       # 聊天管理
       ├── chat_delete.py
       ├── chat_download.py
       ├── chat_history_attacher.py
       ├── chat_main.py
       └── chat_send.py
├── creation/                  # 内容创建
   ├── __init__.py
   └── doc_creation.py
├── data_sources/              # 数据源管理
   ├── __init__.py
   └── datasource_manager.py
├── docs/                      # 文档
├── document_processing/       # 文档处理模块
   ├── API.md
   ├── doc_list.py
   ├── doc_manage.py
   ├── doc_upload.py
   ├── incremental_vectorizer.py
   ├── pipeline.py
   ├── retrieval_strategy.py
   ├── semantic_splitter.py
   ├── task_queue.py
   └── vectorize_task.py
├── enterprise/                # 企业功能
├── evaluation/                # 评估模块
├── feedback/                  # 反馈系统
├── integrations/              # 第三方集成
├── knowledge/                 # 知识管理
├── knowledge_base/            # 知识库管理
├── knowledge_graph/           # 知识图谱
├── main.py                    # 主入口文件
├── models/                    # 模型配置
├── monitoring/                # 监控模块
├── multi_model/               # 多模型支持
├── multimodal/                # 多模态处理
├── ollama_management/         # Ollama管理
├── open_api/                  # 开放API
├── rag_enhancement/           # RAG增强功能
├── search/                    # 搜索功能
├── square/                    # 广场功能
├── tests/                     # 测试文件
├── trace_logging.py           # 追踪日志
└── requirements.txt           # Python依赖包列表

主要功能模块有:

项目目前是一个典型的“按技术功能分散式”结构,在项目初期开发速度快(当时大二两周梭完了),但随着业务复杂度增加(比如 RAG 这种涉及数据流、模型调度、向量检索的复杂系统),主要存在一些问题:

模块边界不清:RAG_M 嵌套过深,与外层的 agent_tools、document_processing 职责重叠。 命名不规范:RAGF_User_Management 目录名过长且包含大写,ASF_SRE 含义不明,chat_units/chat_management 层级冗余。 配置分散:db_config.py 藏在用户模块中,RAG_M 里还有独立的 Pipfile,导致依赖管理混乱。 根目录拥堵:过多的顶层文件夹导致项目难以导航。

面对这种情况计划采用 “领域驱动 + 分层架构” 的模式进行重构:

一、 顶层架构设计原则

  1. 单体优先,模块化设计:虽然目前是一个服务,但内部应按业务领域(User、RAG、Agent、Doc)划分清晰的边界。
  2. 核心下沉:RAG 核心逻辑不应只是 RAG_M 下的一个子目录,而应提升为核心域。
  3. 统一依赖与配置:废除子目录的独立环境配置,统一由根目录管理。

二、 改进后的项目结构树

bash
RagBackend/
├── .env                        # 环境变量
├── .gitignore
├── .python-version
├── Dockerfile
├── requirements.txt            # 统一的依赖管理
├── main.py                     # 应用入口 (FastAPI app 初始化)
├── alembic.ini                 # 数据库迁移配置
├── alembic/                    # 数据库迁移脚本

├── app/                        # 核心应用目录
   ├── __init__.py
   ├── core/                   # 核心配置与安全
   ├── __init__.py
   ├── config.py           # 全局配置 (合并原 db_config, .env 读取)
   ├── security.py         # JWT, 密码哈希
   └── logging.py          # 日志配置 (合并 trace_logging)

   ├── api/                    # API 路由层
   ├── __init__.py
   ├── dependencies.py     # 公共依赖 (如 get_db, get_current_user)
   └── v1/                 # API 版本控制
       ├── __init__.py
       ├── auth.py         # 登录注册 (原 LogonAndLogin)
       ├── chat.py         # 聊天接口
       ├── knowledge.py    # 知识库接口
       ├── rag.py          # RAG 执行接口
       └── ollama.py       # 模型管理接口

   ├── models/                 # 数据库 ORM 模型
   ├── __init__.py
   ├── user.py
   ├── chat.py
   └── knowledge.py

   ├── schemas/                # Pydantic 数据模型
   ├── __init__.py
   ├── user.py
   └── chat.py

   ├── domain/                 # [核心] 业务领域逻辑层
   ├── __init__.py

   ├── rag/                # RAG 核心引擎 (整合原 RAG_M)
   ├── __init__.py
   ├── engine.py       # RAG 执行引擎
   ├── retrieval.py    # 检索策略
   └── reranker.py     # 重排序模块

   ├── agent/              # 智能体模块 (整合原 agent_tools, RAG_M/agent)
   ├── __init__.py
   ├── executor.py     # Agent 执行器
   └── tools/          # 工具箱
       ├── web_search.py
       └── enterprise_tool.py

   ├── document/           # 文档处理 (整合原 document_processing)
   ├── __init__.py
   ├── processor.py    # 文档处理流水线
   ├── splitter.py     # 语义分割
   └── loaders/        # 不同格式加载器

   ├── knowledge/          # 知识库管理 (整合原 knowledge/knowledge_base)
   ├── __init__.py
   ├── manager.py
   └── graph.py        # 知识图谱逻辑

   └── chat/               # 聊天业务逻辑
       ├── __init__.py
       ├── service.py      # 聊天服务 (整合原 chat_management)
       └── history.py      # 历史记录管理

   ├── infrastructure/         # 基础设施层
   ├── __init__.py
   ├── database.py         # 数据库连接
   ├── vectorstore/        # 向量库连接
   ├── __init__.py
   └── chroma_client.py
   ├── llm/                # 模型提供商适配
   ├── __init__.py
   ├── ollama_adapter.py
   └── openai_adapter.py
   └── storage/            # 文件存储

   └── utils/                  # 通用工具函数
       ├── __init__.py
       └── helpers.py

├── tests/                      # 测试目录
   ├── __init__.py
   ├── conftest.py
   └── test_api/

└── docs/                       # 接口文档等

三、 工程治理

1. 整合 RAG_M 子项目

现状RAG_M 作为一个子目录存在,甚至包含独立的 requirements.txtsrc改进

  • 消除嵌套:将 RAG_M/src 下的代码提升到 app/domain/ragapp/infrastructure/vectorstore 中。
  • 统一依赖:删除 RAG_M/Pipfile,将其依赖合并到根目录的 requirements.txt
  • 理由:RAG 是你的核心业务,不应被“藏”在子目录里,它应该与其他业务模块平级。

2. 规范用户管理模块 (RAGF_User_Management)

现状:目录名过长,文件以功能命名(如 QQ_Login.py),不符合 Python 模块化习惯。 改进

  • 重命名为 domain/user 或直接拆解。
  • LogonAndLogin.py -> 拆分为 api/v1/auth.py (接口层) 和 services/user_service.py (逻辑层)。
  • QQ_Login.py -> 集成到 core/security.pyinfrastructure/oauth.py 中,作为 OAuth 登录策略的一种。
  • db_config.py -> 移动到 core/config.py,全局只保留一份配置。

3. 清理顶层散乱的功能目录

现状:根目录下有 agent_tools, billing, audit, creation 等近 20 个文件夹。 改进

  • 按领域归集

    • agent_tools -> app/domain/agent/tools
    • document_processing -> app/domain/document
    • chat_units -> app/domain/chat
    • knowledge, knowledge_base, knowledge_graph -> 合并为 app/domain/knowledge
    • multi_model, ollama_management -> 归类到 app/infrastructure/llm (底层适配) 或 app/domain/model_manager (业务管理)。
  • 辅助功能下沉

    • audit, billing, monitoring -> 如果代码量不大,可以放在 app/services 下;如果复杂度高,保留在 app/domain 下作为独立子域。
    • ASF_SRE -> 如果是运维脚本,移出 app 到单独的 scripts 目录;如果是业务功能,重命名并归入相关领域。

4. 分层职责定义

  • API 层 (app/api):只负责接收请求、参数校验、调用 Domain 层、返回响应。禁止在 API 层写 SQL 查询或直接操作向量库。
  • Domain 层 (app/domain):这是系统的核心。例如 domain/chat/service.py 负责“聊天”这个动作的业务编排,它调用 domain/rag 获取背景知识,调用 infrastructure/llm 生成回答。
  • Infrastructure 层 (app/infrastructure):封装外部依赖。数据库、向量库、Redis、Ollama 接口都在这里。这样如果未来要换向量库(比如从 Chroma 换到 Milvus),只需修改此层代码,Domain 层代码无需改动。

四、 迁移实施

使用 uv 管理项目依赖

根据文档,使用 uv 管理项目依赖的典型流程如下:

bash
# 1. 安装 uv
pip install uv

# 2. 创建虚拟环境
uv venv

# 3. 激活虚拟环境
# Windows:
.venv\Scripts\activate
# macOS/Linux:
source .venv/bin/activate

# 4. 安装依赖
uv pip install -r requirements.txt
# 或者对于使用 pyproject.toml 的项目
uv pip install -e .

4. uv 与传统方式对比

传统方式uv 方式
python -m venv .venvuv venv
pip install -r requirements.txtuv pip install -r requirements.txt
pip install package_nameuv pip install package_name
较慢的依赖解析更快的依赖解析

5. 为什么项目推荐使用 uv

  1. 性能:uv 用 Rust 编写,执行速度显著快于传统的 pip
  2. 现代性:uv 是为现代 Python 生态系统设计的,支持最新的依赖解析算法
  3. 易用性:命令简洁,功能强大

进行渐进式重构,不要试图一次性全部改完:

  1. 第一步(基础设施统一):先将 db_config.pyRAG_M 中的配置文件统一迁移到 app/core/config.py,确保全局使用同一个配置对象。
  2. 第二步(入口整理):修改 main.py,将散落在各个目录下的路由文件统一注册到 app/api/v1 下,确保 API 路径规范(如 /api/v1/chat/...)。
  3. 第三步(领域聚合):挑选一个相对独立的模块(例如 document_processing),将其移动到 app/domain/document,并修复导入路径。逐步将其他模块迁移进来。

这种架构设计将使你的 RAG 后端具备良好的扩展性,特别是方便后续引入更复杂的 Agent 编排和多模型切换逻辑

本文档站基于 VitePress 构建