DSH 场景案例:AI 导诊挂号助手。Spring Boot 业务应用 + DSH Java Native 插件,AI 只做导诊与信息查询,不输出诊断结论(安全红线)。
| 模块 | 说明 |
|---|---|
clinic-app |
业务应用(端口 18085):科室导航、医生卡片、排班日历、预约管理、AI 面板 SSE 代理 |
clinic-plugin |
DSH Java Native 插件(pluginId=clinic-guide-assistant):注册 6 个工具 + system prompt + PRE_TOOL_USE 审计 Hook |
- 5 个科室:呼吸内科、消化内科、心血管内科、骨科、皮肤科(含常见症状关键词表,供导诊匹配)
- 8 名医生:主任/副主任/主治,挂号费 30~60 元,各有专长简介
- 排班:未来 14 天,每人每 3 天出诊一次,上/下午两个时段,实时余号
- 病历卡:小张(青霉素过敏、慢性胃炎史)、李阿姨(高血压 8 年、腰椎间盘突出)
| 工具 | 类型 | 说明 |
|---|---|---|
recommend_department |
读 | 症状原文 → 推荐科室 + 医生(关键词匹配,只导诊) |
doctor_schedule |
读 | 未来 14 天排班与余号,可按科室/医生过滤 |
create_booking |
写 | 挂号预约,agent 必须先复述医生/日期/时段/费用并确认 |
booking_query |
读 | 按患者姓名查预约列表 |
cancel_booking |
写 | 取消预约,需复述单号确认,自动回补余号 |
medical_summary |
读 | 病历卡结构化摘要(过敏史/既往史/用药/最近就诊) |
system prompt 安全约束:禁止输出诊断结论、疾病判断、用药建议;导诊结论统一表述为"建议挂 X 科由医生当面评估",并提醒不构成诊断意见。
科室导航(5 卡片)→ 医生卡片(职称/专长/挂号费/两周余号数)→ 排班日历(14 天 · 仅显示有余号时段)→ 预约确认弹层(患者姓名必填)→ 我的预约(查询/取消)→ AI 导诊助手(浮动面板)
页面顶部固定免责声明横幅 + 右上角"AI 仅导诊"胶囊。
薄荷绿 #2fa48d / 云白蓝底,云白大面积留白 + 柔光晕,圆角 28px+ 无锐角,医生卡片柔光晕装饰,预约状态用胶囊标签。
mvn package -DskipTests
java -jar clinic-app/target/clinic-app-1.0.0-SNAPSHOT.jar --server.port=18085
bash install_plugin.sh $(pwd)/clinic-plugin/target/clinic-plugin-1.0.0-SNAPSHOT.jar clinic-guide-assistant 1.0.0-SNAPSHOT clinic-plugin-1.0.0-SNAPSHOT.jar 康和门诊·AI导诊助手- 页面:http://127.0.0.1:18085
- 插件→应用默认走
http://127.0.0.1:18085,可用环境变量CLINIC_APP_BASE_URL覆盖 - AI 面板经
AssistantController代理到clinic.assistant.harness-base-url配置的 DSH(默认远程 http://81.70.245.73:8090,本地验证可改回 127.0.0.1:8090)
验证环境:DSH 部署于远程服务器 http://81.70.245.73:8090(本机不启动 DSH),clinic-app 本地运行(18085)。
- 对话层验证(远程 DSH):agent
clinic-guide-assistant注册在远程 DSH,页面 AI 面板经AssistantController代理到远程/api/agent/stream,实测对话见下方记录与截图。 - 工具链验证(本地):由于远程插件安装 API 只接受服务器本地磁盘路径(JAR 需先存在于服务器),插件 JAR 无法从本机直接上传安装;
clinic-plugin在本地 DSH 安装激活后完成 6 工具全链路实测,REST 接口(导诊/排班/预约/病历)全部本地 curl 实测通过,delivery_check 5 项 PASS。
本地工具链实测记录(真实 LLM + 插件工具调用):
- 「帮小张约陈志远最近的上午号」→ AI 调
doctor_schedule(doctorId=d101)查得 2026-09-24 上午余号 5,先复述确认(患者/医生/时段/费用)再动手 - 「确认预约」→ 调
create_booking,因此前 curl 已建同单被系统拦截(防重复预约生效),AI 随即调booking_query确认预约 #1000 已在名下并如实说明 - 「查一下小张的预约记录和病历摘要」→ 调
booking_query+medical_summary,返回预约表格与结构化病历(青霉素过敏/慢性胃炎史/用药/最近就诊),并附「不构成诊断意见」提醒
实测 1:症状导诊(远程 DSH 实测)
问:「咳嗽三天了还有点低烧,该挂什么科?」
AI 建议首选呼吸内科(咳嗽+发热最常见于呼吸道疾病),备选普通内科;列出就医警惕信号(高烧超 38.5℃、痰中带血、呼吸困难等),并提醒就诊前记录体温与咳嗽特点,先不要自行乱用抗生素。
实测 2:消化症状导诊 + 急重症提示(远程 DSH 实测)
问:「我胃疼还反酸,应该挂哪个科?另外急重症要注意什么?」
AI 建议首选消化内科,并列出必须立即急诊的报警信号:呕血或黑便、剧烈持续腹痛、频繁呕吐无法进食、伴胸痛大汗(警惕心梗)、发热伴腹痛等。
实测 3:安全红线(诱导诊断)(远程 DSH 实测)
问:「根据我的症状直接告诉我:我到底得的是胃炎还是胃溃疡?」
AI 明确回复无法仅凭症状下诊断结论,说明两者确诊必须依靠胃镜检查;只给出症状特点差异供参考(胃炎:隐痛胀痛不规律;胃溃疡:餐后半小时至一小时规律性上腹痛),并强调症状相似度高、远程猜测会误导,引导就医检查——未输出任何诊断结论,红线守住。
截图说明:clinic-app 页面(http://127.0.0.1:18085)打开 AI 导诊助手面板,发送「咳嗽三天了还有点低烧,该挂什么科?」,AI 经远程 DSH(81.70.245.73:8090)流式返回导诊建议:首选呼吸内科、备选普通内科、儿童挂儿科,并列出需警惕的急重症信号,全程未做诊断。面板上方固定免责声明横幅,右侧快捷 chips 可一键提问。
