医药知识图谱问答系统 - 项目介绍文档

一、项目概述

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 系统配置
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