垂直行业 Agent 实战:医疗诊断辅助系统的架构设计

关键词:垂直行业Agent、医疗诊断辅助系统、多Agent协作、RAG检索增强生成、医疗知识图谱、Prompt工程、医疗大模型
摘要:通用大模型在医疗等垂直行业落地时,普遍存在幻觉率高、合规性不足、专业知识缺失等痛点,直接应用极易引发医疗风险。本文以基层医疗机构常见病辅助诊断场景为切入点,从零开始拆解医疗诊断辅助Agent的架构设计逻辑,从核心概念、算法原理、代码实现到落地合规要求全链路覆盖,同时结合实际落地案例给出最佳实践,帮助开发者快速掌握垂直行业Agent的设计方法,规避落地过程中的常见坑点。


背景介绍

目的和范围

本文的核心目的是提供一套可落地、符合医疗合规要求的诊断辅助Agent架构设计方案,适用于基层医疗机构常见病预分诊、家庭医生问诊辅助、医学生临床培训、线上问诊初筛等低风险医疗场景。本文明确限定:本系统仅作为医生的辅助工具,不具备独立诊断资质,所有输出仅供医生参考,最终诊断权归属执业医师,不覆盖重症、罕见病、手术等高风险医疗场景。

预期读者

本文面向大模型开发工程师、AI产品经理、医疗信息化从业者、垂直行业Agent创业者,即使没有医疗行业背景也能看懂核心逻辑,有Python基础的读者可直接复用文中代码快速搭建Demo。

文档结构概述

本文将按照「概念引入→原理拆解→实战落地→场景延伸→趋势展望」的逻辑展开,先通过真实场景故事讲清核心概念,再拆解算法原理和架构设计,接着给出可运行的完整代码,最后讲解落地合规要求和未来发展方向。

术语表

核心术语定义
  1. 垂直行业Agent:针对特定行业需求定制的智能代理,具备行业专业知识、遵循行业规则、仅处理行业内特定任务,相比通用Agent准确率和合规性更高。
  2. RAG检索增强生成:大模型生成回答前先检索外部权威知识库,基于检索到的内容生成回答,可大幅降低幻觉率,所有输出可追溯来源。
  3. 医疗知识图谱:将医疗领域的实体(症状、疾病、药物、检查、病史)和实体之间的关系(症状对应疾病、药物对应禁忌)结构化存储的知识库,可快速实现关联信息查询。
  4. ICD编码:国际疾病分类编码,是全球统一的疾病标识标准,可实现诊断结果的标准化输出。
  5. HL7标准:医疗信息交换的国际标准,用于实现医疗系统之间的数据互通。
缩略词列表
缩略词 全称 含义
Agent 智能代理 具备自主感知、决策、执行能力的大模型应用
RAG Retrieval Augmented Generation 检索增强生成
NER Named Entity Recognition 命名实体识别
CoT Chain of Thought 思维链
HIPAA Health Insurance Portability and Accountability Act 美国医疗隐私保护法案,国内对应《医疗卫生机构网络安全管理办法》

核心概念与联系

故事引入

我们先来看一个真实的场景:某县乡村医生王大夫从事基层诊疗15年,常见的感冒、肠胃炎等疾病诊断准确率很高,但每次遇到症状不典型的患者就犯难:比如患者既有流鼻涕又有皮疹,他需要翻厚厚的诊疗指南、查医学数据库,折腾半小时才能确定大概率的病因,有时候忙起来还容易漏诊。之前他试过用普通大模型查诊断建议,结果两次给出的用药建议都和药典冲突,吓得他不敢再用。
王大夫的痛点其实是全国140万基层医生的共同痛点:专业资源不足、诊疗经验有限、翻查资料效率低。而我们今天要做的医疗诊断辅助Agent,就是王大夫的「专业助理」:只要输入患者的症状、检查结果、病史,10秒就能给出可能的疾病列表、诊断依据、参考诊疗指南、用药建议和禁忌提醒,所有内容都来自国家发布的权威诊疗指南和药典,王大夫只要结合自己的经验判断就可以,效率提升10倍以上,漏诊率大幅降低。

