简介:本资源为基于Python的医疗知识图谱问答系统完整源码,面向计算机相关专业学生及需要完成毕业设计、期末大作业或课程设计的开发者。项目围绕医疗领域知识图谱构建与智能问答展开,涵盖意图识别、命名实体识别、知识抽取与图谱构建等核心模块,代码注释详尽,新手也能理解与部署。压缩包共70个文件,以32个py源码文件为主,辅以json数据、pkl模型、docx文档及bat启动脚本,整体约51.62MB,目录结构清晰,便于按模块查阅。已有95人学习关注。项目经过严格调试,可直接运行,读者能获得一套可复用的问答系统实现方案,理解从数据预处理、模型训练到服务启动的完整链路,并参考其意图分类与实体识别思路进行二次开发,对毕业设计答辩与课程实践具有较高参考价值。
1. 医疗知识图谱问答系统源码部署:从解压到跑通的第一道坎
很多同学拿到这份 Python 医疗知识图谱问答系统源码时,第一反应是双击local.py,然后被一连串ModuleNotFoundError糊脸。这套项目在毕业设计里算功能完整的:NLU 意图识别、BERT 意图分类、BiLSTM 命名实体识别、知识图谱构建、itchat 微信接入,模块拆得清楚,代码注释也到位。但它不是那种pip install就能跑的单文件脚本,环境依赖、模型文件、数据路径、服务启动顺序,任何一环没对齐都会卡住。我见过太多人卡在intent_recg_bert加载失败或者build_kg跑不出图谱,最后放弃。这篇笔记按我实际部署的流程走一遍,从 Python 版本选型到服务验证,把每个坑标出来。适合准备拿它做毕设、课程设计,或者想跑通一套完整 KGQA 链路的开发者。
2. 环境准备:Python 版本、依赖清单与目录结构核对
2.1 Python 版本选择与虚拟环境创建
这套源码里同时出现了sklearn_Classification、bilstm、intent_recg_bert三套模型相关代码,还有itchat这种对 Python 版本比较敏感的老库。我实测下来,Python 3.7 或 3.8 最稳,3.9 以上在装itchat和部分旧版torch时容易出兼容问题。如果你用 3.10+,sklearn的某些旧 API 和itchat的itchat.auto_login()可能直接报错。
先建虚拟环境,别往系统 Python 里灌:
# 用 conda 建一个 3.8 环境,命名 kgqa conda create -n kgqa python=3.8 -y conda activate kgqa # 如果习惯 venv,也可以: # python3.8 -m venv kgqa_env # source kgqa_env/bin/activate # Linux/macOS # kgqa_env\Scripts\activate # Windows逻辑说明:虚拟环境隔离掉系统里已有的包版本冲突,尤其是numpy、scipy、scikit-learn这几个在医疗 KG 项目里版本敏感。参数上python=3.8是硬约束,别图新。
2.2 requirements.txt 依赖安装与版本锁定
项目根目录有requirements.txt,但直接pip install -r大概率会卡在torch或transformers的版本解析上。我一般先看一遍文件内容,把明显不兼容的版本号手动调一下。
# 先升级 pip,避免旧版解析器抽风 pip install --upgrade pip # 安装依赖,建议加国内源加速 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 如果 torch 装不上,单独指定 CPU 版本(毕设环境通常没 GPU) pip install torch==1.8.0+cpu torchvision==0.9.0+cpu -f https://download.pytorch.org/whl/torch_stable.html逻辑说明:requirements.txt里通常包含torch、transformers、scikit-learn、pandas、numpy、itchat、flask等。-i指定清华源是为了避免下载超时。torch单独装 CPU 版是因为很多同学本地没 CUDA,装 GPU 版会报CUDA not available然后卡住。
参数说明:torch==1.8.0+cpu对应 Python 3.8 和 transformers 4.x 的兼容区间。如果你用 3.7,可以降到torch==1.6.0。transformers版本建议锁在4.6.0左右,太新会改BertTokenizer的调用方式。
2.3 目录结构核对与数据路径确认
解压后先别急着跑,把目录树看一遍。源码里关键路径包括:
| 目录/文件 | 作用 | 部署注意 |
|---|---|---|
local.py | 本地问答入口 | 启动前确认模型路径 |
nlu/ | 意图识别与实体识别 | 含intent_recg_bert、bilstm |
build_kg/ | 知识图谱构建 | 依赖knowledge_extraction |
itchat_app.py | 微信接入 | 可选,不影响本地问答 |
modules.py | 核心模块 | 检查 import 路径 |
requirements.txt | 依赖清单 | 先装再跑 |
使用说明.txt | 原始说明 | 参考但别全信 |
常见做法是先把build_kg跑通,生成图谱数据,再启动 NLU 服务,最后跑local.py。顺序反了会报KeyError或FileNotFoundError。
3. 知识图谱构建:build_kg 模块配置与数据生成
3.1 知识抽取配置:knowledge_extraction 与 bilstm 模型加载
build_kg目录下的build_kg_utils.py和knowledge_extraction是图谱构建的核心。它依赖bilstm做命名实体识别,从医疗文本里抽疾病、症状、药物、检查项等实体。先确认bilstm目录下有训练好的模型文件(通常是.pth或.h5),没有的话需要先跑训练脚本。
# 示例:检查 bilstm 模型加载路径(在 build_kg_utils.py 里找类似代码) import torch from bilstm.models import BiLSTM_CRF # 模型路径通常写死在 config.py 或 build_kg_utils.py 里 model_path = "./bilstm/saved_model/bilstm_medical.pth" model = BiLSTM_CRF(vocab_size=5000, tag_size=10, embedding_dim=128, hidden_dim=256) model.load_state_dict(torch.load(model_path, map_location="cpu")) model.eval()逻辑说明:map_location="cpu"是防止在无 GPU 机器上加载时报 CUDA 错误。vocab_size和tag_size必须和训练时一致,不一致会报size mismatch。如果源码里没有预训练模型,需要先跑bilstm下的训练脚本,用processed_data里的数据。
参数说明:embedding_dim和hidden_dim在config.py里通常有定义,别自己改。tag_size对应实体标签数量,医疗场景一般是 8-12 个。
3.2 图谱数据生成:运行 build_kg 并检查输出
配置好模型路径后,跑图谱构建脚本。通常入口是build_kg/__init__.py或build_kg_utils.py里的main。
# 在项目根目录执行 python -m build_kg.build_kg_utils # 或者如果入口在 __init__.py python -c "from build_kg import build_kg_utils; build_kg_utils.build_graph()"逻辑说明:这一步会读取knowledge_extraction抽出的实体和关系,写入图数据库或本地文件(常见是neo4j或json/csv)。如果报ConnectionRefusedError,说明源码默认连了 Neo4j,需要改成本地文件存储,或者启动 Neo4j 服务。
参数说明:config.py里通常有NEO4J_URI、NEO4J_USER、NEO4J_PASSWORD。如果不想装 Neo4j,把存储方式改成json,在build_kg_utils.py里找save_to_neo4j函数,替换成save_to_json。
提示:图谱构建完成后,检查输出目录是否有
graph.json或entities.csv,文件大小不为 0 才算成功。
3.3 常见构建失败与数据路径修复
如果build_kg跑完没报错但没输出文件,大概率是数据路径写错了。源码里常用相对路径./data/processed_data,但解压后目录层级可能多一层。我一般用os.path.abspath打印当前工作目录,再核对。
import os print(os.getcwd()) print(os.listdir("./data"))逻辑说明:确认processed_data在不在当前目录下。如果不在,改config.py里的DATA_DIR为绝对路径。别用../这种相对路径,换台机器就崩。
4. NLU 服务启动:意图识别与实体识别模块配置
4.1 意图识别服务:intent_recg_bert 与 sklearn_Classification
nlu目录下有两套意图识别方案:intent_recg_bert用 BERT 做分类,sklearn_Classification用传统机器学习。毕设里通常用 BERT 那套,准确率高但吃内存。启动前确认bert-base-chinese模型已下载到本地,或者代码里写了from_pretrained("bert-base-chinese")会自动下载。
# 启动意图识别服务(Windows 用 .bat,Linux/macOS 直接跑 python) # run_intent_recog_service.bat 内容通常是: python nlu/intent_recg_bert/service.py --port 5001 --model_path ./nlu/intent_recg_bert/saved_model逻辑说明:--port指定服务端口,--model_path指向微调后的 BERT 模型。如果没微调过,用bert-base-chinese也能跑,但意图分类准确率会低。service.py里通常用 Flask 或 FastAPI 起 HTTP 服务,供local.py调用。
参数说明:--port 5001别和系统其他服务冲突。--model_path如果报OSError: Can't load config,说明模型文件不全,需要重新下载或训练。
4.2 实体识别服务:run_ner_service.bat 与 BiLSTM 推理
实体识别服务单独起,run_ner_service.bat里通常是:
python nlu/bilstm/ner_service.py --port 5002 --model_path ./nlu/bilstm/saved_model/bilstm_medical.pth逻辑说明:ner_service.py加载 BiLSTM-CRF 模型,对外提供/ner接口,输入句子返回实体列表。local.py会同时调 5001 和 5002 两个服务,先识别意图,再抽实体,最后查图谱。
参数说明:--model_path必须和build_kg里用的是同一个模型,否则实体标签对不上。--port 5002同理别冲突。
4.3 服务启动顺序与端口冲突排查
正确顺序:先build_kg生成图谱 → 再起ner_service→ 再起intent_recog_service→ 最后跑local.py。如果端口被占,用netstat -ano | findstr 5001(Windows)或lsof -i:5001(Linux/macOS)查。
# Linux/macOS 查端口 lsof -i:5001 kill -9 <PID> # Windows 查端口 netstat -ano | findstr 5001 taskkill /PID <PID> /F逻辑说明:kill -9强制杀进程,taskkill /F同理。别用kill -15,有时候服务不响应。
5. 避坑与排查:部署医疗 KGQA 源码时最容易翻车的 5 个点
5.1 现象:ModuleNotFoundError: No module named 'itchat'
原因:itchat没装,或者 Python 版本太高导致itchat装不上。itchat最后更新在 2020 年,Python 3.9+ 装的时候会报Use setuptools_scm之类的错。
解决:降 Python 到 3.8,或者用pip install itchat --no-build-isolation。如果还不行,直接注释掉itchat_app.py里的 import,本地问答不需要微信接入。
5.2 现象:torch.load 报 RuntimeError: Attempting to deserialize object on a CUDA device
原因:模型在 GPU 上训练保存,加载时机器没 GPU。
解决:torch.load(path, map_location=torch.device('cpu'))。所有torch.load都加map_location。
5.3 现象:BERT 模型下载卡住或报 ConnectionError
原因:from_pretrained("bert-base-chinese")默认从外网拉,网络不稳就卡。
解决:手动下载bert-base-chinese的pytorch_model.bin、config.json、vocab.txt,放到本地目录,然后把代码里的from_pretrained("bert-base-chinese")改成from_pretrained("./bert-base-chinese")。
5.4 现象:build_kg 跑完图谱为空,local.py 查不到答案
原因:knowledge_extraction抽出的实体没写进图谱,或者图谱存储路径和local.py读取路径不一致。
解决:检查build_kg_utils.py里的save_path和local.py里的load_path是否指向同一个文件。我一般会在两个文件里都打印os.path.abspath确认。
5.5 现象:local.py 启动后输入问题没反应,日志显示 500
原因:NLU 服务没起,或者端口对不上。local.py里通常写死了http://127.0.0.1:5001和5002。
解决:先curl http://127.0.0.1:5001/health看服务活没活。没活就回去看run_intent_recog_service.bat的报错。端口改了的话,同步改local.py里的请求地址。
6. 验证跑通:从 local.py 到完整问答链路的最后一公里
装完不是终点,能跑通一条完整问答才算。我一般按这个顺序验证:
第一步:单独测 NLU 服务。起完ner_service和intent_recog_service后,用curl直接打接口:
# 测意图识别 curl -X POST http://127.0.0.1:5001/predict -H "Content-Type: application/json" -d '{"text": "感冒吃什么药"}' # 测实体识别 curl -X POST http://127.0.0.1:5002/ner -H "Content-Type: application/json" -d '{"text": "感冒吃什么药"}'预期返回:意图识别返回{"intent": "drug_recommend", "confidence": 0.95}之类;实体识别返回{"entities": [{"word": "感冒", "type": "disease"}]}。如果返回空或报错,先修服务,别往下走。
第二步:测图谱查询。在 Python 里直接调图谱查询函数:
from build_kg.build_kg_utils import query_graph result = query_graph("感冒", relation="推荐药物") print(result)预期返回药物列表。如果返回None,说明图谱里没这个实体,回去检查build_kg的输出。
第三步:跑 local.py 完整链路。前两步都通了,再跑local.py:
python local.py输入「感冒吃什么药」,预期输出类似「感冒推荐药物:感冒灵、板蓝根」。如果输出乱码或空,看日志里 NLU 返回的意图和实体对不对,再对图谱查询结果。
第四步:检查 itchat_app.py(可选)。如果要做微信接入,跑itchat_app.py,扫码登录后发消息测试。但毕设答辩通常本地问答就够,微信接入容易因为登录限制翻车,建议作为加分项而非必选项。
注意:每次改完配置,重启所有服务再测。别只重启
local.py,NLU 服务缓存了旧模型。
从那以后我每次部署这类 KGQA 项目,都强制走一遍「NLU 单测 → 图谱单测 → 全链路」的验证流程,不跳过任何一步。希望帮到你。
本文还有配套的精品资源,点击获取