GzDoc "平台+插件" 架构详解

🏗️ 整体架构图

┌─────────────────────────────────────────────────────────────────────────┐
│                              用户层                                      │
├─────────────────────────────────────────────────────────────────────────┤
│  Web端(React)  │  移动端(React Native)  │  开放API(REST)  │  CLI工具    │
└─────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────┐
│                            接入层                                        │
├─────────────────────────────────────────────────────────────────────────┤
│  Nginx (负载均衡 + SSL)  +  API Gateway (鉴权 + 限流 + 路由)             │
└─────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────┐
│                         平台层(通用能力)                               │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────────┐  ┌────────────┐ │
│  │ gzdoc-auth   │  │ gzdoc-document│ │ gzdoc-qa     │  │ gzdoc-     │ │
│  │              │  │               │  │              │  │ common     │ │
│  │ 用户管理      │  │ 文档管理      │  │ 问答基础      │  │            │ │
│  │ 租户管理      │  │ 文件存储      │  │ RAG能力      │  │ 公共组件    │ │
│  │ 权限控制      │  │ 格式转换      │  │ 历史记录      │  │            │ │
│  │              │  │               │  │              │  │            │ │
│  │ Port: 8081   │  │ Port: 8082    │  │ Port: 8083   │  │            │ │
│  └──────────────┘  └──────────────┘  └──────────────┘  └────────────┘ │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘
                                    ↓ 依赖/复用
┌─────────────────────────────────────────────────────────────────────────┐
│                      场景层(垂直插件)                                  │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌──────────────────────┐  ┌──────────────────────┐  ┌──────────────┐ │
│  │ gzdoc-finance ⭐      │  │ gzdoc-legal          │  │ gzdoc-medical│ │
│  │                      │  │                      │  │              │ │
│  │ 研报解析              │  │ 合同解析              │  │ 影像报告解读  │ │
│  │ 表格提取              │  │ 条款提取              │  │ 历史对比      │ │
│  │ 横向对比              │  │ 风险识别              │  │ 就医建议      │ │
│  │ 趋势分析              │  │ 合同对比              │  │              │ │
│  │ 投资建议              │  │                      │  │              │ │
│  │                      │  │                      │  │              │ │
│  │ Port: 8084           │  │ Port: 8085           │  │ Port: 8086   │ │
│  │ Status: 开发中        │  │ Status: 规划中        │  │ Status: 规划中│ │
│  └──────────────────────┘  └──────────────────────┘  └──────────────┘ │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────┐
│                          AI服务层 (Python)                               │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ 通用AI能力                                                       │   │
│  │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌────────┐│   │
│  │ │ OCR服务  │ │ 文档解析  │ │ Embedding│ │ 向量检索  │ │ LLM调用││   │
│  │ │PaddleOCR │ │Unstructur│ │ BGE-M3   │ │ Weaviate │ │GPT/Clau││   │
│  │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ └────────┘│   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  ┌─────────────────────────────────────────────────────────────────┐   │
│  │ 场景AI能力                                                       │   │
│  │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐            │   │
│  │ │ finance/     │ │ legal/       │ │ medical/     │            │   │
│  │ │ 研报解析      │ │ 合同解析      │ │ 影像分析      │            │   │
│  │ │ 表格识别      │ │ 条款提取      │ │ 报告解读      │            │   │
│  │ │ 实体提取      │ │ 风险识别      │ │ 对比分析      │            │   │
│  │ └──────────────┘ └──────────────┘ └──────────────┘            │   │
│  └─────────────────────────────────────────────────────────────────┘   │
│                                                                         │
│  Port: 8000                                                             │
└─────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────┐
│                            数据层                                        │
├─────────────────────────────────────────────────────────────────────────┤
│                                                                         │
│  ┌──────────────────────────────────────────────────────────────────┐  │
│  │ 关系数据库 (PostgreSQL)                                          │  │
│  │ ┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐    │  │
│  │ │ 平台表      │ │ 金融表      │ │ 法律表      │ │ 医疗表      │    │  │
│  │ │ t_user     │ │ t_finance_ │ │ t_legal_   │ │ t_medical_ │    │  │
│  │ │ t_tenant   │ │ report     │ │ contract   │ │ report     │    │  │
│  │ │ t_document │ │ t_finance_ │ │ t_legal_   │ │ t_medical_ │    │  │
│  │ │ t_qa_record│ │ data       │ │ clause     │ │ image      │    │  │
│  │ └────────────┘ └────────────┘ └────────────┘ └────────────┘    │  │
│  └──────────────────────────────────────────────────────────────────┘  │
│                                                                         │
│  ┌──────────────────────────────────────────────────────────────────┐  │
│  │ 向量数据库 (Weaviate)                                            │  │
│  │ ┌────────────┐ ┌────────────┐ ┌────────────┐                   │  │
│  │ │ Document   │ │ FinanceRpt │ │ LegalDoc   │                   │  │
│  │ │ (通用)      │ │ (金融)      │ │ (法律)      │                   │  │
│  │ └────────────┘ └────────────┘ └────────────┘                   │  │
│  └──────────────────────────────────────────────────────────────────┘  │
│                                                                         │
│  ┌──────────────────────────────────────────────────────────────────┐  │
│  │ 其他存储                                                         │  │
│  │ Redis (缓存) │ MinIO (对象) │ Kafka (消息) │ ES (全文检索)      │  │
│  └──────────────────────────────────────────────────────────────────┘  │
│                                                                         │
└─────────────────────────────────────────────────────────────────────────┘

