跳转至

医疗问答 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 + 拒答护栏
用户描述模糊 非专业表述 槽位追问 + 同义词映射
危急值漏判 关键词不全 危急清单定期评审 + 模型辅助识别
知识库过时 指南更新 版本管理 + 自动失效机制

扩展方向

  • 对接医院挂号系统,直接推荐可预约科室
  • 慢病管理:长期随访高血压、糖尿病用户
  • 中医辨证:结合中医知识库提供辨证参考
  • 多语言支持,服务外籍人士