一、功能定位与业务流程

1.1 在系统中的定位

"智愈"系统设计了三个用户角色:游客注册用户管理员。三个角色使用系统的深度逐级递增,而"病情诊断书导入分析"功能服务于已经登录的注册用户,是"智能医生"模块的重要补充:

  • 智能医生:用户主动提问,AI 以对话形式回答健康咨询
  • 诊断书导入分析:用户上传真实诊断书,系统自动识别、分析、关联知识库,生成结构化的解读报告

两者形成"主动咨询 + 报告解读"的双通道体验,覆盖用户寻医问药的完整场景。

1.2 核心业务流程

整个功能从用户上传文件到拿到分析报告,需要经历以下关键步骤:

用户上传诊断书 → 文件校验与存储 → Qwen-VL 多模态识别
    → 结构化信息提取 → 本地知识库关联匹配 → 生成解读报告 → 前端展示

二、功能设计

2.1 功能模块全景

我们将整个功能拆解为四个核心模块,每个模块承担明确的职责:

病情诊断书导入分析

文件接入

  • 多格式上传
  • OSS存储
  • 格式校验

智能识别

  • Qwen-VL识别
  • 结构化提取

分析解读

  • 疾病关联
  • 药品匹配
  • 通俗化解读生成

结果展示

  • 诊断概览卡片
  • 异常指标高亮
  • 关联知识跳转
  • 历史记录回溯

2.2 模块一:文件接入

职责:接收用户上传的诊断书文件,完成前置校验并存储到云端。

项目现有的 FileController.java 已经实现了文件上传的基础能力——通过 OssClient 将文件上传至阿里云 OSS 并返回 URL。本模块将直接复用这一能力,同时补充诊断书场景的特殊需求:

支持的文件格式:

格式 说明 处理策略
JPG / PNG 手机拍照的检验单、处方 直接送入 Qwen-VL
PDF 电子病历、出院小结 基于 PDFBox 提取文本;若为扫描件则逐页转图片后送入 Qwen-VL

上传交互流程:

  1. 用户在"智能医生"页面或专门的诊断书分析入口选择文件
  2. 前端校验文件格式与大小(限制 10MB)
  3. 点击上传后,通过 AJAX 异步提交至 /file/upload 接口
  4. 文件存储至阿里云 OSS,返回可公开访问的 URL
  5. 前端展示缩略图预览,用户确认后点击"开始分析"
/**
 * 文件控制器
 *
 */
@RestController
@RequestMapping("/file")
public class FileController extends BaseController<User> {

    @Autowired
    private OssClient ossClient;

    /**
     * 上传文件
     */
    @PostMapping("/upload")
    public RespResult upload(@RequestParam("file") MultipartFile file) throws IOException {
        String url = ossClient.upload(file, String.valueOf(loginUser.getId()));
        if (Assert.isEmpty(url)) {
            return RespResult.fail("上传失败", url);
        }
        return RespResult.success("上传成功", url);
    }
}

2.3 模块二:智能识别

职责:调用 Qwen-VL 多模态模型,从诊断书图片中提取文字并进行结构化解析。

这是整个模块的技术核心。利用 Qwen-VL 一次调用完成"识别 + 理解"两个任务,不走传统 OCR + 后处理的两阶段路线。

项目现有的 ApiService.java 已经封装了对通义千问 DashScope SDK 的调用,但当前只使用了纯文本模型(QWEN_TURBO)。本模块需要在其基础上增加图片输入的支持,调用通义千问的多模态能力。

Prompt 设计方案:

要让 Qwen-VL 输出符合系统要求的结构化数据,关键在于系统指令(System Prompt)的设计:

你是一位专业的病历分析助手。请分析图片中的诊断书内容,
以 JSON 格式输出以下信息(如果某项不存在则设为 null):

1. patient_info: { name, gender, age }  // 患者信息
2. diagnosis: { disease_name, icd_code }  // 诊断结论
3. indicators: [{ name, value, unit, reference_range, is_abnormal }]  // 检查指标
4. prescriptions: [{ drug_name, usage, dosage }]  // 处方信息
5. advice: string  // 医嘱建议
6. summary: string  // 通俗解读(用患者能听懂的语言解释诊断结果)

注意:务必基于图片中的实际内容输出,不要编造信息。

通过这样的 Prompt 设计,Qwen-VL 一次推理即可返回结构清晰的 JSON,后端无需再做复杂的文本解析。

2.4 模块三:分析解读

职责:将 Qwen-VL 提取出的诊断信息与系统中的本地知识库做关联匹配,生成有上下文的分析报告。

这是"AI + 本地知识库"混合架构的关键环节。匹配链路由三个步骤组成:

步骤一:疾病关联

将 Qwen-VL 识别出的 disease_name 与项目数据库中的 illness 表做模糊匹配:

  • 完全匹配则直接关联
  • 部分匹配则使用 MySQL LIKE 查询或分词匹配
  • 匹配成功后获取:疾病名称、引起原因、主要症状、特殊症状

项目的 IllnessService.java 已有成熟的 findIllness() 方法实现了多字段模糊搜索,可以直接复用。

步骤二:药品关联

识别出的处方药品名称,与 medicine 表做关联:

  • 获取药品功效、用法用量、禁忌、相互作用
  • 通过 illness_medicine 关联表反查该疾病对应的推荐药品列表
  • 若处方药品不在本地库中,则标记为"未收录药品",仅展示 AI 识别结果

步骤三:通俗化解读生成

