02 · 总体架构与项目结构

1. 架构分层

┌─────────────────────────────────────────────────┐
│ Controller 层:QueryController(REST API)       │
│   POST /api/query  →  自然语言问题                │
├─────────────────────────────────────────────────┤
│ Service 层:MetricQueryService(编排)           │
│   槽位提取 → 本体推理 → SQL 生成 → 校验 → 查询 → 归因│
├──────────────┬──────────────┬───────────────────┤
│ ontology 模块 │  sql 模块    │   llm 模块         │
│ 本体加载+推理  │ 模板+DSL生成 │  DeepSeek 调用     │
│ (Jena)       │ +口径校验    │  槽位提取+归因      │
├──────────────┴──────────────┴───────────────────┤
│ query 模块:MaxComputeQueryService(复用已有)    │
└─────────────────────────────────────────────────┘
         ↓
   数据层:现有 MaxCompute 账单表 + 维度表

数据流(一次查询)

问题 → [llm] 槽位提取 → [ontology] 等价识别/维度展开 → [sql] 模板+参数 → [sql] 口径校验
     → [query] MaxCompute 执行 → [llm] 归因分析 → 响应

2. Maven 项目结构(单模块 + 分层 package)

metric-ontology-query/
├── pom.xml
└── src/main/
    ├── java/com/example/metric/
    │   ├── MetricQueryApplication.java          # 启动类
    │   ├── controller/
    │   │   └── QueryController.java             # REST API
    │   ├── service/
    │   │   └── MetricQueryService.java          # 编排核心
    │   ├── ontology/
    │   │   ├── OntologyService.java             # 本体加载 + 推理
    │   │   └── OntologyProperties.java          # 本体/配置路径
    │   ├── sql/
    │   │   ├── SqlGenerator.java                # SQL 生成(模板+DSL)
    │   │   ├── CaliberValidator.java            # 口径校验
    │   │   └── MetricDefinition.java            # 指标定义模型
    │   ├── llm/
    │   │   ├── LlmService.java                  # DeepSeek 调用
    │   │   └── QueryIntent.java                 # 槽位模型
    │   └── query/
    │       └── MaxComputeQueryService.java      # 复用已有封装
    └── resources/
        ├── ontology/metric.ttl                  # 本体骨架
        ├── config/metrics.yaml                  # 指标配置
        └── application.yml

3. 模块职责边界

模块 职责 依赖
controller 接收 HTTP 请求,返回结果 service
service 编排查询流程 ontology、sql、llm、query
ontology 本体加载、推理(等价/层级/派生) Jena
sql 模板/DSL 生成 SQL、口径校验 ontology(读映射)
llm 槽位提取、归因分析 DeepSeek API
query MaxCompute 执行 已有 SDK 封装

关键约束:模块间只通过接口交互,service 是唯一的编排入口,ontology 不依赖 sql/llm(本体是独立的语义层)。

4. 关键设计决策(承上启下)

  1. 本体精简metric.ttl 只放概念类、关系、公理(推理关系),不放口径表达式和映射
  2. 配置驱动metrics.yaml 放指标的口径、映射、计算逻辑,新增指标只加配置
  3. 复用 MaxCompute 封装:直接复用已有的 MaxComputeQueryService,不重复造轮子