news 2026/10/19 10:21:27

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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.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 单测 → 图谱单测 → 全链路」的验证流程,不跳过任何一步。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 10:20:55

ElasticSearch+RAG知识库实战:向量检索与混合检索搭建指南

直接进入正题。前阵子要给团队搭一个私有知识库问答系统&#xff0c;碰巧赶上 ElasticSearch 8.x 的向量检索功能已经比较成熟&#xff0c;就选了“ElasticSearch RAG”这条技术路线。做下来发现这个组合确实很适合中小企业快速落地——既有传统倒排索引的精准匹配&#xff0c…

作者头像 李华
网站建设 2026/10/19 10:20:55

Dify工作流+映美云打印:AI驱动的智能云打印架构实战

1. 从手动排版到智能输出&#xff1a;云打印工作流的痛点与破局思路做过零售门店、仓储物流或者连锁餐饮系统的人&#xff0c;大概率都碰过打印这件事。前台收银小票、后厨分单、仓库拣货标签、财务对账单&#xff0c;每一张纸背后都是一套独立的打印逻辑。传统做法是每台设备装…

作者头像 李华
网站建设 2026/10/19 10:19:54

JSP+Access手机销售系统课设全解析:从部署到答辩

简介&#xff1a;基于JSPAccess的手机销售系统设计与实现项目包&#xff0c;面向计算机相关专业学生及Java初学者&#xff0c;适用于课程设计、毕业设计和综合实训等场景。项目覆盖从需求分析、系统设计、编码实现到测试验收的完整流程&#xff0c;包含手机型号展示、库存管理、…

作者头像 李华
网站建设 2026/10/19 10:19:01

Codex智能体实战:从写代码到设计环境的工程师新角色

几个月前&#xff0c;我收到一个任务&#xff1a;把一个用老旧框架写的内部管理页迁移到新的组件体系。如果放到三年前&#xff0c;我会直接打开编辑器开始拆组件&#xff1b;放到一年前&#xff0c;我会让代码补全工具帮我生成新文件的骨架&#xff1b;而这一次我做了一个不太…

作者头像 李华
网站建设 2026/10/19 10:18:59

AI生成PPT总带塑料感?用结构化提示词与python-pptx打造可编辑高级感演示文稿

1. 为什么AI生成的PPT总有一股“塑料感”先抛一个我自己的真实经历。上个月帮一个做咨询的朋友改一份行业分析报告&#xff0c;他用某款AI工具直接生成了一份PPT&#xff0c;发过来让我“润色一下”。打开文件的那一刻我就明白了问题所在——满屏的渐变蓝紫配色、圆角矩形卡片堆…

作者头像 李华
网站建设 2026/10/19 10:18:51

npm安装报错EIDLETIMEOUT:Windows环境下的完整排查与解决方案

“安装openclaw时出现node.exe : npm error code EIDLETIMEOUT”——这个报错我实在太熟了。前一阵我在一台Windows机器上装openclaw&#xff0c;npm install跑了大半程&#xff0c;日志突然卡在某个依赖包的下载上&#xff0c;终端沉默了将近两分钟&#xff0c;最后弹出这么一…

作者头像 李华