Python医疗知识图谱问答系统源码部署:从环境配置到完整问答链路跑通

📅 发布时间:2026/10/19 10:21:31
Python医疗知识图谱问答系统源码部署:从环境配置到完整问答链路跑通
简介本资源为基于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.10sklearn的某些旧 API 和itchat的itchat.auto_login()可能直接报错。先建虚拟环境别往系统 Python 里灌# 用 conda 建一个 3.8 环境命名 kgqa conda create -n kgqa python3.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 项目里版本敏感。参数上python3.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 torch1.8.0cpu torchvision0.9.0cpu -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然后卡住。参数说明torch1.8.0cpu对应 Python 3.8 和 transformers 4.x 的兼容区间。如果你用 3.7可以降到torch1.6.0。transformers版本建议锁在4.6.0左右太新会改BertTokenizer的调用方式。2.3 目录结构核对与数据路径确认解压后先别急着跑把目录树看一遍。源码里关键路径包括目录/文件作用部署注意local.py本地问答入口启动前确认模型路径nlu/意图识别与实体识别含intent_recg_bert、bilstmbuild_kg/知识图谱构建依赖knowledge_extractionitchat_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_size5000, tag_size10, embedding_dim128, hidden_dim256) model.load_state_dict(torch.load(model_path, map_locationcpu)) model.eval()逻辑说明map_locationcpu是防止在无 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_Classificationnlu目录下有两套意图识别方案intent_recg_bert用 BERT 做分类sklearn_Classification用传统机器学习。毕设里通常用 BERT 那套准确率高但吃内存。启动前确认bert-base-chinese模型已下载到本地或者代码里写了from_pretrained(bert-base-chinese)会自动下载。# 启动意图识别服务Windows 用 .batLinux/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: Cant 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 5001Windows或lsof -i:5001Linux/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_locationtorch.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.pypython local.py输入「感冒吃什么药」预期输出类似「感冒推荐药物感冒灵、板蓝根」。如果输出乱码或空看日志里 NLU 返回的意图和实体对不对再对图谱查询结果。第四步检查 itchat_app.py可选。如果要做微信接入跑itchat_app.py扫码登录后发消息测试。但毕设答辩通常本地问答就够微信接入容易因为登录限制翻车建议作为加分项而非必选项。注意每次改完配置重启所有服务再测。别只重启local.pyNLU 服务缓存了旧模型。从那以后我每次部署这类 KGQA 项目都强制走一遍「NLU 单测 → 图谱单测 → 全链路」的验证流程不跳过任何一步。希望帮到你。本文还有配套的精品资源点击获取