智能知识系统 - 架构设计审查报告
生成时间: 2026-03-25 审查范围: 后端架构设计 审查方法: 静态代码分析、依赖关系分析、设计模式识别
架构评分
| 评估维度 | 评分 | 说明 |
|---|---|---|
| 模块化程度 | 8.5/10 | 清晰的模块划分,良好的职责分离 |
| 耦合度评估 | 7.5/10 | 存在部分紧耦合,但整体可控 |
| 内聚性评估 | 8.5/10 | 模块内部功能高度相关,内聚性强 |
| 可扩展性 | 8.0/10 | 良好的扩展机制,但部分模块耦合影响扩展 |
| 可维护性 | 8.0/10 | 代码结构清晰,但存在一些复杂度 |
| 安全性 | 7.5/10 | 完善的安全机制,但配置验证不足 |
总体评分: 8.0/10 - 良好的架构设计,有明确的分层和模块化设计
1. 模块依赖分析
1.1 依赖层次结构
┌─────────────────────────────────────────────────────────────┐
│ API 层 (main.py) │
│ ┌───────────────────────────────────────────────────────┐ │
│ │ FastAPI应用 │ │
│ │ - 路由定义 │ │
│ │ - 中间件配置 │ │
│ │ - 生命周期管理 │ │
│ └───────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 服务层 (services/) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ retrieval │ │ reasoning │ │ rag │ │
│ │ - vector │ │ - CoT │ │ - context │ │
│ │ - bm25 │ │ - ReAct │ │ │ │
│ │ - hybrid │ │ - GraphRAG │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 领域层 (domains/) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ BaseDomain │ │ QigongDomain │ │ TcmDomain │ │
│ │ │ │ │ │ │ │
│ │ DomainRegistry│ │ConfucianDomain│ │GeneralDomain│ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ 基础设施层 (infrastructure) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ cache/ │ │ gateway/ │ │ monitoring/ │ │
│ │ - manager │ │ - router │ │ - metrics │ │
│ │ - redis │ │ - rate_lmt │ │ - health │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ auth/ │ │ models.py │ │ config.py │ │
│ │ - jwt │ │ │ │ │ │
│ │ - rbac │ │ │ │ │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
1.2 模块依赖关系图
┌─────────────┐
│ config.py │
└──────┬──────┘
│
┌──────────────────┼──────────────────┐
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ main.py │ │ models.py │ │ domains/base │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
└──────────────────┼──────────────────┘
↓
┌─────────────────────┐
│ services/ │
│ ├── retrieval │
│ └── reasoning │
└─────────┬───────────┘
│
┌─────────────────┼─────────────────┐
↓ ↓ ↓
┌───────────────┐ ┌───────────────┐ ┌───────────────┐
│ cache/ │ │ gateway/ │ │ monitoring/ │
│ (无依赖) │ │ → domains │ │ (无依赖) │
└───────────────┘ └───────────────┘ └───────────────┘
┌───────────────┐
│ auth/ │
│ (独立模块) │
└───────────────┘
1.3 依赖质量分析
良好的依赖设计:
- domains/base.py 定义了清晰的抽象接口 (BaseDomain)
- cache/ 模块完全独立,无外部依赖
- monitoring/ 模块设计独立,可单独使用
- config.py 作为配置中心,被各模块依赖
需要改进的依赖:
- main.py 直接依赖过多服务模块 ( retrieval, reasoning, domains, gateway, monitoring )
- gateway/router.py 直接依赖 domains 模块,耦合度较高
- 部分服务通过全局单例 (get_registry(), get_cache_manager()) 耦合
2. 循环依赖检测
2.1 检测结果
无循环依赖发现 - 项目的依赖关系保持单向流动。
依赖流向:
config.py → 所有模块
models.py → main.py, services
domains/base → domains/*, gateway
services/* → main.py
cache → (独立,仅被依赖)
monitoring → (独立,仅被依赖)
auth → (独立,仅被依赖)
gateway → domains
2.2 潜在的循环风险
虽然当前无循环依赖,但存在以下风险点:
- gateway ↔ domains 双向依赖风险
gateway/router.py依赖domains模块domains/registry.py可能未来需要调用 gateway 功能-
建议: 通过接口/事件机制解耦
-
全局单例的隐式循环
get_registry()返回的全局实例被多处修改- 可能导致难以追踪的状态变化
- 建议: 考虑依赖注入替代全局单例
3. 设计模式分析
3.1 已使用的设计模式
| 设计模式 | 使用位置 | 评价 |
|---|---|---|
| 策略模式 | RoutingStrategy, CacheStrategy |
良好 - 支持多种策略切换 |
| 工厂模式 | get_registry(), get_cache_manager() |
中等 - 过度使用全局单例 |
| 单例模式 | 全局管理器实例 | 中等 - 应考虑依赖注入 |
| 模板方法 | BaseDomain 抽象类 |
优秀 - 清晰的接口定义 |
| 装饰器模式 | cached, require_permission |
优秀 - 良好的AOP实现 |
| 注册表模式 | DomainRegistry |
优秀 - 服务发现机制 |
| 中间件模式 | FastAPI中间件链 | 优秀 - 请求处理管道 |
| 外观模式 | APIGateway |
良好 - 简化复杂子系统 |
| 观察者模式 | HealthChecker |
优秀 - 健康检查事件机制 |
| 仓储模式 | UserRepository |
优秀 - 数据访问抽象 |
3.2 设计模式使用示例
策略模式 - 路由策略:
class RoutingStrategy(Enum):
PRIORITY = "priority"
ROUND_ROBIN = "round_robin"
LEAST_CONNECTIONS = "least_connections"
DOMAIN_MATCH = "domain_match"
模板方法 - 领域基类:
class BaseDomain(ABC):
@abstractmethod
async def query(self, question: str, ...) -> QueryResult:
pass
@abstractmethod
async def search(self, query: str, ...) -> List[Dict]:
pass
装饰器模式 - 缓存装饰器:
3.3 建议添加的设计模式
| 模式 | 应用场景 | 优先级 |
|---|---|---|
| 依赖注入 | 替代全局单例,提高可测试性 | 高 |
| 建造者模式 | 复杂配置对象构建 (如 DomainConfig) | 中 |
| 命令模式 | API操作封装,支持撤销/重做 | 低 |
| 适配器模式 | 多种LLM服务适配 | 中 |
4. 架构分层
4.1 分层结构评估
┌─────────────────────────────────────────────────────┐
│ 表现层 (Presentation) │
│ FastAPI路由、中间件、请求/响应处理 │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 应用层 (Application) │
│ 业务编排、用例实现、DTO转换 │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 领域层 (Domain) │
│ 业务实体、领域服务、业务规则 │
└─────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────┐
│ 基础设施层 (Infrastructure) │
│ 数据库、缓存、外部API、配置 │
└─────────────────────────────────────────────────────┘
4.2 分层问题分析
问题1: 层间边界模糊
- main.py 包含过多业务逻辑
- 建议: 将业务逻辑抽取到 Service 层
问题2: 领域层贫血
- 领域对象 (如 Domain) 缺少业务行为
- 建议: 引入充血领域模型
问题3: 基础设施层泄漏
- 部分领域类直接依赖 asyncpg.Pool
- 建议: 通过仓储模式抽象数据访问
4.3 职责分离评估
| 模块 | 职责清晰度 | 单一职责 | 内聚性 |
|---|---|---|---|
config.py |
高 | 是 | 高 |
models.py |
高 | 是 | 高 |
domains/ |
高 | 是 | 高 |
services/ |
中 | 基本是 | 高 |
cache/ |
高 | 是 | 高 |
auth/ |
高 | 是 | 高 |
monitoring/ |
高 | 是 | 高 |
gateway/ |
高 | 是 | 高 |
main.py |
低 | 否 | 低 |
5. 接口设计
5.1 API接口设计
RESTful设计:
GET /api/v1/documents # 列表
GET /api/v1/documents/{id} # 详情
POST /api/v1/documents # 创建
POST /api/v1/search/hybrid # 混合搜索
POST /api/v1/reason # 推理
POST /api/v1/gateway/query # 网关查询
GET /api/v1/domains # 领域列表
GET /api/v1/health # 健康检查
接口优点:
- 清晰的资源命名
- 一致的版本控制 (/api/v1/)
- 合理的HTTP方法使用
- JSON格式的请求/响应
接口改进建议: 1. 添加分页参数到所有列表接口 2. 实现HATEOAS链接 3. 统一错误响应格式 4. 添加请求验证细节
5.2 模块接口设计
BaseDomain 接口:
class BaseDomain(ABC):
@abstractmethod
async def query(self, question: str, ...) -> QueryResult: ...
@abstractmethod
async def search(self, query: str, ...) -> List[Dict]: ...
CacheManager 接口:
class CacheManager:
async def get(self, key: str, ...) -> Any: ...
async def set(self, key: str, value: Any, ...) -> None: ...
async def delete(self, key: str, ...) -> None: ...
5.3 接口稳定性
| 接口类型 | 稳定性 | 破坏性变更风险 |
|---|---|---|
| HTTP API | 中 | 版本控制良好 |
| 领域接口 | 高 | 抽象设计稳定 |
| 缓存接口 | 高 | 简洁稳定 |
| 监控接口 | 高 | 独立稳定 |
| 认证接口 | 中 | 功能演进中 |
6. 可扩展性
6.1 扩展机制
1. 领域扩展:
class CustomDomain(BaseDomain):
async def query(self, question: str, ...) -> QueryResult:
# 自定义实现
pass
# 注册新领域
registry.register(CustomDomain(db_pool))
2. 缓存扩展:
class CustomCacheBackend:
async def get(self, key): ...
async def set(self, key, value): ...
# 插入到CacheManager
3. 监控扩展:
- 评价: 优秀 - 注册表模式6.2 配置化程度
| 配置项 | 硬编码 | 环境变量 | 配置文件 | 评分 |
|---|---|---|---|---|
| 数据库 | - | ✓ | - | 中 |
| API密钥 | - | ✓ | - | 中 |
| 缓存TTL | 部分 | - | - | 低 |
| 路由策略 | - | - | - | 低 |
| 健康检查 | - | - | - | 低 |
改进建议: - 将硬编码配置迁移到配置文件 - 实现配置热重载 - 添加配置验证机制
6.3 插件化机制
当前状态: 无正式插件系统
建议实现:
class PluginBase(ABC):
@abstractmethod
async def initialize(self, app): ...
@abstractmethod
async def shutdown(self): ...
class PluginManager:
def register(self, plugin: PluginBase): ...
async def load_all(self): ...
7. 代码组织
7.1 目录结构评估
backend/
├── main.py # 应用入口 (需要拆分)
├── config.py # 配置中心 ✓
├── models.py # 数据模型 ✓
├── api/ # API路由 (缺失)
│ └── __init__.py
├── services/ # 业务服务 ✓
│ ├── retrieval/
│ ├── reasoning/
│ └── rag/
├── domains/ # 领域模型 ✓
│ ├── base.py
│ ├── registry.py
│ ├── qigong.py
│ ├── tcm.py
│ ├── confucian.py
│ └── general.py
├── cache/ # 缓存 ✓
├── auth/ # 认证授权 ✓
├── gateway/ # 网关 ✓
├── monitoring/ # 监控 ✓
└── database/ # 数据库 (缺失)
└── __init__.py
7.2 文件职责评估
| 文件 | 行数 | 职责 | 建议 |
|---|---|---|---|
main.py |
1166 | 入口+路由+业务 | 拆分为多个模块 |
config.py |
86 | 配置管理 | 保持 |
models.py |
111 | 数据模型 | 考虑拆分 |
domains/base.py |
217 | 领域抽象 | 保持 |
cache/manager.py |
783 | 缓存管理 | 考虑拆分 |
7.3 模块内聚性
高内聚模块:
- domains/ - 领域相关功能聚集
- auth/ - 认证授权功能聚集
- cache/ - 缓存功能聚集
低内聚模块:
- main.py - 功能混杂,需要拆分
- services/ - 各服务间缺少协调
8. 架构问题与改进建议
8.1 高优先级问题
| 问题 | 影响 | 建议 |
|---|---|---|
main.py 过大 |
可维护性 | 拆分为 API 路由模块 |
| 全局单例过度使用 | 可测试性 | 引入依赖注入 |
| 领域层贫血 | 业务逻辑分离 | 实现充血领域模型 |
| 缺少服务层协调 | 扩展性 | 添加 Application Service 层 |
8.2 中优先级问题
| 问题 | 影响 | 建议 |
|---|---|---|
| 配置硬编码 | 灵活性 | 迁移到配置文件 |
| 错误处理不一致 | 可靠性 | 统一错误处理机制 |
| 缺少API文档 | 可用性 | 完善OpenAPI文档 |
| 测试覆盖不足 | 质量保证 | 添加单元测试和集成测试 |
8.3 低优先级改进
| 问题 | 影响 | 建议 |
|---|---|---|
| 缺少插件系统 | 扩展性 | 实现插件机制 |
| 日志格式不统一 | 运维 | 标准化日志格式 |
| 缺少性能监控 | 性能 | 添加APM工具集成 |
8.4 重构建议
建议1: 引入 Application Service 层
建议2: 实现依赖注入
class Container:
def __init__(self):
self._services = {}
def register(self, interface, implementation): ...
def get(self, interface): ...
建议3: 拆分 main.py
9. 架构优势
- 清晰的领域驱动设计: 使用 DomainRegistry 实现服务发现
- 完善的缓存机制: 多级缓存设计,性能优化良好
- 独立的认证授权: JWT + RBAC 完整实现
- 可观测性: 监控和健康检查机制完善
- 良好的API设计: RESTful 风格,版本控制清晰
10. 总结
10.1 架构成熟度
| 维度 | 成熟度 |
|---|---|
| 分层架构 | 中 |
| 模块化 | 高 |
| 设计模式 | 高 |
| 可扩展性 | 中高 |
| 可测试性 | 中 |
| 文档完善度 | 中 |
10.2 改进路线图
短期 (1-2周):
1. 拆分 main.py 为多个路由模块
2. 添加统一错误处理
3. 完善API文档
中期 (1-2月): 1. 引入依赖注入容器 2. 实现 Application Service 层 3. 添加集成测试
长期 (3-6月): 1. 实现插件系统 2. 完善配置管理 3. 添加性能监控
审查人: Claude Architecture Analysis 审查日期: 2026-03-25