🔄 服务间调用关系

场景1: 金融研报上传处理

用户上传研报

API Gateway (8080)

gzdoc-finance (8084) ← 场景层入口

    ├─→ gzdoc-document (8082) ← 复用:文件上传
    │   └─→ MinIO ← 存储文件

    ├─→ Kafka ← 发送消息: finance-report-upload

    └─→ AI Service (8000)
        ├─→ 研报解析 (finance/report_parser.py)
        ├─→ 表格提取 (finance/table_extractor.py)
        ├─→ 实体识别 (finance/entity_recognizer.py)
        ├─→ Embedding (通用能力)
        └─→ Weaviate (FinanceReport Schema)

保存到 PostgreSQL
    ├─→ t_document (平台表)
    └─→ t_finance_report (场景表)

返回结果

场景2: 金融问答

用户提问: "茅台的直营占比是多少?"

API Gateway (8080)

gzdoc-finance (8084) ← 场景层入口

    ├─→ 场景过滤: 只查询茅台的研报
    │   SELECT id FROM t_finance_report WHERE stock_code='600519'

    └─→ gzdoc-qa (8083) ← 复用:问答能力
        └─→ AI Service (8000)
            ├─→ 向量检索 (Weaviate: FinanceReport)
            ├─→ 全文检索 (ES)
            ├─→ Rerank
            └─→ LLM生成答案

场景增强 (gzdoc-finance)
    ├─→ 添加最新财务数据
    ├─→ 添加估值数据
    └─→ 添加历史趋势

返回增强后的答案

💡 核心设计原则

1. 依赖方向

场景层 ──依赖──> 平台层
   ↓              ↓
 不能反向依赖   不感知场景层

示例:

// ✅ 正确:场景层依赖平台层
@Service
public class FinanceReportService {
    @Autowired
    private DocumentService documentService;  // 平台层服务
}

// ❌ 错误:平台层不能依赖场景层
@Service
public class DocumentService {
    @Autowired
    private FinanceReportService financeService;  // 禁止!
}

2. 数据关联

平台表 (t_document)
    ↑ 外键关联
场景表 (t_finance_report)

示例:

-- 场景表通过 document_id 关联平台表
CREATE TABLE t_finance_report (
    id BIGSERIAL PRIMARY KEY,
    document_id BIGINT NOT NULL,
    stock_code VARCHAR(20),
    ...
    FOREIGN KEY (document_id) REFERENCES t_document(id)
);

3. 能力复用

场景层通过依赖注入复用平台层能力
不复制代码,不修改平台层

示例:

// 场景层复用平台层能力
@Service
public class FinanceReportService {
    @Autowired
    private DocumentService documentService;    // 文档管理
    @Autowired
    private MinioService minioService;          // 对象存储
    @Autowired
    private EmbeddingService embeddingService;  // 向量化
    @Autowired
    private QAService qaService;                // 问答能力
    
    // 场景专用逻辑
    public void processReport(Long reportId) {
        // 复用 + 扩展
    }
}

🎯 优势总结

vs 单体架构

  • ✅ 模块化:场景独立,互不影响
  • ✅ 可扩展:新增场景不改老代码
  • ✅ 可维护:职责清晰,易于理解

vs 传统微服务

  • ✅ 更灵活:按场景组合部署
  • ✅ 更经济:不用的场景不部署
  • ✅ 更快速:场景开发并行进行

vs 纯插件架构

  • ✅ 更稳定:平台层提供稳定基础
  • ✅ 更高效:复用通用能力
  • ✅ 更简单:不需要复杂的插件机制

📈 扩展路径

当前 (Month 1-3)

平台层 (100%)
└─ 通用能力完整

Phase 1 (Month 4-6)

平台层 (100%)
└─ gzdoc-finance (100%)
   └─ 金融研报场景

Phase 2 (Month 7-9)

平台层 (100%)
├─ gzdoc-finance (100%)
├─ gzdoc-legal (100%)
│  └─ 法律合同场景
└─ gzdoc-medical (50%)
   └─ 医疗影像场景(开发中)

Phase 3 (Month 10-12)

平台层 (100%)
├─ gzdoc-finance (100%)
├─ gzdoc-legal (100%)
├─ gzdoc-medical (100%)
└─ gzdoc-engineer (50%)
   └─ 工程图纸场景(开发中)

🚀 下一步

  1. 创建 gzdoc-finance 模块骨架
  2. 定义金融场景API接口
  3. 实现研报解析功能
  4. 验证架构可行性

最后更新:2026-05-28

目录