简介这是一套面向计算机相关专业学生与Python开发者的医疗知识图谱问答系统完整源码可直接用于毕业设计、期末大作业或课程设计。项目以医疗领域知识图谱为核心融合意图识别、命名实体识别与知识抽取等模块构建了从问句理解到答案检索的完整链路代码注释详尽新手也能读懂并快速部署运行。资源包共70个文件约51.62MB其中32个py源码文件承载核心业务逻辑8个json与5个pkl文件用于数据与模型存储6个docx文档辅助说明另含bat启动脚本与txt使用说明目录结构清晰便于按模块查阅。目前已有95人学习关注。项目经过严格调试功能完善、界面美观、操作简单读者可据此掌握知识图谱构建、BERT意图分类、BiLSTM实体识别等关键实现并直接作为高分毕设方案参考与二次开发基础。1. 医疗知识图谱问答系统源码从解压到跑通我踩过的第一个坑这套 Python 医疗知识图谱问答系统源码是我近期帮一位做毕业设计的同学部署时接触到的。他拿到压缩包后第一反应是「直接双击 local.py 就能跑吧」结果 Python 版本不对、依赖没装、BERT 模型路径没配报错刷了满屏。这类项目在毕业设计、期末大作业里非常常见——功能完整、界面能看、代码有注释但环境配置这一步卡住了不少人。它本质上是一个基于知识图谱的医疗问答系统包含意图识别、命名实体识别、图谱构建和前端交互几个模块适合想拿它做毕设或课程设计的开发者。装不好你连登录界面都看不到装对了它就是一个能直接演示的完整系统。这篇笔记按「装什么版本 → 怎么装 → 怎么配 → 坏了怎么救」的顺序走一遍尽量让新手照着敲也能跑起来。2. 环境准备Python 版本、依赖清单和目录结构先对齐2.1 版本选择为什么我建议 Python 3.7 而不是 3.10这套源码里用到了itchat、sklearn、bilstm以及 BERT 相关的意图识别模块。itchat这个库在 Python 3.8 之后基本停更3.10 以上安装时容易遇到collections模块兼容性问题。我实测下来Python 3.7.9 是最稳的版本其次是 3.6.8。如果你用 3.9 或 3.10sklearn和bilstm的某些旧接口会报AttributeError改起来很费时间。常见做法是直接用 conda 建一个独立环境避免污染系统 Python# 创建 Python 3.7.9 的虚拟环境名字叫 medkg conda create -n medkg python3.7.9 # 激活环境 conda activate medkg # 确认版本 python --version逻辑说明conda create -n指定环境名和 Python 版本-n后面跟环境名。激活后所有 pip 安装都只影响这个环境。如果你没有 conda用python -m venv medkg也可以但 Python 版本必须提前装好 3.7.9。提示不要用系统自带的 Python 直接装依赖后期排错时你分不清是系统包冲突还是项目本身的问题。2.2 依赖安装requirements.txt 里没写全的包源码根目录有requirements.txt但根据我实际部署的经验它漏了几个关键包。先按文件装一遍# 进入项目根目录 cd 基于医疗知识图谱的问答系统 # 安装基础依赖 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple装完后大概率还会缺这几个itchat、pymysql、flask、tensorflow1.15或torch看 bilstm 用的是哪个框架。我一般会补一条# 补装常见缺失包指定清华源加速 pip install itchat pymysql flask tensorflow1.15 -i https://pypi.tuna.tsinghua.edu.cn/simple参数说明-i指定国内镜像源不换源的话 tensorflow 这种大包下载很慢。tensorflow1.15是配合 Python 3.7 的最后一个 1.x 版本2.x 的 API 和源码里的bilstm不兼容。2.3 目录结构先认清哪个文件是入口解压后目录大致是这样基于医疗知识图谱的问答系统/ ├── local.py # 主入口启动问答服务 ├── itchat_app.py # 微信交互入口可选 ├── requirements.txt # 依赖清单 ├── 使用说明.txt # 作者写的简要说明 ├── nlu/ # 意图识别模块 │ ├── intent_recg_bert/ # BERT 意图识别 │ └── sklearn_Classification/ # sklearn 分类 ├── build_kg/ # 知识图谱构建 │ ├── build_kg_utils.py │ └── knowledge_extraction/ # 实体抽取含 bilstm ├── utils/ # 工具函数 │ ├── json_utils.py │ └── modules.py └── logs/ # 日志目录local.py是主入口run_ner_service.bat和run_intent_recog_service.bat是两个 Windows 批处理启动脚本分别启动命名实体识别服务和意图识别服务。如果你在 Linux 或 macOS 上跑需要把.bat里的命令手动执行一遍。3. 配置与启动BERT 模型路径、服务端口和三个启动顺序3.1 配置文件config.py 里改哪几个参数build_kg/knowledge_extraction/config.py和nlu/intent_recg_bert/下都有配置文件。我一般先全局搜一遍path和port这两个关键词# 示例config.py 中常见的路径配置 BERT_MODEL_PATH ./nlu/intent_recg_bert/chinese_L-12_H-768_A-12 # BERT 预训练模型目录 NER_MODEL_PATH ./build_kg/knowledge_extraction/bilstm/saved_model # 训练好的 NER 模型 MYSQL_HOST 127.0.0.1 MYSQL_PORT 3306 MYSQL_USER root MYSQL_PASSWORD your_password # 改成你自己的 MYSQL_DB medical_kg逻辑说明BERT_MODEL_PATH指向 BERT 预训练模型文件夹源码包里通常不会带这个模型太大需要你单独下载chinese_L-12_H-768_A-12放到对应目录。NER_MODEL_PATH如果源码里带了saved_model就直接用没带的话需要先跑训练脚本。数据库配置改成你本地 MySQL 的实际账号密码。注意BERT 模型文件夹里必须有bert_config.json、vocab.txt和bert_model.ckpt三个文件缺一个都会在启动时报NotFoundError。3.2 启动顺序先 NER再意图识别最后 local.py这套系统的启动是有顺序的搞反了会连不上服务。正确顺序# 第一步启动命名实体识别服务Windows 下双击 run_ner_service.bat # Linux/macOS 下手动执行 python build_kg/knowledge_extraction/run_ner_service.py # 第二步启动意图识别服务 python nlu/intent_recg_bert/run_intent_recog_service.py # 第三步启动主问答入口 python local.py参数说明前两个服务默认监听本地端口常见是 5000 和 5001local.py会去请求这两个端口。如果你改了端口记得同步改local.py里的请求地址。启动后看到Running on http://127.0.0.1:5000这类输出说明服务起来了。3.3 数据库初始化建库、导表、灌数据知识图谱的数据存在 MySQL 里。先建库CREATE DATABASE medical_kg DEFAULT CHARACTER SET utf8mb4; USE medical_kg; -- 然后导入源码里附带的 .sql 文件如果有 -- source /path/to/medical_kg.sql;如果源码里没有.sql文件需要跑build_kg/build_kg_utils.py里的建表逻辑或者手动根据modules.py里的模型定义建表。我一般会先看modules.py里有没有 SQLAlchemy 的Base.metadata.create_all()有的话直接跑一次就能自动建表。4. 避坑与排查五个让我加班到凌晨的报错4.1 报错ModuleNotFoundError: No module named itchat现象启动itchat_app.py时直接报找不到模块。 原因requirements.txt里没写itchat或者你装的时候网络超时没装上。 解决pip install itchat单独装一次。如果还报错检查是不是装到了系统 Python 而不是虚拟环境里用which pip确认一下。4.2 报错ValueError: Tensor Tensor(...) is not an element of this graph现象意图识别服务跑起来后第一次请求正常第二次就崩。 原因TensorFlow 1.x 的图默认图冲突Flask 多线程下常见。 解决在加载模型后加一句graph tf.get_default_graph()每次预测时用with graph.as_default():包住。这是 TensorFlow 1.x 的老毛病源码里如果没处理手动补上。4.3 报错pymysql.err.OperationalError: (1045, Access denied for user)现象连数据库被拒。 原因config.py里的 MySQL 密码和你本地不一致或者 MySQL 没开远程访问权限。 解决先确认本地 MySQL 能用mysql -u root -p登录然后把config.py里的密码改成一致的。如果 MySQL 是 8.0 版本还要注意caching_sha2_password认证插件的问题改成mysql_native_password更稳。4.4 报错OSError: [E050] Cant find model zh_core_web_sm现象跑实体抽取时报找不到 spaCy 模型。 原因源码里用了 spaCy 做辅助分词但模型没装。 解决python -m spacy download zh_core_web_sm。如果下载慢去 GitHub 找对应的 whl 文件手动装。4.5 启动后浏览器打不开或页面空白现象local.py显示运行中但访问127.0.0.1:5000没反应。 原因Flask 默认只监听127.0.0.1如果你在虚拟机或容器里跑需要改成0.0.0.0。 解决在local.py最后一行app.run()里加参数host0.0.0.0, port5000。另外检查防火墙有没有放行端口。5. 验证跑通三条命令确认系统真的活了装完之后别急着演示先按下面三步验证一遍确认每个模块都正常。5.1 验证 NER 服务# 用 curl 测试命名实体识别接口 curl -X POST http://127.0.0.1:5000/ner -H Content-Type: application/json -d {text: 我最近头疼发烧}预期返回类似{entities: [{word: 头疼, type: 症状}, {word: 发烧, type: 症状}]}。如果返回空列表或报错说明 NER 模型没加载成功回去检查NER_MODEL_PATH。5.2 验证意图识别服务curl -X POST http://127.0.0.1:5001/intent -H Content-Type: application/json -d {text: 感冒吃什么药}预期返回意图分类结果比如{intent: 询问用药, confidence: 0.96}。置信度低于 0.5 的话可能是 BERT 模型没加载对或者输入文本太短。5.3 验证主问答流程打开浏览器访问http://127.0.0.1:5000在输入框里问「高血压有什么症状」看能不能返回图谱里的答案。如果页面能打开但问答没结果按 F12 看 Network 里请求哪个接口失败了通常是 NER 或意图识别服务没起来。我一般会把这套验证流程写成一个check.sh每次部署完先跑一遍#!/bin/bash # 快速验证三个服务是否正常 echo 检查 NER 服务... curl -s -X POST http://127.0.0.1:5000/ner -H Content-Type: application/json -d {text:头疼} | grep -q entities echo NER OK || echo NER FAIL echo 检查意图识别服务... curl -s -X POST http://127.0.0.1:5001/intent -H Content-Type: application/json -d {text:感冒吃什么药} | grep -q intent echo Intent OK || echo Intent FAIL echo 检查主服务... curl -s http://127.0.0.1:5000 | grep -q html echo Main OK || echo Main FAIL从那以后我每次部署这类 Flask BERT 知识图谱的项目都强制走一遍「先 curl 接口、再开浏览器」的验证流程不靠肉眼判断。希望这套笔记能帮你少走点弯路顺利把系统跑起来。本文还有配套的精品资源点击获取