从零打造智能导诊助手!让AI帮你找对科室:基于BERT的导诊系统实现
你是否曾为医院的科室选择而发愁?这篇文章将带你构建一个AI智能导诊助手,只需输入症状描述,它就会精准推荐对应科室!而且,代码完全开箱即用,你可以轻松运行体验,让你的导诊助手在你的设备上“活”起来。
我们将使用BERT模型来识别和理解用户的自然语言输入,并基于症状进行科室推荐。让我们一同探秘这个技术魔法的幕后!
🚀 效果演示
在我们深入代码之前,先看下成品效果(后端简单效果)吧:
用户输入症状描述,智能助手会快速返回推荐的科室:
用户输入:头痛、发烧、咳嗽
系统推荐:内科
用户输入:腹痛、反酸
系统推荐:消化内科
是不是很酷?你只需输入简短的症状描述,系统便能高效、准确地推荐合适的科室!接下来,我们会逐步带你构建这个系统。
🧩 系统架构与实现思路
整个系统分为四个模块:
- 数据准备:我们将准备一份症状与科室对应的标注数据。
- BERT微调:利用BERT模型的语义理解能力,将症状描述分类到合适的科室。
- API接口设计:使用FastAPI构建API,让前端可以调用模型服务。
- Docker化部署:将系统打包成Docker镜像,方便部署和分享。
📂 第一步:准备数据
我们先准备一个症状到科室的标注数据集。例如:
症状描述 | 科室 |
---|---|
胃痛、反酸、腹胀 | 消化内科 |
头晕、心悸、胸闷 | 心内科 |
发烧、咳嗽、喉咙痛 | 内科 |
皮疹、瘙痒、红肿 | 皮肤科 |
这些数据将作为我们训练BERT模型的基础,我们会用它来让模型理解不同症状对应的科室。
将这些数据保存为 hospital_data.csv
文件。
⚙️ 第二步:微调BERT模型
我们将利用BERT的强大能力来理解症状描述。你不需要从头训练模型,只需进行微调即可。以下是代码简要:
import pandas as pd
from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments
import torch
from sklearn.preprocessing import LabelEncoder
# 加载数据
data = pd.read_csv('hospital_data.csv')
X = data['症状描述']
y = data['科室']
# 标签编码
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)
# BERT分词器
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
# 分词
def tokenize_texts(texts, max_len=128):
return tokenizer(
texts.tolist(),
max_length=max_len,
padding=True,
truncation=True,
return_tensors="pt"
)
tokens = tokenize_texts(X)
# BERT模型
model = BertForSequenceClassification.from_pretrained("bert-base-chinese", num_labels=len(label_encoder.classes_))
# 训练设置
training_args = TrainingArguments(
output_dir='./results',
num_train_epochs=3,
per_device_train_batch_size=8,
evaluation_strategy="epoch"
)
# Trainer API
train_dataset = torch.utils.data.TensorDataset(tokens['input_ids'], tokens['attention_mask'], torch.tensor(y_encoded))
trainer = Trainer(model=model, args=training_args, train_dataset=train_dataset)
# 模型训练
trainer.train()
重点:以上代码会在你的数据集上训练一个BERT模型,利用其强大的语义理解能力,完成症状到科室的分类。
🌐 第三步:构建高效API
有了模型后,我们使用FastAPI来创建一个API接口,这样你就可以在任何应用中调用这个导诊助手了!
from fastapi import FastAPI, Request
from transformers import BertTokenizer, BertForSequenceClassification
import torch
import joblib
app = FastAPI()
# 加载模型和标签编码器
model = BertForSequenceClassification.from_pretrained('./results')
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
label_encoder = joblib.load('label_encoder.joblib')
@app.post("/predict")
async def predict(request: Request):
json_data = await request.json()
symptoms = json_data['symptoms']
tokens = tokenizer(symptoms, max_length=128, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
outputs = model(tokens['input_ids'], attention_mask=tokens['attention_mask'])
prediction = torch.argmax(outputs.logits, dim=1).item()
department = label_encoder.inverse_transform([prediction])[0]
return {"department": department}
快速启动
- 将代码保存为
app.py
。 - 使用以下命令运行:
uvicorn app:app --reload --host 0.0.0.0 --port 8000
现在,你可以通过POST请求来调用API:
curl -X 'POST' \
'http://localhost:8000/predict' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"symptoms": "头痛、发烧、咳嗽"}'
系统将返回类似如下的结果:
{
"department": "内科"
}
📦 第四步:Docker化部署
通过Docker容器化,让系统更加便于共享和部署。在不同的环境中都能无缝运行,几行命令即可部署上线。
Dockerfile
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
创建requirements.txt
fastapi
torch
transformers
joblib
uvicorn
构建和运行Docker镜像
docker build -t hospital-assistant .
docker run -d -p 8000:8000 hospital-assistant
🎉 项目体验
至此,你的智能导诊助手已经可以在任何地方运行了!不论是本地测试还是云端部署,都能轻松实现。想象一下,把这个智能导诊系统嵌入你的应用中,用户只需输入症状描述,就能获得推荐科室,这将大大改善他们的医疗体验!
是不是很激动?亲自试试吧,享受AI为生活带来的便捷!
更多精彩,敬请关注
在下一篇文章中,我们将进一步优化这个智能导诊助手,包括:
- 更高效的BERT变种,如RoBERTa和DistilBERT;
- 添加前端界面,实现更加直观的用户交互;
- 模型优化和性能提升。
如果你也对智能医疗和NLP充满热情,别忘了关注,更多技术细节等你来发现!