73、 AI大模型项目实战之智医助手(上篇)
🏥 AI大模型项目实战之智医助手(上篇):项目架构与知识图谱设计
作者:orange来源:开源创富指南
🔥 前言
大家好!今天给大家带来一个超级实用的AI大模型项目实战教程——智医助手!
这是一个面向医疗领域的智能问答系统,能够帮助用户快速获取医疗知识、预约挂号、查询检查报告等。通过这个项目,你将学到:
-
✅ 如何构建医疗知识图谱
-
✅ 如何实现意图识别和实体抽取
-
✅ 如何使用大模型生成智能回复
-
✅ 如何部署Web服务
这是系列教程的上篇,主要讲解项目架构、环境准备和知识图谱设计。内容有点干,但全是干货,建议收藏后慢慢学习!
ai-medical链接: https://pan.baidu.com/s/1tj0BdthEs9XwBpXlEdB5yQ 提取码: bxxc
📋 项目背景
传统医疗知识获取的痛点
传统医疗知识的获取往往依赖于医生的主观判断或复杂的搜索流程,存在以下问题:
-
缺乏统一标准:医疗术语专业性强,信息结构复杂
-
交互效率低:普通用户难以快速定位所需内容
-
数据分散:医疗系统内部数据以结构化和非结构化形式分散存储
-
缺乏整合:难以支撑高质量的语义理解与推理服务
解决方案
为了解决上述问题,构建面向医疗领域的知识图谱,并基于图谱支撑的信息检索与智能问答系统成为当前医疗智能化的重要方向。
知识图谱的优势:
-
以图结构方式存储实体及其之间的语义关系
-
具备较强的关联推理与语义表达能力
-
能够为医疗助手提供丰富的背景知识支持
🎯 项目简介
项目目标
本项目旨在构建一个面向医疗领域的知识图谱,整合结构化与非结构化医学数据,搭建具备信息检索能力的智能医疗助手。
核心功能:
-
构建面向医疗领域的知识图谱
-
搭建具备信息检索能力的智能医疗助手
-
提供相关功能的快捷入口(挂号、预约检查等)
技术架构
项目核心技术架构分为四个核心模块:
1. 数据源模块
对结构化与非结构化数据进行清洗和转换,提取出所需信息。
2. 知识图谱模块
使用 Neo4j 构建包含实体关系的领域知识图谱。
3. 对话处理模块
对用户消息进行意图识别和实体抽取,基于识别和抽取结果查询所需信息。
4. 应用层模块
根据获取的信息响应用户,与用户进行交互。
【图片位置:项目架构图】
此处应插入项目架构图,展示四个模块之间的关系
🛠️ 技术栈
核心技术
| 技术领域 | 技术选型 |
|---|---|
| 图数据库 | Neo4j |
| 向量数据库 | Chroma |
| 深度学习框架 | PyTorch |
| 数据处理 | pandas, datasets, Numpy |
| 预训练模型 | transformers, sentence_transformers |
| 训练日志可视化 | TensorBoard |
| Web框架 | FastAPI |
📁 项目准备
知识图谱架构设计
数据源
结构化数据:
-
通用医学术语数据集
-
医学标注语料
-
开源医疗知识图谱项目
非结构化数据:
-
医学百科信息
-
相关书籍、论文
数据来源:
-
图谱数据来源:https://github.com/liuhuanyong/QASystemOnMedicalKG
-
标注数据来源:https://tianchi.aliyun.com/dataset/95414
节点设计
知识图谱包含以下节点类型:
| 节点类型 | 标签 | 属性 |
|---|---|---|
| 疾病 | Disease | name, desc |
| 科室 | Department | name |
| 症状 | Symptom | name |
| 诱因 | Cause | desc |
| 药物 | Drug | name |
| 食物 | Food | name |
| 传播途径 | Way | name |
| 预防措施 | Prevent | desc |
| 医学检查 | Check | name |
| 治疗方式 | Treat | name |
| 人群类别 | People | name |
| 治疗周期 | Duration | name |
关系设计
知识图谱包含以下关系类型:
疾病-[:ACOMPANY]->疾病 # 并发症
疾病-[:BELONG]->科室 # 所属科室
疾病-[:HAVE]->症状 # 症状
疾病<-[:CAUSE]-诱因 # 诱因
疾病-[:COMMON_USE]->药物 # 常用药物
疾病-[:EAT]->食物 # 宜食用
疾病-[:NO_EAT]->食物 # 忌食用
疾病-[:TRANSMIT]->传播途径 # 传播途径
疾病<-[:PREVENT]-预防措施 # 预防措施
疾病<-[:CHECK]-医学检查 # 检查项目
疾病<-[:TREAT]-治疗方式 # 治疗方式
疾病-[:COMMON_ON]->人群类别 # 易感人群
疾病-[:TREAT_DURATION]->治疗周期 # 治疗周期
【图片位置:知识图谱架构图】
此处应插入知识图谱架构图,展示节点和关系
🔧 环境准备
创建Conda环境
使用 conda 创建环境:
conda create -n ai-medical python=3.12
conda activate ai-medical
安装依赖
安装必要的Python包:
pip install pymysql neo4j transformers datasets tensorboard fastapi uvicorn easyocr rapidfuzz jieba scikit-learn chromadb sentence_transformers
安装PyTorch
根据CUDA版本安装对应的 pytorch:
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
模型准备
需要准备以下预训练模型:
-
UIE实体抽取预训练模型
-
BERT预训练模型
-
T5预训练模型
-
BGE预训练模型
📂 项目目录结构
./
├── data/
│ ├── annotated_data/ # 标注数据
│ ├── knowledge_graph/ # 知识图谱数据
│ ├── spell_check/ # 拼写检查训练数据
│ ├── intent_classify/ # 意图识别训练数据
│ └── uie/ # UIE 训练数据
├── uie_pytorch/ # UIE 模型
├── pretrained/ # 预训练模型目录
│ ├── bert-base-chinese/
│ ├── mengzi-t5-base/
│ ├── bge-base-zh-v1.5/
│ └── qwen/ # 用于计算 token 数
├── templates/ # 网页样式
├── finetuned/ # 模型权重存储目录
├── logs/ # 日志目录
└── src/
├── config.py # 配置文件
├── data_prepare.py # MySQL 与 Neo4j 数据准备
├── entity_alignment.py # 实体对齐
├── models_def.py # 模型定义
├── preprocess.py # 数据预处理
├── train.py # 模型训练
├── main.py # 模型微调主流程
├── finetune_uie.py # UIE 模型微调
├── intent_recognize_rule_base.py # 意图识别-规则
├── entity_extractor_rule_base.py # 实体抽取-规则
├── entity_extractor_model_base.py # 实体抽取-模型
├── dialog_llm.py # 对话-大模型
├── dialog_process.py # 对话处理
└── app.py # Web 应用
⚙️ 配置文件
src/config.py
importtorch
frompathlibimportPath
# ==================== 项目根目录 ====================
BASE_DIR=Path(__file__).parent.parent
# ==================== 数据库配置 ====================
# MySQL 配置信息
MYSQL_CONFIG= {
"host": "localhost",
"user": "root",
"password": "123321",
"database": "medical",
"charset": "utf8mb4",
}
NEO4J_URI="neo4j://localhost"# Neo4j 服务地址
NEO4J_AUTH= ("neo4j", "password") # Neo4j 用户认证
# ==================== 路径设置 ====================
# 拼写检查原始数据路径
SPELL_CHECK_RAW_DATA_DIR=BASE_DIR/"data/spell_check/raw"
# 拼写检查已处理数据存放路径
SPELL_CHECK_PROCESSED_DATA_DIR=BASE_DIR/"data/spell_check/processed"
# 意图识别原始数据路径
INTENT_CLASSIFY_RAW_DATA_DIR=BASE_DIR/"data/intent_classify/raw"
# 意图识别已处理数据存放路径
INTENT_CLASSIFY_PROCESSED_DATA_DIR=BASE_DIR/"data/intent_classify/processed"
# 模型参数保存路径
FINETUNED_DIR=BASE_DIR/"finetuned"
# TensorBoard 日志保存路径
LOGS_DIR=BASE_DIR/"logs"
# 向量数据库持久化路径
VECTOR_STORE_DIR=BASE_DIR/"data/vectorstore"
# 本地预训练模型路径
PRETRAINED_DIR=Path("C:/code/models")
UIE_DIR=PRETRAINED_DIR/"uie_pytorch"
# 设备
DEVICE=torch.device("cuda"iftorch.cuda.is_available() else"cpu")
# 意图信息
INTENT_INFO= {
"request": [
"挂号预约",
"检查预约",
"住院预约",
"报告查询/下载",
"费用支付/退费",
"转诊/转院申请",
"病例邮寄",
"个人信息修改",
"服务投诉",
"建议反馈",
"系统故障反馈",
],
"consult": [
"疾病对应详情",
"疾病对应科室",
"疾病对应症状",
"疾病对应并发症",
"疾病对应诱因",
"疾病对应药物",
"疾病宜食用",
"疾病忌食用",
"疾病对应传播途径",
"疾病对应预防措施",
"疾病对应易感人群",
"疾病对应检查",
"疾病对应治疗方式",
"疾病对应治疗周期",
"症状解读",
"诱因导致疾病",
"药物用于疾病",
"食物益于疾病",
"食物忌于疾病",
"人群类别易感疾病",
"检查项目用于疾病",
],
}
# 意图对应要抽取的实体
ENTITY_INFO= {
"疾病对应详情": ["疾病"],
"疾病对应科室": ["疾病"],
"疾病对应症状": ["疾病"],
"疾病对应并发症": ["疾病"],
"疾病对应诱因": ["疾病"],
"疾病对应药物": ["疾病"],
"疾病宜食用": ["疾病"],
"疾病忌食用": ["疾病"],
"疾病对应传播途径": ["疾病"],
"疾病对应预防措施": ["疾病"],
"疾病对应易感人群": ["疾病"],
"疾病对应检查": ["疾病"],
"疾病对应治疗方式": ["疾病"],
"疾病对应治疗周期": ["疾病"],
"症状解读": ["症状"],
"诱因导致疾病": ["诱因"],
"药物用于疾病": ["药物"],
"食物益于疾病": ["食物"],
"食物忌于疾病": ["食物"],
"人群类别易感疾病": ["人群类别"],
"检查项目用于疾病": ["医学检查"],
}
🎯 总结
通过本文的学习,我们完成了:
-
✅ 理解了项目背景和目标
-
✅ 掌握了技术架构设计
-
✅ 了解了知识图谱的节点和关系设计
-
✅ 完成了环境准备和配置
下一步:在中篇中,我们将深入学习模型定义、数据预处理、模型训练和实体抽取模型的实现。
💡 互动环节
思考问题:
-
你觉得医疗知识图谱还可以扩展哪些节点和关系?
-
在实际应用中,如何保证医疗数据的准确性和时效性?
欢迎在评论区分享你的想法和经验!
🌟 系列教程预告
《AI大模型项目实战之智医助手》系列教程:
-
上篇:项目架构与知识图谱设计(本文)
-
中篇:模型训练与实体抽取
-
下篇:对话处理与Web服务部署
如果本文对你有帮助,记得点赞、在看、分享三连哦!关注公众号开源创富指南,第一时间解锁更多技术实战教程!
创作不易,感谢您的支持,祝您技术进阶,事业有成! 🎉
夜雨聆风