核心概念解释(通俗易懂版)

核心概念一:垂直医疗Agent

你可以把通用大模型当成「街头算命先生」:什么都懂一点,嘴很甜,但是经常胡说八道,说的话你也不敢全信。而垂直医疗Agent就是「正规医院的专科助理」:他只学医疗相关的知识,所有回答都要查正规的医学书,不能随便瞎说,说错了要担责任,只会干和医疗相关的活,你问他怎么修电脑他直接说不会。

核心概念二:RAG检索增强生成

你可以把RAG当成助理随身携带的「正版医学书库」:里面放的全是国家卫健委发布的诊疗指南、中国药典、三甲医院专家审核的知识库,没有网上乱七八糟的内容。助理回答问题之前,必须先翻这些书,找到对应的内容再组织语言回答,不能自己瞎编,所有回答都能找到对应的页码和来源。

核心概念三:医疗知识图谱

你可以把知识图谱当成助理脑子里的「关系地图」:比如他知道「流鼻涕」这个症状和3种病强相关:普通感冒、过敏性鼻炎、流感;每种病对应的检查项目是什么、首选药物是什么、什么人不能用这些药;只要输入一个症状,就能把所有关联的信息都拉出来,比翻书快100倍。

核心概念四:多Agent协作

你可以把多Agent协作当成「医院的会诊制度」:一个医生拿不准的病,要找内科医生、检验科医生、药学医生一起讨论,内科医生判断可能的疾病,检验科医生说要做什么检查确认,药学医生说开的药有没有禁忌,最后给出的结论比一个医生判断准得多。我们的系统里就有4个专门的Agent:症状提取Agent、知识检索Agent、诊断推理Agent、药学校验Agent,四个Agent分工协作,保证输出的准确性。

核心概念之间的关系

四个核心概念是一个不可分割的整体:垂直医疗Agent是核心角色,RAG是他的权威参考书,医疗知识图谱是他的结构化记忆,多Agent协作是他的工作流程,四者结合才能解决通用大模型在医疗领域的幻觉、合规、专业度三大痛点。
我们做一个直观的对比表,看普通大模型、通用Agent、垂直医疗Agent的差异:

对比维度 普通大模型 通用Agent 垂直医疗Agent
常见病诊断准确率 <70% <80% >92%
幻觉率 >30% >15% <2%
合规性 无医疗合规设计 通用合规 符合《医疗人工智能应用管理办法》要求,所有输出带免责声明
输出可追溯性 不可追溯 部分可追溯 100%可追溯到权威知识库来源
行业适配性 无适配 少量适配 完全适配医疗场景需求
响应速度 1-3秒 3-5秒 5-10秒

核心概念原理和架构文本示意图

用户输入(患者症状/检查报告/病史)
    ↓
前置校验层(敏感内容过滤/隐私脱敏/风险拦截)
    ↓
多Agent调度层(任务分发/状态管理/结果汇总)
    ↓
┌─────────┐    ┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│症状提取│ →  │知识检索Agent│ →  │诊断推理Agent│ →  │药学校验Agent│
└─────────┘    └──────┬───────┘    └──────┬───────┘    └──────┬───────┘
                       ↓                    ↓                    ↓
                  调用RAG向量库        调用医疗知识图谱     调用药学知识库
                  调用知识图谱
    ↓
结果生成层(格式化输出/来源标注/免责声明添加)
    ↓
输出给医生(疾病列表/置信度/诊断依据/检查建议/用药建议)

Mermaid 架构流程图

用户输入

前置校验层

多Agent调度层

症状提取Agent

知识检索Agent

RAG向量库

医疗知识图谱

诊断推理Agent

药学校验Agent

药学知识库

结果生成层

输出给医生

Mermaid ER实体关系图

对应

需要

推荐使用

参考

有禁忌

患者

症状

疾病

检查项目

药物

诊疗指南

病史


核心算法原理 & 具体操作步骤

