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%)
└─ 工程图纸场景(开发中)
🚀 下一步
- 创建 gzdoc-finance 模块骨架
- 定义金融场景API接口
- 实现研报解析功能
- 验证架构可行性
最后更新:2026-05-28