【知识图谱】医药知识图谱问答系统 - 项目介绍文档
本项目是一个基于知识图谱的医药问答系统,旨在帮助理解知识图谱的构建流程、关键技术和实际应用。系统采用前后端分离架构,后端使用FastAPI + Neo4j + MySQL,前端使用Vue3 + Element Plus。
·
医药知识图谱问答系统 - 项目介绍文档
一、项目概述
1.1 项目简介
本项目是一个基于知识图谱的医药问答系统,旨在帮助理解知识图谱的构建流程、关键技术和实际应用。系统采用前后端分离架构,后端使用FastAPI + Neo4j + MySQL,前端使用Vue3 + Element Plus。
1.2 核心功能
| 功能模块 | 功能描述 | 核心技术 |
|---|---|---|
| 知识图谱可视化 | 交互式浏览和搜索知识图谱 | vis-network |
| 智能问答 | 基于GraphRAG的自然语言问答 | LangChain + LLM |
| NLP处理 | 实体抽取、关系抽取、三元组生成 | jieba + 规则匹配 |
| 图谱构建 | 文件导入、手动编辑、Cypher执行 | py2neo |
| 系统管理 | 用户管理、日志记录、配置管理 | SQLAlchemy |
1.3 系统架构图
┌─────────────────────────────────────────────────────────────────┐
│ 前端 (Vue3 + Element Plus) │
│ ┌──────────┬──────────┬──────────┬──────────┬──────────┐ │
│ │ 首页 │ 知识图谱 │ 智能问答 │ NLP处理 │ 系统管理 │ │
│ │ Dashboard│ GraphView│ QAView │ NLPView │SystemView│ │
│ └──────────┴──────────┴──────────┴──────────┴──────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ HTTP API
▼
┌─────────────────────────────────────────────────────────────────┐
│ 后端 (FastAPI) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ API路由层 (api/) │ │
│ │ kg.py │ qa.py │ nlp.py │ system.py │ config.py │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 业务服务层 (services/) │ │
│ │ kg_service │ qa_service │ nlp_service │ config_service │ │
│ └─────────────────────────────────────────────────────────┘ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 数据访问层 (kg/, models/) │ │
│ │ neo4j_client │ graph_builder │ SQLAlchemy Models │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│ │
▼ ▼
┌───────────────┐ ┌───────────────┐
│ Neo4j │ │ MySQL │
│ (知识图谱) │ │ (业务数据) │
└───────────────┘ └───────────────┘
1.4 技术选型理由
| 技术 | 选择理由 |
|---|---|
| FastAPI | 高性能、自动API文档、类型提示友好 |
| Neo4j | 专业图数据库、Cypher查询强大、社区活跃 |
| Vue3 | 组合式API、性能优秀、生态完善 |
| vis-network | 轻量级、交互性好、配置灵活 |
| Element Plus | 组件丰富、文档完善、Vue3原生支持 |
二、技术栈详解
2.1 后端技术栈
| 技术 | 是什么 | 能做什么 | 项目中的应用场景 |
|---|---|---|---|
| FastAPI | Python高性能Web框架 | 快速构建RESTful API,支持异步、自动生成API文档 | 作为后端主框架,处理所有HTTP请求,提供/docs交互式API文档 |
| py2neo | Neo4j的Python ORM库 | 用Python对象方式操作Neo4j,无需直接写Cypher | 封装图数据库操作,类似Java中的MyBatis |
| neo4j-driver | Neo4j官方Python驱动 | 原生方式执行Cypher查询,性能更高 | 处理复杂图查询场景 |
| SQLAlchemy | Python SQL ORM框架 | 用Python类定义数据库表,自动生成SQL | 操作MySQL,管理用户、日志等结构化数据 |
| jieba | 中文分词库 | 将中文文本切分成词语 | 实体抽取时对文本进行分词处理 |
| LangChain | LLM应用开发框架 | 串联LLM、向量库、工具等构建AI应用 | 实现GraphRAG问答流程 |
| dashscope | 通义千问官方SDK | 调用阿里云通义千问大模型API | 问答增强,生成自然语言回答 |
| Pydantic | 数据验证库 | 定义数据模型,自动验证和序列化 | API请求/响应数据校验 |
| uvicorn | ASGI服务器 | 运行FastAPI应用 | 启动后端服务 |
2.2 前端技术栈
| 技术 | 是什么 | 能做什么 | 项目中的应用场景 |
|---|---|---|---|
| Vue 3 | 渐进式JavaScript框架 | 构建用户界面,组件化开发 | 整个前端应用的基础框架 |
| TypeScript | JavaScript的超集 | 添加类型系统,提高代码可维护性 | 前端代码开发语言 |
| Vite | 下一代前端构建工具 | 极速冷启动、热更新 | 前端开发服务器和打包工具 |
| Element Plus | Vue 3 UI组件库 | 提供美观的UI组件(按钮、表格、表单等) | 构建管理后台界面 |
| vis-network | 网络可视化库 | 绘制交互式网络图 | 知识图谱可视化展示的核心库 |
| ECharts | 数据可视化库 | 绑制各种图表(饼图、柱状图等) | 首页统计图表展示 |
| Pinia | Vue状态管理库 | 管理全局状态 | 存储用户信息、全局配置 |
| Vue Router | Vue官方路由库 | 实现单页应用路由跳转 | 页面导航 |
| Axios | HTTP客户端 | 发送HTTP请求 | 前端调用后端API |
2.3 数据库
| 数据库 | 类型 | 用途 | 项目中的应用 |
|---|---|---|---|
| Neo4j | 图数据库 | 存储实体和关系,擅长关系查询 | 存储知识图谱(疾病、症状、药品及其关系) |
| MySQL | 关系数据库 | 存储结构化数据,支持事务 | 存储用户、日志、配置等业务数据 |
2.4 LLM大模型
| 模型 | 提供商 | 特点 | 获取方式 |
|---|---|---|---|
| 通义千问 | 阿里云 | 国内访问稳定,免费额度大 | https://dashscope.console.aliyun.com/ |
| DeepSeek | 深度求索 | 性价比高,支持OpenAI接口格式 | https://platform.deepseek.com/ |
| OpenAI | OpenAI | 效果最好,需科学上网 | https://platform.openai.com/ |
三、依赖说明
3.1 后端依赖 (requirements.txt)
# ==================== Web框架 ====================
fastapi==0.109.0 # Web框架:处理HTTP请求,自动生成API文档
uvicorn[standard]==0.27.0 # ASGI服务器:运行FastAPI应用
python-multipart==0.0.6 # 文件上传:处理multipart/form-data请求
# ==================== Neo4j图数据库 ====================
py2neo==2021.2.4 # Neo4j ORM:用Python对象操作图数据库(类似MyBatis)
neo4j==5.17.0 # Neo4j官方驱动:执行原生Cypher查询
# ==================== MySQL关系数据库 ====================
pymysql==1.1.0 # MySQL驱动:Python连接MySQL
sqlalchemy==2.0.25 # SQL ORM:用Python类操作数据库表
aiomysql==0.2.0 # 异步MySQL:支持异步数据库操作
# ==================== NLP自然语言处理 ====================
jieba==0.42.1 # 中文分词:将句子切分成词语
transformers==4.37.2 # Transformer模型:加载预训练NLP模型
torch==2.1.2 # 深度学习框架:运行神经网络模型
spacy==3.7.2 # NLP工具包:实体识别、依存分析
# ==================== GraphRAG图谱增强检索 ====================
langchain==0.1.5 # LLM应用框架:串联LLM构建AI应用
langchain-openai==0.0.5 # LangChain OpenAI集成
langchain-community==0.0.17 # LangChain社区组件
# ==================== 大语言模型SDK ====================
dashscope==1.14.1 # 通义千问SDK:调用阿里云通义千问API
openai==1.10.0 # OpenAI SDK:调用OpenAI/DeepSeek API
# ==================== 数据处理 ====================
pandas==2.2.0 # 数据分析:处理表格数据(CSV、Excel)
numpy==1.26.3 # 数值计算:数组和矩阵运算
pydantic==2.5.3 # 数据验证:定义数据模型,自动校验
pydantic-settings==2.1.0 # 配置管理:从环境变量加载配置
# ==================== 工具库 ====================
python-dotenv==1.0.0 # 环境变量:从.env文件加载配置
httpx==0.26.0 # HTTP客户端:发送HTTP请求
aiofiles==23.2.1 # 异步文件:异步读写文件
loguru==0.7.2 # 日志库:记录程序运行日志
orjson==3.9.12 # JSON库:高性能JSON序列化
3.2 前端依赖 (package.json)
{
"dependencies": {
"vue": "^3.4.15", // Vue3框架:前端核心框架
"vue-router": "^4.2.5", // 路由:页面跳转导航
"pinia": "^2.1.7", // 状态管理:全局数据共享
"axios": "^1.6.5", // HTTP客户端:调用后端API
"element-plus": "^2.5.3", // UI组件库:按钮、表格、表单等
"@element-plus/icons-vue": "^2.3.1", // Element图标库
"vis-network": "^9.1.9", // 图可视化:绘制知识图谱网络图
"vis-data": "^7.1.9", // vis-network数据结构
"echarts": "^5.4.3", // 图表库:饼图、柱状图
"marked": "^11.1.1", // Markdown解析:渲染MD文档
"@vueuse/core": "^10.7.2" // Vue工具集:常用组合式API
},
"devDependencies": {
"@vitejs/plugin-vue": "^5.0.3", // Vite Vue插件
"typescript": "^5.3.3", // TypeScript语言
"vite": "^5.0.11", // 构建工具
"vue-tsc": "^1.8.27", // Vue TypeScript编译
"sass": "^1.70.0", // CSS预处理器:支持SCSS语法
"unplugin-auto-import": "^0.17.3", // 自动导入:自动import Vue API
"unplugin-vue-components": "^0.26.0" // 组件自动导入
}
}
四、项目结构
medical-kg-qa/
├── backend/ # Python后端
│ ├── app/
│ │ ├── api/ # API路由层
│ │ │ ├── kg.py # 知识图谱API(搜索、查询、构建)
│ │ │ ├── qa.py # 智能问答API
│ │ │ ├── nlp.py # NLP处理API(实体/关系抽取)
│ │ │ └── system.py # 系统管理API(用户、日志)
│ │ ├── core/ # 核心配置
│ │ │ ├── config.py # 应用配置(数据库连接等)
│ │ │ └── database.py # 数据库连接管理
│ │ ├── models/ # 数据模型(MySQL表)
│ │ │ ├── user.py # 用户表
│ │ │ ├── operation_log.py # 操作日志表
│ │ │ └── data_source.py # 数据源表
│ │ ├── services/ # 业务逻辑层
│ │ │ ├── kg_service.py # 知识图谱服务
│ │ │ ├── qa_service.py # 问答服务(GraphRAG核心)
│ │ │ └── nlp_service.py # NLP服务
│ │ ├── kg/ # 知识图谱封装层
│ │ │ ├── neo4j_client.py # Neo4j客户端(类似MyBatis)
│ │ │ ├── graph_builder.py # 图谱构建器
│ │ │ └── query_builder.py # Cypher查询构建器
│ │ └── nlp/ # NLP模块
│ │ ├── entity_extractor.py # 实体抽取器
│ │ └── relation_extractor.py # 关系抽取器
│ ├── data/ # 数据目录
│ │ └── uploads/ # 上传文件存储
│ ├── logs/ # 日志目录
│ ├── requirements.txt # Python依赖
│ ├── main.py # 应用入口
│ └── .env.example # 环境变量示例
├── frontend/ # Vue3前端
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ │ ├── Dashboard.vue # 首页概览
│ │ │ ├── graph/GraphView.vue # 知识图谱展示
│ │ │ ├── qa/QAView.vue # 智能问答
│ │ │ ├── build/BuildView.vue # 图谱构建
│ │ │ ├── nlp/NLPView.vue # NLP处理
│ │ │ └── system/SystemView.vue # 系统管理
│ │ ├── layouts/ # 布局组件
│ │ ├── api/ # API封装
│ │ ├── router/ # 路由配置
│ │ └── styles/ # 样式文件
│ ├── package.json # 前端依赖
│ └── vite.config.ts # Vite配置
├── sql/
│ └── init.sql # MySQL初始化脚本
└── docs/ # 项目文档
├── 项目介绍文档.md
├── 测试指导手册.md
└── 知识图谱构建指南.md
五、环境搭建
5.1 创建Python虚拟环境
# 进入后端目录
cd backend
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows:
venv\Scripts\activate
# Linux/Mac:
source venv/bin/activate
# 安装依赖
python.exe -m pip install --upgrade pip
pip install -r requirements.txt
# 退出虚拟环境
deactivate
5.2 配置环境变量
# 复制环境变量模板
cp .env.example .env
# 编辑.env文件,配置以下内容:
# 1. Neo4j连接信息
# 2. MySQL连接信息
# 3. LLM API Key(选择通义千问或DeepSeek)
5.3 初始化数据库
# MySQL
mysql -u root -p < sql/init.sql
# Neo4j
# 启动Neo4j后,程序会自动创建索引
5.4 启动服务
# 启动后端(在虚拟环境中)
cd backend
venv\Scripts\activate
python main.py
# 后端运行在 http://localhost:8000
# 启动前端(新开终端)
cd frontend
npm install
npm run dev
# 前端运行在 http://localhost:3000
六、模块设计详解
6.1 知识图谱展示模块 (/graph)
功能概述: 可视化浏览和搜索知识图谱
核心技术: vis-network
模块架构:
GraphView.vue (页面组件)
├── 搜索控制栏
│ ├── 关键词搜索
│ ├── 实体类型筛选
│ └── 展示深度控制
├── 搜索结果列表
├── 图谱可视化区域 (vis-network)
└── 节点详情面板
核心代码流程:
用户搜索 → kgApi.search() → 显示结果列表
↓
选择节点 → kgApi.getSubgraph() → vis-network渲染
↓
点击节点 → kgApi.getNodeDetail() → 显示详情
API接口:
| 接口 | 方法 | 功能 |
|---|---|---|
/kg/search |
GET | 搜索节点 |
/kg/subgraph/{label}/{name} |
GET | 获取子图 |
/kg/node/{label}/{name} |
GET | 获取节点详情 |
/kg/labels |
GET | 获取所有标签 |
vis-network配置要点:
- 物理引擎:
forceAtlas2Based,稳定后自动停止 - 节点样式:浅色背景 + 深色边框 + 阴影
- 边样式:弯曲线条,避免重叠
6.2 智能问答模块 (/qa)
功能概述: 基于GraphRAG的自然语言问答
核心技术: GraphRAG = 图谱检索 + LLM生成
模块架构:
QAView.vue (页面组件)
├── 对话历史区域
├── 输入区域
└── 相关知识展示
qa_service.py (后端服务)
├── 意图识别 (intent_classifier)
├── 实体识别 (entity_extractor)
├── 图谱查询 (kg_service)
└── 答案生成 (llm_service)
问答流程详解:
┌─────────────────────────────────────────────────────────────┐
│ 用户问题: "感冒吃什么药?" │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Step 1: 意图识别 │
│ 分析问题类型 → query_common_drug (查询常用药) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Step 2: 实体识别 │
│ 提取实体 → 感冒 (Disease) │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Step 3: 图谱查询 │
│ MATCH (d:Disease {name:'感冒'})-[:common_drug]->(m) │
│ RETURN m.name │
│ 结果: ['感冒灵', '布洛芬', '板蓝根'] │
└─────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────┐
│ Step 4: 答案生成 (LLM) │
│ 输入: 查询结果 + 问题 │
│ 输出: "感冒常用的药物有感冒灵、布洛芬、板蓝根等, │
│ 建议在医生指导下用药。" │
└─────────────────────────────────────────────────────────────┘
支持的意图类型:
| 意图代码 | 问题示例 | Cypher模式 |
|---|---|---|
| query_symptom | “感冒有什么症状” | (d)-[:has_symptom]->(s) |
| query_common_drug | “感冒吃什么药” | (d)-[:common_drug]->(m) |
| query_food | “糖尿病能吃什么” | (d)-[:do_eat]->(f) |
| query_not_food | “高血压不能吃什么” | (d)-[:no_eat]->(f) |
| query_check | “肺炎要做什么检查” | (d)-[:need_check]->(c) |
| query_department | “心脏病挂什么科” | (d)-[:belongs_to]->(dept) |
| query_cause | “糖尿病的病因” | d.cause |
| query_prevent | “如何预防高血压” | d.prevent |
| disease_describe | “什么是冠心病” | d.description |
6.3 图谱构建模块 (/build)
功能概述: 导入数据构建知识图谱
模块架构:
BuildView.vue (页面组件)
├── Tab: 文件上传
│ └── JSON文件导入
├── Tab: 手动添加
│ ├── 添加实体
│ └── 添加关系
├── Tab: Cypher查询
│ └── 执行自定义Cypher
└── Tab: 数据管理
├── 统计信息
└── 清空图谱
graph_builder.py (后端服务)
├── import_from_json() - JSON导入
├── add_entity() - 添加实体
├── add_relation() - 添加关系
└── clear_graph() - 清空图谱
JSON数据格式:
{
"nodes": [
{"label": "Disease", "name": "xxx", "properties": {...}}
],
"relationships": [
{"start_label": "Disease", "start_name": "xxx",
"end_label": "Symptom", "end_name": "yyy",
"type": "has_symptom"}
]
}
6.4 NLP处理模块 (/nlp)
功能概述: 文本分析,抽取实体和关系
模块架构:
NLPView.vue (页面组件)
├── 文本输入区
├── 分析按钮 (实体/关系/三元组/综合)
├── 词典统计
└── 分析结果展示
├── 实体列表 + 导入按钮
├── 关系列表 + 导入按钮
└── 三元组列表 + 导入按钮
nlp_service.py (后端服务)
├── entity_extractor - 实体抽取
├── relation_extractor - 关系抽取
└── triple_extractor - 三元组抽取
实体抽取原理:
输入文本 → jieba分词 → 词典匹配 → 规则过滤 → 实体列表
词典来源:
- 疾病词典 (diseases.txt)
- 症状词典 (symptoms.txt)
- 药品词典 (medicines.txt)
- 食物词典 (foods.txt)
- ...
关系抽取原理:
实体对 + 上下文 → 规则模板匹配 → 关系类型
规则示例:
- "X的症状有Y" → (X, has_symptom, Y)
- "X常用Y治疗" → (X, common_drug, Y)
- "X属于Y科" → (X, belongs_to, Y)
三元组结构:
{
"head": "感冒", // 头实体
"head_type": "Disease", // 头实体类型
"relation": "has_symptom", // 关系
"tail": "发热", // 尾实体
"tail_type": "Symptom" // 尾实体类型
}
6.5 系统管理模块 (/system, /config)
功能概述: 系统配置和监控
模块架构:
SystemView.vue - 系统管理
├── 系统状态监控
├── 用户管理
├── 操作日志
└── 数据源管理
ConfigView.vue - 配置管理
├── Tab: Neo4j配置
├── Tab: MySQL配置
├── Tab: DeepSeek配置
├── Tab: 通义千问配置
└── Tab: LLM提供者选择
配置存储:
- 配置信息存储在MySQL
system_configs表 - 敏感信息(密码、API Key)加密存储
- 支持页面测试连接
6.6 首页概览模块 (/dashboard)
功能概述: 系统数据统计和概览
展示内容:
Dashboard.vue
├── 统计卡片
│ ├── 疾病数量
│ ├── 症状数量
│ ├── 药品数量
│ └── 关系数量
├── 节点类型分布图 (ECharts 饼图)
├── 关系类型分布图 (ECharts 柱状图)
└── 最近操作日志
七、API接口概览
| 模块 | 接口 | 方法 | 功能 |
|---|---|---|---|
| 知识图谱 | /api/v1/kg/search |
GET | 搜索节点 |
| 知识图谱 | /api/v1/kg/node/{label}/{name} |
GET | 获取节点详情 |
| 知识图谱 | /api/v1/kg/subgraph/{label}/{name} |
GET | 获取子图 |
| 知识图谱 | /api/v1/kg/build |
POST | 上传文件构建图谱 |
| 知识图谱 | /api/v1/kg/statistics |
GET | 获取统计信息 |
| 问答 | /api/v1/qa/ask |
POST | 智能问答 |
| 问答 | /api/v1/qa/simple |
GET | 简单问答 |
| NLP | /api/v1/nlp/entities |
POST | 实体抽取 |
| NLP | /api/v1/nlp/relations |
POST | 关系抽取 |
| NLP | /api/v1/nlp/analyze |
POST | 综合分析 |
| 系统 | /api/v1/system/status |
GET | 系统状态 |
完整API文档访问:http://localhost:8000/docs
八、数据模型
8.1 Neo4j图模型
实体类型(节点标签):
| 标签 | 中文 | 属性 |
|---|---|---|
| Disease | 疾病 | name, description, cause, prevent, cure_way |
| Symptom | 症状 | name |
| Medicine | 药品 | name |
| Food | 食物 | name |
| Check | 检查 | name |
| Department | 科室 | name |
| Producer | 生产商 | name |
关系类型:
| 关系 | 中文 | 起点 | 终点 |
|---|---|---|---|
| has_symptom | 症状 | Disease | Symptom |
| common_drug | 常用药 | Disease | Medicine |
| recommand_drug | 推荐药 | Disease | Medicine |
| do_eat | 宜吃 | Disease | Food |
| no_eat | 忌吃 | Disease | Food |
| need_check | 检查 | Disease | Check |
| belongs_to | 所属科室 | Disease | Department |
| acompany_with | 并发症 | Disease | Disease |
8.2 MySQL表结构
| 表名 | 用途 |
|---|---|
| users | 用户信息 |
| operation_logs | 操作日志 |
| data_sources | 数据源记录 |
| entity_types | 实体类型定义 |
| relation_types | 关系类型定义 |
| qa_history | 问答历史 |
| custom_dict | 自定义词典 |
| system_config | 系统配置 |
更多推荐
所有评论(0)