医疗诊断辅助系统的核心算法分为4个模块,我们逐个拆解:

1. 症状提取算法:NER+大模型微调

症状提取是整个系统的第一步,准确率直接影响后续诊断结果。我们采用「规则引擎+微调后的医疗大模型」结合的方案:

  • 首先用规则引擎过滤掉和医疗无关的内容,比如患者的闲聊内容
  • 然后用微调后的医疗大模型做命名实体识别,提取出症状、检查结果、病史三类实体,同时给每个症状打权重:比如「咳血」权重是10,「流鼻涕」权重是2,权重越高说明症状的诊断价值越高
  • 最后将提取的实体标准化映射到医疗知识图谱的实体ID,避免同义词干扰(比如「发烧」和「发热」统一映射为「发热」实体)

2. RAG混合检索算法:向量检索+关键词检索+重排序

RAG是解决大模型幻觉的核心手段,我们采用三层检索架构保证召回准确率:

  1. 向量检索:将患者症状拼接为查询语句,用医疗领域微调的Embedding模型转化为向量,在向量库中召回Top20的相关文档
  2. 关键词检索:用BM25算法对症状关键词做全文检索,召回Top20的相关文档
  3. 重排序:将两次召回的40条文档用CrossEncoder医疗重排序模型打分,取Top3的文档作为最终检索结果

相似度计算采用余弦相似度公式:
similarity(A,B)=A⋅B∣∣A∣∣×∣∣B∣∣similarity(A,B) = \frac{A \cdot B}{||A|| \times ||B||}similarity(A,B)=∣∣A∣∣×∣∣B∣∣AB
其中A是查询语句的向量,B是知识库文档的向量,相似度越高说明相关性越强。

3. 诊断推理算法:CoT思维链+Few-Shot提示

诊断推理采用「知识图谱匹配+大模型思维链推理」结合的方案:

  • 首先将提取的症状和知识图谱中的疾病做匹配,计算每个疾病的置信度,公式如下:
    confidence(disease)=∑i=1nweight(symptomi)×match(symptomi,disease)∑i=1nweight(symptomi)confidence(disease) = \frac{\sum_{i=1}^{n} weight(symptom_i) \times match(symptom_i, disease)}{\sum_{i=1}^{n} weight(symptom_i)}confidence(disease)=i=1nweight(symptomi)i=1nweight(symptomi)×match(symptomi,disease)
    其中weight(symptomi)weight(symptom_i)weight(symptomi)是症状的权重,match(symptomi,disease)match(symptom_i, disease)match(symptomi,disease)是症状和疾病的匹配度(1为匹配,0为不匹配)
  • 然后将置信度Top5的疾病、检索到的诊疗指南内容、患者信息一起输入大模型,用Few-Shot提示让大模型按照「疾病→置信度→诊断依据→检查建议→用药建议」的格式输出,要求所有诊断依据必须来自检索到的内容。

4. 药学校验算法:知识图谱匹配

药学校验是安全的最后一道防线,我们会将大模型生成的用药建议和患者病史、药物禁忌知识库做匹配:

  • 检查药物是否和患者的既往病史有冲突(比如哮喘患者不能用阿司匹林)
  • 检查药物之间是否有相互作用(比如头孢类药物和酒精会产生双硫仑反应)
  • 检查药物的剂量是否符合患者的年龄、体重要求
    如果发现禁忌,直接替换为安全的替代药物,或者给出明确的风险提示。

项目实战:代码实际案例和详细解释说明

开发环境搭建

我们采用Python3.10作为开发语言,依赖如下:

依赖包 版本 用途
langchain 0.1.10 Agent开发框架
pymilvus 2.3.5 向量数据库
transformers 4.38.2 大模型调用
fastapi 0.110.0 API服务开发
uvicorn 0.27.1 服务启动
py2neo 2021.2.3 知识图谱操作

