医疗问答 Agent¶
项目背景与目标¶
大众健康咨询需求旺盛,但医疗资源分布不均、全科医生短缺,很多人对小毛病选择"硬扛"或盲目搜索导致焦虑。医疗问答 Agent 通过医学知识库、症状分析与就诊建议,为用户提供可靠的健康咨询服务,缓解医疗资源压力的同时引导合理就医。
本项目目标是构建一个医疗健康智能问答 Agent,覆盖常见病症咨询、用药指导、检查报告解读、就医建议等场景。系统须严格遵循"辅助不替代医生"原则:不诊断、不处方、危急重症立即引导就医,所有回答附医学依据。
需求分析¶
核心能力: 1. 症状理解:多轮对话澄清症状(部位、程度、持续时间、伴随症状) 2. 知识检索:医学知识库 RAG(指南、教科书、药品说明书) 3. 鉴别分析:列出可能病因与对应概率(仅供参考) 4. 就诊建议:根据症状严重度推荐科室与紧急程度 5. 用药咨询:药品适应症、用法、禁忌、相互作用 6. 报告解读:检验检查报告数值解读与异常提示
安全红线:不给出明确诊断;不开处方;危急值(胸痛、呼吸困难、意识障碍)立即建议拨打 120;未成年人/孕妇特殊人群加强提示。
技术选型说明¶
| 模块 | 技术方案 | 选型理由 |
|---|---|---|
| Agent 框架 | LangGraph | 多轮问诊状态管理 |
| LLM | 经医疗微调的模型 | 医学专业性要求 |
| 知识库 RAG | Milvus + BM25 混合检索 | 提升召回准确率 |
| 知识来源 | 临床指南、教科书、药品库 | 权威可信 |
| 安全护栏 | 规则 + LLM 双重审查 | 防止危险建议 |
| 对话管理 | 状态机 + 槽位填充 | 结构化问诊 |
| 后端 | FastAPI | 流式响应 |
| 数据库 | PostgreSQL + Neo4j | 病例库 + 疾病关系图 |
架构设计¶
flowchart TD
U[用户] --> CHAT[对话接口]
CHAT --> SAFE1[输入安全审查]
SAFE1 --> AGENT[问诊 Agent]
AGENT --> SLOT[槽位填充]
SLOT --> RAG[医学知识 RAG]
RAG --> VEC[(知识向量库)]
RAG --> BM25[(BM25 索引)]
AGENT --> TRIAGE[分诊评估]
TRIAGE -->|危急| EMERG[紧急就医提示]
TRIAGE -->|普通| DIAG[鉴别分析]
DIAG --> LLM[LLM 推理]
LLM --> SAFE2[输出安全审查]
SAFE2 --> REPLY[回复用户]
REPLY --> REF[附医学引用]
LOG[审计日志] --> DB[(病例库)]
关键模块实现思路¶
模块1:多轮问诊与槽位填充¶
医疗问诊需要结构化信息采集,不能一问一答就下结论。设计症状槽位:部位、性质(钝痛/刺痛/烧灼)、程度(1-10 分)、持续时间、诱发缓解因素、伴随症状、既往病史、过敏史。Agent 根据已填槽位决定下一步追问,槽位填满后进入分析。
SLOTS = ["部位", "性质", "程度", "持续时间", "伴随症状", "既往史"]
def next_question(filled: dict) -> str:
for slot in SLOTS:
if slot not in filled:
return QUESTION_TEMPLATE[slot]
return None # 信息完整,进入分析
槽位填充用 LLM 从用户自然语言抽取,结合规则校验(如程度必须是 1-10)。
模块2:医学知识 RAG¶
构建权威知识库:临床诊疗指南(中华医学会)、医学教科书(内科学)、药品说明书数据库、健康科普文章。文档分块向量化存入 Milvus,同时建 BM25 倒排索引做关键词召回。检索时向量 + BM25 混合排序,提升召回率。
每个知识块标注来源(指南名称、版本、章节),回答时附引用,增强可信度与可追溯性。知识库定期更新,过期指南自动标记。
模块3:分诊与危急值识别¶
分诊是安全核心。维护危急症状清单(胸痛、呼吸困难、剧烈头痛、意识障碍、大出血、高热不退等),输入命中即触发紧急流程:立即建议拨打 120/急诊,不再做多轮问诊。
EMERGENCY_KEYWORDS = ["胸痛", "呼吸困难", "意识丧失", "大出血", "抽搐"]
def triage(symptom: str) -> str:
if any(k in symptom for k in EMERGENCY_KEYWORDS):
return "emergency" # 立即就医
# 根据严重度评分分级
return "urgent" if score > 7 else "routine"
非危急情况按紧急度推荐:急诊(24h 内)/门诊(预约)/观察(居家观察)。
模块4:鉴别分析与报告解读¶
鉴别分析列出 3-5 个可能病因,每个标注:可能性(高/中/低)、典型症状匹配点、需要鉴别的检查。强调仅供参考,最终诊断须医生确认。
报告解读用户上传检验单(OCR 识别数值),与参考范围比对,异常项标注↑/↓并解释临床意义,但不下诊断结论。
核心流程详解¶
问诊主流程: 1. 用户描述症状 → 输入安全审查 2. 危急值检测 → 命中则紧急就医提示并结束 3. 槽位填充 → Agent 多轮追问澄清 4. 信息完整 → RAG 检索相关知识 5. 鉴别分析 → 列出可能病因(附概率与依据) 6. 输出安全审查 → 过滤危险建议 7. 回复用户:可能原因 + 就诊建议 + 自我护理 + 引用来源
用药咨询流程: 1. 用户输入药品名 → 检索药品说明书 2. LLM 解读适应症、用法、禁忌、不良反应 3. 检查用户既往史(如有肝肾功能不全提示慎用) 4. 输出用药指导(不调整处方,仅解读)
部署与优化建议¶
- 免责声明:每次回答附"本建议仅供参考,不能替代医生诊断"
- 模型微调:用脱敏病历 + 指南问答对微调 LLM,提升专业性
- 知识时效:指南更新后自动失效旧知识,避免错误建议
- 多模态:支持上传皮疹照片、检查报告图片
- 隐私保护:对话数据脱敏存储,符合个人信息保护法
- 人工兜底:复杂问题转人工医生,保留人工通道
常见问题与解决方案¶
| 问题 | 原因 | 解决方案 |
|---|---|---|
| LLM 给出错误诊断 | 模型幻觉 | 强制 RAG + 拒答护栏 |
| 用户描述模糊 | 非专业表述 | 槽位追问 + 同义词映射 |
| 危急值漏判 | 关键词不全 | 危急清单定期评审 + 模型辅助识别 |
| 知识库过时 | 指南更新 | 版本管理 + 自动失效机制 |
扩展方向¶
- 对接医院挂号系统,直接推荐可预约科室
- 慢病管理:长期随访高血压、糖尿病用户
- 中医辨证:结合中医知识库提供辨证参考
- 多语言支持,服务外籍人士