第二次调用通义千问(纯文本模型),将结构化诊断数据 + 本地知识库信息整合为通俗易懂的解读文本:

  • 避免医学术语堆砌
  • 用自然语言解释"检查指标异常意味着什么"
  • 给出生活建议和注意事项
  • 附加"请以主治医生意见为准"的免责声明

2.5 模块四:结果展示

职责:将分析结果以清晰、直观的方式展示给用户。

Web 端采用项目现有的 Thymeleaf + jQuery + Bootstrap 技术栈,设计以下展示区域:

诊断概览卡片区:

  • 顶部展示患者信息(已脱敏)和就诊日期
  • 核心诊断结论用醒目字体展示
  • 异常检查指标用红色高亮,正常指标用绿色

关联知识面板:

  • 展示系统数据库中匹配到的疾病详情入口
  • 展示推荐药品列表
  • 展示药品相互作用与禁忌提醒

通俗解读区:

  • AI 生成的通俗化解读报告全文
  • 附加"本报告仅供参考,不构成医疗建议"的提示

2.6 处理流程时序图

用户                 前端                 后端服务               阿里云OSS         Qwen-VL
 │                     │                     │                     │                │
 │  ①选择诊断书并上传   │                     │                     │                │
 │────────────────────>│                     │                     │                │
 │                     │  ②POST /file/upload │                     │                │
 │                     │────────────────────>│                     │                │
 │                     │                     │  ③存储文件           │                │
 │                     │                     │────────────────────>│                │
 │                     │                     │<──── 返回文件URL ────│                │
 │                     │<─ 返回URL与预览图 ───│                     │                │
 │  ┌───────────────────│                     │                     │                │
 │  │ ④用户确认分析     │                     │                     │                │
 │  └───────────────────│                     │                     │                │
 │                     │  ⑤POST /diagnosis   │                     │                │
 │                     │    /analyze          │                     │                │
 │                     │────────────────────>│                     │                │
 │                     │                     │  ⑥调用Qwen-VL多模态  │                │
 │                     │                     │──────────────────────────────────>│
 │                     │                     │<── ⑦返回结构化JSON ───────────────│
 │                     │                     │                     │                │
 │                     │                     │  ⑧解析JSON          │                │
 │                     │                     │  ⑨查询illness/      │                │
 │                     │                     │    medicine知识库    │                │
 │                     │                     │                     │                │
 │                     │                     │  ⑩调用QWEN_TURBO    │                │
 │                     │                     │    生成通俗解读      │                │
 │                     │                     │──────────────────────────────────>│
 │                     │                     │<── ⑪返回解读文本 ────────────────│
 │                     │                     │                     │                │
 │                     │                     │  ⑫持久化分析结果    │                │
 │                     │                     │                     │                │
 │                     │<─ ⑬返回完整分析结果─│                     │                │
 │  ┌───────────────────│                     │                     │                │
 │  │ ⑭渲染展示结果     │                     │                     │                │
 │  └───────────────────│                     │                     │                │

三、技术选型

3.1 整体技术栈

层次 技术选型 选型依据
前端渲染 Thymeleaf + jQuery + Bootstrap 项目现有技术栈
文件上传 阿里云 OSS SDK 项目中 OssClient.java 已封装完整
多模态识别 Qwen-VL(DashScope SDK) 第二篇博客已完成选型论证
语义分析 通义千问 QWEN_TURBO(DashScope SDK) 项目中 ApiService.java 已接入
数据存储 MySQL + MyBatis-Plus 项目现有 ORM 框架
异步处理 Spring @Async + CompletableFuture 零额外依赖,Spring Boot 原生支持
PDF 解析 Apache PDFBox 成熟稳定,Apache 开源协议

3.2 异步处理策略

诊断书分析包含两次 AI 调用(Qwen-VL 多模态识别 + QWEN_TURBO 生成解读),耗时通常在 5-15 秒。如果采用同步处理,用户将长时间等待 HTTP 响应,体验极差。

因此采用异步处理架构:

前端提交分析 → 后端立即返回(状态:处理中)
    → 后端异步执行识别与分析
    → 前端轮询查询处理状态
    → 状态变更为"已完成"后拉取结果展示

项目使用 Spring Boot 自带的 @Async 注解即可实现异步执行,配合 CompletableFuture 编排多步骤任务,无需引入消息队列等重依赖。

3.3 为什么坚持"AI + 本地知识库"的混合架构?

纯 AI 方案的问题:

问题 具体表现
幻觉 AI 可能生成系统中根本不存在的药品或疾病名称
不一致 AI 对药品功效的描述可能与数据库中官方维护的信息矛盾
成本高 让 AI 完整生成所有关联信息,Token 消耗大
响应慢 生成长篇内容的延迟显著增加

混合方案的应对:

  • AI 只做"理解"与"提取"——这是 AI 擅长且不可替代的部分
  • 知识关联走本地数据库查询——结果 100% 准确且与系统已有数据一致
  • 用户点击"查看详情"时跳转到现有的疾病详情页(illness-reviews.html)和药品详情页(medicine.html),体验无缝统一
  • Token 消耗控制在全 AI 方案的 30%-40%

四、总结

本篇博客完成了"病情诊断书导入分析"模块的完整功能设计与技术选型。核心思路可以概括为三条设计原则:

  1. 继承:基于 Qwen-VL 构建识别能力,不做重复选型
  2. 复用:最大化复用"智愈"系统现有的文件上传、AI 集成、知识查询能力
  3. 混合:AI 做理解与提取,本地数据库做知识关联,各取所长

下一篇博客:

  • 新建诊断书分析相关的数据表
  • 实现 DiagnosisController 与 DiagnosisService
  • 扩展 ApiService 支持 Qwen-VL 多模态调用
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