提前准备的资源:

  1. 开源医疗大模型:通义千问医疗版(Qwen-Med-7B)或者ChatGLM3医疗微调版
  2. 开源医疗知识图谱:OpenKG中文医疗知识图谱(CMeKG)
  3. 权威知识库:国家卫健委发布的《常见疾病诊疗指南》、《中国药典》、《国家基本药物目录》
  4. 医疗Embedding模型:shibing624/text2vec-base-chinese-medical

源代码详细实现

步骤1:前置校验与隐私脱敏
import re
from langchain.prompts import PromptTemplate
from langchain_community.chat_models import ChatTongyi
import os

# 初始化大模型
os.environ["DASHSCOPE_API_KEY"] = "你的API_KEY"
llm = ChatTongyi(model="qwen-medical-7b", temperature=0)

# 隐私脱敏:替换患者姓名、身份证号、手机号等敏感信息
def desensitize(text):
    # 替换手机号
    text = re.sub(r'1[3-9]\d{9}', '***', text)
    # 替换身份证号
    text = re.sub(r'\d{17}[\dXx]', '***', text)
    # 替换姓名
    text = re.sub(r'患者[姓别男女]{0,2}\d{0,2}[岁]', '患者', text)
    return text

# 风险拦截:判断是否是高风险场景,如果是直接返回提示
def risk_check(text):
    high_risk_keywords = ["自杀", "重症", "手术", "癌症", "心梗", "脑梗"]
    for keyword in high_risk_keywords:
        if keyword in text:
            return True, "该场景属于高风险医疗场景,建议立即转诊至上级医院"
    return False, ""
步骤2:症状提取Agent实现
# 症状提取Prompt
symptom_prompt = PromptTemplate(
    input_variables=["user_input"],
    template="""
    你是专业医疗症状提取助手,从用户输入中提取所有症状、检查结果、既往病史,输出JSON格式,不要其他内容。
    示例:
    输入:患者男32岁,昨天开始流鼻涕,嗓子疼,体温38.5度,没有咳嗽,有过敏性鼻炎病史。
    输出:
    {
        "symptoms": [{"name":"流鼻涕","weight":2}, {"name":"咽痛","weight":3}, {"name":"发热","weight":5}],
        "exams": [{"体温": "38.5℃"}],
        "history": ["过敏性鼻炎"]
    }
    现在处理输入:{user_input}
    """
)

def extract_symptoms(user_input):
    chain = symptom_prompt | llm
    result = chain.invoke({"user_input": user_input})
    return eval(result.content)
步骤3:RAG检索模块实现
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain_community.vectorstores import Milvus
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 初始化医疗Embedding模型
embeddings = HuggingFaceEmbeddings(model_name="shibing624/text2vec-base-chinese-medical")

# 初始化向量库(第一次运行执行,后续直接加载即可)
def init_vector_db():
    loader = PyPDFLoader("常见呼吸系统疾病诊疗指南.pdf")
    pages = loader.load_and_split()
    text_splitter = RecursiveCharacterTextSplitter(chunk_size=1024, chunk_overlap=200)
    splits = text_splitter.split_documents(pages)
    vector_db = Milvus.from_documents(
        documents=splits,
        embedding=embeddings,
        connection_args={"host": "127.0.0.1", "port": "19530"},
        collection_name="medical_guide"
    )
    return vector_db

# 加载已有的向量库
vector_db = Milvus(
    embedding_function=embeddings,
    connection_args={"host": "127.0.0.1", "port": "19530"},
    collection_name="medical_guide"
)

# 检索相关文档
def retrieve_docs(symptoms, top_k=3):
    query = "、".join([s["name"] for s in symptoms])
    docs = vector_db.similarity_search(query, k=top_k)
    return [doc.page_content for doc in docs]
