[开源] 互联网医院多模态意图路由器:统一接收语音/文字/图片输入,自动识别挂号/咨询/改预约等6类意图并路由到对应服务节点
本项目是面向互联网医院中台建设的轻量级意图理解与分发组件,专为解决患者多渠道输入(文字问诊、语音描述症状、上传检查报告截图)后意图模糊、人工分流低效、服务节点调用错配等问题而设计。我们不替代医生决策或生成诊疗建议,而是做「第一层语义过滤器」:先准确判断用户到底想干什么,是挂号、查报告、改预约、投诉,还是其他未明确定义的需求;再按预设规则,把请求稳准快地转给注册服务、报告服务、反馈系统等下游节点;同时附带可读的归因说明,让运营和开发人员一眼看懂系统为何这么判。它提供 HTTP API、命令行 CLI 和本地 Web 界面三种交互形态,核心分类器基于 TF-IDF + 朴素贝叶斯(scikit-learn 实现),对中文医疗短文本优化充分;当置信度低于阈值(默认 0.6)时,自动启用 LLM 辅助兜底;所有路由逻辑通过routing_rules.json配置,无需改代码即可调整意图与服务节点的映射关系。技术栈精简可控:Python 3.8+、Flask、jieba 分词、无 GPU 依赖,部署门槛低,适合嵌入现有医院微服务架构。
定位与能力范围
我们不做通用大模型对话引擎,也不做端到端语音识别或 OCR 引擎。本项目的边界非常清晰:只处理「患者侧输入 → 意图判定 → 路由分发」这一窄链条。输入模态限定为三类:纯文本(如 App 内输入框)、语音文件(wav/mp3,当前默认 mock,可对接真实 ASR)、图片文件(含报告截图,当前 OCR 为 mock,但接口已预留)。输出不是答案,而是结构化结果:意图标签(挂号/咨询/改预约/查报告/投诉/其他)、置信度数值、目标服务节点名(如registration_service)、以及一句自然语言归因(如“因您提到‘预约’和‘专家号’,系统判断您想要挂号”)。它不生成处方、不解释指标异常、不校验医保资格,这些都交给下游专业服务完成。它的价值在于把混乱入口收束成标准语义通道,让挂号系统不必自己解析“我想挂心内科张主任下周二的号”,让报告服务不用再从“帮我看看这个CT单子”里猜用户要查哪份报告。
核心功能
本项目六大能力全部围绕「多模态输入→意图识别→服务路由」主干展开,每项均可独立启用或组合使用:
- 多模态输入统一接入
:同一套逻辑处理文字、语音、图片三类载体,避免为不同输入方式重复开发意图识别模块
- 双阶段意图分类机制
:首层用 TF-IDF + 朴素贝叶斯快速打标;低置信度 case 自动触发 LLM 辅助推理(需配置 OPENAI_API_KEY)
- 可配置路由引擎
:意图到服务节点的映射关系存于
data/routing_rules.json,支持一对多、优先级排序、灰度切换 - 全链路归因说明生成
:每个分类结果附带一句话解释,说明关键词依据与逻辑路径,便于人工复核与流程审计
- 三端一致交互体验
:API 供系统集成、CLI 供运维调试、Web 界面供临床培训演示,三者共享同一套核心逻辑
- 开箱即用的测试数据集
:内置
data/intent_dataset.json(含 6 类意图标注样本)与sample_intents.json(典型用例),降低冷启动成本
下表列出当前支持的 6 类意图及其标准定义与服务节点映射,所有条目均可在data/routing_rules.json中增删改:
意图 | 业务含义 | 对应服务节点 | 是否支持低置信度 LLM 补充 |
|---|---|---|---|
挂号 | 主动预约门诊号源(含科室、医生、时段) | registration_service | 是 |
咨询 | 病情描述、用药疑问、科室推荐等非事务性提问 | consultation_service | 是 |
改预约 | 修改、取消、重新预约已有挂号记录 | appointment_service | 是 |
查报告 | 查询历史检查/检验/体检报告(含时间、类型、机构) | report_service | 是 |
投诉 | 对服务、流程、态度等提出意见或反馈 | feedback_service | 是 |
其他 | 无法归入上述五类的泛化请求 | general_service | 是 |
使用与配置
项目开箱即用,无需训练模型或准备算力资源。安装后可通过三种模式立即验证效果:
pip install -r requirements.txt启动 API 服务(默认监听http://localhost:5000):
python app.py --mode api使用 CLI 进行本地测试(支持单次输入、交互模式、批量评估):
# 文字输入 python app.py --mode cli --text "我想预约心内科专家号" # 语音输入(mock 模式返回示例) python app.py --mode cli --voice test.wav # 图片输入(mock 模式返回示例) python app.py --mode cli --image report.png # 交互模式(持续输入,实时反馈) python app.py --mode cli --interactive # 批量测试(输出准确率、召回率) python app.py --mode cli --batch关键配置项集中于两处:
- 置信度阈值控制 LLM 触发时机,默认 0.6,可修改config.yaml或设环境变量CONFIDENCE_THRESHOLD
- 路由规则完全由data/routing_rules.json文件定义,格式为 JSON 数组,每项含intent(意图名)、service_nodes(服务节点列表,按优先级排序)、description(可选说明)
添加新意图只需两步:在data/intent_dataset.json中补充带标签的训练样本;在data/routing_rules.json中新增对应路由项。无需修改任何 Python 代码。
工程结构
项目采用清晰分层结构,各模块职责单一、边界明确,便于医院信息科或第三方厂商按需裁剪:
模块文件 | 主要职责 | 是否可移除 |
|---|---|---|
app.py | 统一入口,解析命令行参数并分发至对应模式 | 否 |
src/intent_classifier.py | TF-IDF + 朴素贝叶斯主分类器,含中文分词(jieba)与向量化逻辑 | 否(核心) |
src/llm_classifier.py | LLM 辅助分类封装,调用 OpenAI API(仅当置信度不足时触发) | 是(删除后仍可运行) |
src/routing_engine.py | 解析 | 否(核心) |
src/multi_modal_input.py | 统一处理 text/voice/image 输入,标准化为文本字符串 | 否(核心) |
src/api_server.py | Flask 接口实现,含 | 是(若仅用 CLI) |
src/cli.py | 命令行交互逻辑,支持 | 是(若仅用 API) |
templates/index.html | 响应式 Web 界面,适配手机横竖屏,含文字/语音/图片三入口 | 是(若仅用 API/CLI) |
所有配置、数据、模板均置于项目根目录或data/、templates/子目录下,无隐式路径依赖,符合医院信息系统部署规范。
环境与运行
运行环境要求极低:仅需 Python 3.8+,无 GPU 或 CUDA 依赖。语音与图片处理当前均为 mock 模式(返回预设示例结果),如需对接真实 ASR 或 OCR 服务,只需在src/multi_modal_input.py中替换对应函数实现,不影响其余模块。LLM 辅助分类为可选增强能力,配置OPENAI_API_KEY后自动启用,未配置时降级为纯规则+统计模型,不影响主流程稳定性。Web 界面完全静态,无需额外 Web 服务器,直接打开templates/index.html或通过 Flask 服务访问均可。所有依赖列于requirements.txt,含版本锁定,避免因包更新引发线上故障。
数据与扩展
项目数据资产全部明文可读、结构清晰:
-data/intent_dataset.json:JSON 数组,每项含text(原始输入)、intent(标注意图)、keywords(人工提取关键词),用于训练与验证
-data/routing_rules.json:路由策略配置,字段语义直白,支持注释(JSONC 不被 Python 原生支持,建议用 YAML 或保持无注释)
-data/sample_intents.json:覆盖六类意图的典型输入语句,供快速测试与培训演示
-data/mock_responses.json:mock 模式下各模态的返回示例,便于前端联调
扩展新意图类型时,只需按相同 JSON 结构向intent_dataset.json追加样本,并同步更新routing_rules.json。若需支持英文输入,可在src/multi_modal_input.py中加入英文分词逻辑(当前 jieba 仅处理中文),其余模块无需改动。
限制与说明
本项目当前有三项明确限制,均已在设计中留出升级路径:
- 语音识别与图片 OCR 为 mock 模式,真实场景需对接医院已有 ASR/OCR 服务或采购第三方 API
- LLM 辅助分类依赖 OpenAI,暂不支持国产大模型 API,但llm_classifier.py已抽象出call_llm()接口,可自行替换实现
- 中文分词仅用 jieba,未集成医学词典,如需提升专科术语识别率,可在src/intent_classifier.py中加载自定义词典
所有限制均不阻碍主流程运行。mock 模式下仍能完整走通「输入→分类→路由→归因」全链路,确保逻辑验证与流程培训不受影响。界面中置信度进度条采用三级颜色示意(绿色 >0.8,黄色 0.5–0.8,红色 <0.5),仅为帮助使用者快速建立判断信心,非临床决策依据。
项目地址:
https://github.com/nexorin9/internet-hospital-intent-router
