虚拟本体:基于语义层的自然语言SQL生成系统技术深度解析
摘要
Virtual Ontology是一个创新的语义数据访问系统,通过轻量级本体层将自然语言查询直接转换为SQL,实现了无需ETL流程即可查询现有SQL数据库的能力。本文深入分析该系统的架构设计、核心组件实现和关键技术细节,以MES制造执行系统为应用场景,详细解读从业务概念到SQL查询的完整转换流程,为构建语义化数据访问系统提供实践参考。
1. 项目应用场景
1.1 核心应用领域
Virtual Ontology项目主要应用于制造执行系统(MES)数据分析场景,解决传统数据分析中业务人员与技术人员之间的沟通壁垒问题。
传统数据分析流程的痛点:
- 业务人员需要将业务问题转换为技术需求
- 技术人员需要理解业务逻辑并编写SQL
- 迭代周期长,响应速度慢
- 需要维护复杂的ETL流程和语义系统
Virtual Ontology的解决方案:
- 业务人员直接使用自然语言提问
- 系统自动将问题转换为SQL查询
- 无需ETL,直接查询现有SQL数据库
- 通过轻量级本体定义业务概念映射
1.2 典型业务场景
根据项目中的MES数据分析实现,系统支持以下典型业务场景:
- 产能分析:比较最佳性能与当前性能
- 瓶颈检测:识别限制生产的设备
- 质量调查:发现缺陷率的模式
- 停机影响:计算停机的财务成本
- 级联分析:追踪上下游设备的影响
1.3 实际应用效果
根据项目README中的实验数据:
- 查询成功率:首次尝试86%,单次优化后98%
- 数据规模:支持36,000+条记录的数据集
- 查询复杂度:支持复杂聚合和窗口函数
- 集成能力:与Python可视化工具良好集成
2. 学习目标
2.1 核心学习目标
通过深入分析Virtual Ontology项目,学习者应该能够:
- 理解虚拟本体架构:掌握如何通过轻量级本体定义业务概念与数据库结构的映射关系
- 掌握自然语言到SQL转换:理解LLM如何结合本体规范将业务问题转换为SQL查询
- 学习API设计模式:掌握FastAPI构建安全SQL查询接口的最佳实践
- 理解模式学习机制:学习如何从成功查询中提取可复用模式
2.2 核心代码学习路径
路径1:本体定义与映射
- 文件:
ontology/ontology_spec.yaml- 业务概念定义
- 文件:
ontology/database_schema.yaml- 数据库结构映射
- 学习重点:如何定义类、关系、属性和业务规则
路径2:API服务实现
- 文件:
api/main.py- FastAPI主服务
- 文件:
api/models.py- 数据模型定义
- 文件:
api/database.py- 数据库连接与初始化
- 学习重点:SQL查询接口设计、安全控制、错误处理
路径3:查询执行与日志
- 文件:
query-log.sh- 查询执行脚本
- 学习重点:查询日志记录、意图捕获、模式提取
路径4:模式学习
- 文件:
ontology/learned_ontology_traversal_patterns.yaml- 学习到的查询模式
- 学习重点:如何从成功查询中提取可复用模式
3. 目录结构分析
virtual-ontology/
├── api/ # API服务层
│ ├── main.py # FastAPI主应用,提供SQL查询接口
│ ├── models.py # SQLModel数据模型定义
│ └── database.py # 数据库连接、表创建、数据导入
│
├── ontology/ # 本体定义层
│ ├── ontology_spec.yaml # 业务本体规范(类、关系、属性、规则)
│ ├── database_schema.yaml # 数据库结构映射配置
│ └── learned_ontology_traversal_patterns.yaml # 学习到的查询模式库
│
├── data/ # 数据文件
│ ├── mes_data_sample.csv # MES数据样本
│ └── mes_data_with_kpis.csv # 包含KPI的完整MES数据
│
├── utils/ # 工具脚本
│ ├── generate_database_schema.py # 从API生成数据库schema YAML
│ ├── verify_alignment.py # 验证本体与数据库对齐
│ ├── extract_queries.py # 提取查询日志
│ └── cross_check_api_schema.py # API schema交叉检查
│
├── templates/ # 配置模板
│ ├── database_schema_template.yaml
│ ├── ontology_spec_template.yaml
│ └── validation/ # 验证规则
│ ├── ontology_validator.json
│ └── schema_validator.json
│
├── reference/ # 参考文档
│ ├── MES_QUERY_GUIDE.md # MES查询指南
│ ├── MES_30_QUERY_EXPERIMENT.md # 30个查询实验记录
│ └── conceptual_posmortem.md # 概念后验分析
│
├── api.sh # API服务管理脚本(启动/停止/状态)
├── query-log.sh # SQL查询执行与日志记录脚本
├── sys_prompt.md # 系统提示词(LLM指令)
├── requirements.txt # Python依赖
└── README.md # 项目说明文档
3.1 关键目录说明
api/ - API服务层
- 提供RESTful接口执行SQL查询
- 实现安全控制(仅允许SELECT语句)
- 处理查询结果格式化与返回
ontology/ - 语义层核心
ontology_spec.yaml:定义业务概念、关系、属性、业务规则
database_schema.yaml:映射业务概念到数据库列
learned_ontology_traversal_patterns.yaml:存储成功查询模式
utils/ - 工具层
- 自动化schema生成与验证
- 查询模式提取与分析
reference/ - 知识库
- 查询最佳实践
- 实验记录与分析
4. 关键文件清单
4.1 核心业务逻辑文件
| 文件路径 | 功能描述 | 关键代码行数 |
|
| FastAPI主应用,SQL查询接口 | 195行 |
|
| MESData数据模型定义 | 27行 |
|
| 数据库连接与数据导入 | 63行 |
|
| 业务本体规范定义 | 475行 |
|
| 数据库结构映射 | 158行 |
4.2 配置与脚本文件
| 文件路径 | 功能描述 |
|
| LLM系统提示词,定义分析工作流 |
|
| 查询执行与日志记录脚本(374行) |
|
| API服务生命周期管理脚本(315行) |
|
| Python依赖清单 |
4.3 模式学习文件
| 文件路径 | 功能描述 |
|
| 23个可复用查询模式(615行) |
4.4 工具脚本文件
| 文件路径 | 功能描述 |
|
| 从API自动生成数据库schema |
|
| 验证本体与数据库对齐 |
|
| 从日志提取成功查询用于模式分析 |
5. 技术栈分析
5.1 核心技术栈
# requirements.txt
fastapi==0.115.5 # Web框架,提供RESTful API
uvicorn[standard]==0.32.1 # ASGI服务器
sqlmodel==0.0.22 # ORM框架,基于SQLAlchemy和Pydantic
pandas==2.2.3 # 数据处理,用于CSV导入
python-multipart==0.0.17 # 文件上传支持
5.2 技术选型理由
FastAPI + Uvicorn
- 高性能异步Web框架
- 自动生成OpenAPI文档
- 类型提示支持,开发体验好
SQLModel
- 结合SQLAlchemy和Pydantic优势
- 类型安全的数据模型
- 支持数据库迁移
SQLite
- 轻量级,无需独立服务
- 适合原型和中小规模数据
- 便于部署和分发
YAML配置
- 人类可读的配置格式
- 支持复杂嵌套结构
- 易于版本控制
5.3 架构模式
分层架构
┌─────────────────────────────────┐
│ 自然语言查询层 (LLM + 本体) │
├─────────────────────────────────┤
│ API服务层 (FastAPI) │
├─────────────────────────────────┤
│ 数据访问层 (SQLModel) │
├─────────────────────────────────┤
│ 数据存储层 (SQLite) │
└─────────────────────────────────┘
语义映射模式
- 业务概念 → 本体类(ontology_spec.yaml)
- 本体属性 → 数据库列(database_schema.yaml)
- 业务规则 → SQL提示(business_rules)
6. 系统架构图
6.1 整体系统架构
6.2 核心功能数据流图
6.3 查询执行活动图
6.4 API服务状态图

7. 核心组件实现
7.1 数据模型定义(api/models.py)
核心数据模型定义了MES数据的完整结构:
class MESData(SQLModel, table=True):