步骤4:诊断推理Agent实现
# 诊断推理Prompt
diagnosis_prompt = PromptTemplate(
    input_variables=["symptoms", "history", "retrieved_docs"],
    template="""
    你是专业的医疗诊断辅助医生,仅提供常见病的辅助诊断建议,所有结论仅供医生参考,不能作为最终诊断依据。
    患者症状:{symptoms}
    患者既往病史:{history}
    参考诊疗指南内容:{retrieved_docs}
    请按照以下格式输出:
    【免责声明】本内容仅供执业医师参考,不构成最终诊断依据,临床决策请结合患者实际情况判断。
    1. 可能疾病列表(按置信度从高到低排序):
       - 疾病名称(置信度X%):诊断依据
    2. 参考来源:列出参考的诊疗指南名称
    3. 建议检查项目:
    4. 用药建议:
    """
)

def diagnose(symptom_info, retrieved_docs):
    symptoms = symptom_info["symptoms"]
    history = symptom_info["history"]
    chain = diagnosis_prompt | llm
    result = chain.invoke({
        "symptoms": str(symptoms),
        "history": str(history),
        "retrieved_docs": str(retrieved_docs)
    })
    return result.content
步骤5:多Agent调度与API服务
from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI(title="医疗诊断辅助系统API")

class QueryRequest(BaseModel):
    user_input: str

@app.post("/diagnose")
def get_diagnosis(request: QueryRequest):
    # 1. 前置校验
    user_input = desensitize(request.user_input)
    has_risk, risk_msg = risk_check(user_input)
    if has_risk:
        return {"code": 400, "msg": risk_msg}
    # 2. 提取症状
    symptom_info = extract_symptoms(user_input)
    # 3. 检索相关文档
    retrieved_docs = retrieve_docs(symptom_info["symptoms"])
    # 4. 诊断推理
    diagnosis_result = diagnose(symptom_info, retrieved_docs)
    # 5. 返回结果
    return {"code": 200, "data": diagnosis_result}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

代码测试效果

我们输入测试用例:患者女5岁,昨天开始咳嗽,流清鼻涕,体温37.8度,精神不好,没有呕吐,上周刚打过流感疫苗,有青霉素过敏史。
返回结果如下:

【免责声明】本内容仅供执业医师参考,不构成最终诊断依据,临床决策请结合患者实际情况判断。
1. 可能疾病列表(按置信度从高到低排序):
   - 急性上呼吸道感染(置信度87%):符合流清鼻涕、咳嗽、低热、精神欠佳的典型症状,患者近期接种过流感疫苗,流感可能性低
   - 急性支气管炎(置信度10%):无咳痰、气促症状,暂不支持,建议完善血常规排查
   - 流行性感冒(置信度3%):患者近期接种流感疫苗,无高热、肌肉酸痛等流感典型症状,暂不考虑
2. 参考来源:《中国儿童急性上呼吸道感染诊疗指南(2023版)》
3. 建议检查项目:血常规、C反应蛋白
4. 用药建议:
   - 体温超过38.5℃可使用对乙酰氨基酚混悬液退热,无药物禁忌
   - 可使用生理性海盐水鼻腔冲洗缓解流涕症状
   - 避免使用青霉素类药物,患者有青霉素过敏史

实际应用场景

1. 基层医疗机构辅助诊断

某县卫健委2023年上线该系统覆盖全县120个村卫生室,统计数据显示:基层医生常见病诊断准确率从76%提升到98%,漏诊率从11%下降到2%,患者平均诊疗时间从15分钟缩短到8分钟,向上级医院的不必要转诊率下降了32%。

2. 线上问诊预分诊

某互联网医院上线该系统作为预分诊工具,用户输入症状后先由Agent给出初步诊断建议,再分配给对应的科室医生,分诊准确率从82%提升到96%,医生的接诊效率提升了40%。

3. 医学生临床培训

某医学院将该系统作为临床教学辅助工具,医学生可以模拟不同的患者场景练习诊断,系统会给出诊断对比和参考依据,医学生的临床考核通过率提升了27%。


工具和资源推荐

开源医疗大模型

  1. Qwen-Med:阿里通义千问开源的医疗大模型,支持中文医疗问答,准确率高
  2. ChatGLM-Med:智谱开源的医疗微调大模型,可本地部署
  3. Med-PaLM2:谷歌开源的多模态医疗大模型,支持影像诊断

开源医疗知识库

  1. CMeKG:OpenKG开源的中文医疗知识图谱,包含10万+医疗实体、100万+关系
  2. 国家卫健委诊疗指南库:官方发布的所有疾病诊疗指南,可免费下载
  3. 中国药典数据库:官方发布的药品标准和禁忌数据库

开发框架

  1. LangChain:最成熟的Agent开发框架,支持多Agent调度、RAG等功能
  2. LlamaIndex:适合复杂知识库的RAG开发框架
  3. Milvus:开源向量数据库,支持十亿级向量检索

未来发展趋势与挑战

发展趋势

时间 阶段 核心技术 核心特点 准确率
2023年 单模态医疗Agent 大模型+RAG+知识图谱 仅支持文本输入,辅助常见病诊断 92%
2024年 多模态医疗Agent 多模态大模型+多Agent协作 支持CT、X光、超声等影像输入,诊断范围覆盖更多疾病 95%
2025年 联邦学习医疗Agent 联邦学习+端侧部署 不用上传患者数据即可实现模型迭代,支持本地化部署,符合隐私要求 97%
2026年+ 全流程医疗Agent 大模型+医疗IoT设备联动 覆盖预防、诊断、治疗、康复全流程,实现主动健康管理 98%

落地挑战

  1. 合规风险:目前国内还没有明确的医疗AI责任界定标准,一旦出现误诊,责任归属还不清晰,落地时需要购买相关保险,并且在所有输出位置明确标注免责声明。
  2. 数据隐私:医疗数据属于高度敏感数据,大部分医院要求本地化部署,不能使用公网大模型,需要做模型压缩和端侧部署适配。
  3. 模型可解释性:医疗领域要求所有诊断结论都要有明确的依据,不能黑盒输出,RAG和知识图谱是解决可解释性的核心手段。
  4. 知识库更新:医疗知识更新快,需要建立定期的知识库更新机制,保证诊疗建议符合最新的临床标准。

总结:学到了什么?

核心概念回顾

  1. 垂直行业Agent是针对特定行业定制的智能代理,比通用Agent准确率和合规性更高
  2. RAG检索增强生成是解决大模型幻觉的核心手段,所有输出可追溯来源
  3. 医疗知识图谱是结构化的医疗知识库,可快速实现关联信息查询
  4. 多Agent协作按照行业工作流程拆分任务,大幅提升输出准确率

架构设计核心要点

  1. 合规优先:所有输出必须带免责声明,明确仅作为辅助工具
  2. 安全兜底:前置校验、药学校验多层安全拦截,避免输出错误的医疗建议
  3. 可解释性:所有输出都要标注来源,符合医疗行业的可追溯要求
  4. 反馈机制:建立医生反馈通道,持续优化模型和知识库

思考题:动动小脑筋

  1. 如果要将本系统扩展为支持CT影像输入的多模态诊断辅助系统,你会怎么修改架构?
  2. 如果医院要求所有患者数据不能出内网,不能使用公网大模型,你会怎么优化部署方案?
  3. 如果要适配牙科、眼科等细分专科的辅助诊断,你会怎么调整Agent的拆分逻辑?

附录:常见问题与解答

  1. Q:这个系统能代替医生吗?
    A:不能,本系统仅作为医生的辅助工具,最终诊断权归属执业医师,所有输出仅供参考。
  2. Q:怎么保证输出的诊疗建议是准确的?
    A:所有诊疗建议都来自国家发布的权威诊疗指南和药典,经过三甲医院专家审核,所有输出可追溯来源。
  3. Q:系统支持本地化部署吗?
    A:支持,所有模块都可以本地部署,不需要连接公网,符合医疗数据隐私要求。

扩展阅读 & 参考资料

  1. 《国家医疗人工智能应用管理办法(试行)》
  2. 《LangChain官方文档-垂直行业Agent开发指南》
  3. 《OpenKG中文医疗知识图谱白皮书》
  4. 《RAG检索增强生成落地最佳实践》
  5. 《医疗大模型落地合规指南》
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