山东大学软件学院项目实训-创新实训-医院自助服务系统(二)
时间2026.3.27-4.5工作内容智能诊断书扫描功能开发初步SpringBoot 通义千问VL实现智能诊断书识别 - 医疗自助服务系统开发实践一、模块开发背景在本次创新项目实训中我负责开发“智愈”医疗自助服务系统的“病情诊断书导入分析功能模块”。该模块的核心目标是- 支持用户上传诊断书、检验报告等医疗文档- 通过AI技术自动识别并提取关键医疗信息- 将非结构化的医疗文档转化为结构化数据- 辅助用户理解诊疗结论提升就医体验二、技术选型Spring Boot 2.6.7 后端框架通义千问VL qwen-vl-plus 多模态视觉语言模型识别诊断书阿里云OSS 2.4.0 图片存储签名URL方式OkHttp 4.10.0 HTTP客户端调用AI接口FastJSON1.2.47 JSON解析Lombok 1.16.22 简化代码为什么选择通义千问VL通义千问VL是阿里云推出的多模态大模型具备强大的OCR能力和语义理解能力特别适合医疗文档这种复杂版面的识别场景。相比传统“OCR NLP解析”的两步走方案VL模型可以直接端到端输出结构化结果开发效率更高。三、系统架构设计前端上传 ───▶ OSS存储 ──▶ 通义千问VL ───▶ 结构化输出诊断书图片 (签名URL) 模型分析 JSON结果核心流程1. 用户上传诊断书图片支持JPG、PNG、PDFPs目前仅支持jpgpdf和png待优化开发2. 图片上传至阿里云OSS生成签名URL有效期30分钟3. 调用通义千问VL API传入图片URL和Prompt4. 模型返回结构化JSON前端展示分析结果四、核心代码实现4.1 OSS上传服务签名URL方式Slf4jComponentpublic class OssClient {Value(${oss.bucket-name})private String bucketName;Value(${oss.end-point})private String endPoint;Value(${oss.access-key})private String accessKeyId;Value(${oss.access-secret})private String accessKeySecret;public String upload(MultipartFile file, String path) throws IOException {OSSClient ossClient new OSSClient(endPoint, accessKeyId, accessKeySecret);try {String extension getFileExtension(file);String fileUrl path / IdUtil.simpleUUID() extension;// 上传文件ossClient.putObject(new PutObjectRequest(bucketName, fileUrl, file.getInputStream()));// 生成签名URL有效期30分钟Date expiration new Date(System.currentTimeMillis() 30 * 60 * 1000);GeneratePresignedUrlRequest request new GeneratePresignedUrlRequest(bucketName, fileUrl);request.setExpiration(expiration);URL signedUrl ossClient.generatePresignedUrl(request);return signedUrl.toString();} finally {ossClient.shutdown();}}}为什么使用签名URL而不是公共读考虑到医疗数据的敏感性我们选择签名URL方式URL具有时效性30分钟自动失效既能保证AI模型正常访问又不会造成数据泄露风险。4.2 通义千问VL调用服务Slf4jServicepublic class MedicalRecordAnalysisService {Value(${ai-key})private String apiKey;private static final String DASHSCOPE_API_URL https://dashscope.aliyuncs.com/api/v1/services/aigc/multimodal-generation/generation;public JSONObject analyzeMedicalRecord(String imageUrl) {// 构建请求体JSONObject requestBody new JSONObject();requestBody.put(model, qwen-vl-plus);JSONArray content new JSONArray();// 图片内容JSONObject imageContent new JSONObject();imageContent.put(image, imageUrl);content.add(imageContent);// 文本提示词JSONObject textContent new JSONObject();textContent.put(text, buildMedicalPrompt());content.add(textContent);// 发送请求Request request new Request.Builder().url(DASHSCOPE_API_URL).addHeader(Authorization, Bearer apiKey).addHeader(Content-Type, application/json).post(RequestBody.create(MediaType.parse(application/json),requestBody.toJSONString())).build();// 处理响应...}}4.3 Prompt设计关键private String buildMedicalPrompt() {return 你是一位专业的三甲医院主治医师。请仔细分析这张诊断书/检验报告图片严格按照以下JSON格式返回结构化信息\n\n {\n \patient_name\: \患者姓名\,\n \patient_age\: \年龄\,\n \patient_gender\: \性别\,\n \diagnosis\: {\n \primary_diagnosis\: \主要诊断结论\,\n \secondary_diagnosis\: \次要诊断\,\n \icd_code\: \疾病编码\\n },\n \symptoms\: [\症状1\, \症状2\],\n \examinations\: [\n {\n \item\: \检查项目\,\n \result\: \结果\,\n \reference\: \参考范围\,\n \status\: \正常/偏高/偏低\\n }\n ],\n \medications\: [\n {\n \name\: \药品名称\,\n \dosage\: \用法用量\,\n \frequency\: \频率\,\n \duration\: \周期\\n }\n ],\n \recommendations\: \医生建议\,\n \report_date\: \报告日期\,\n \hospital_name\: \医院名称\,\n \doctor_name\: \医生姓名\\n }\n\n 注意事项\n 1. 如果图片中不存在某字段填写null\n 2. 只输出纯JSON不要有任何解释文字;}五、前端页面实现5.1 页面功能- 支持拖拽/点击上传诊断书图片- 图片预览功能- AI分析进度提示- 结构化结果展示患者信息、诊断结论、检验项目、用药建议等- 分析报告导出JSON格式5.2 关键代码async function analyzeMedicalRecord(file) {const formData new FormData();formData.append(file, file);const response await fetch(/api/medical-record/analyze, {method: POST,body: formData});const result await response.json();displayAnalysisResult(result.data);}六、踩坑与解决方案问题1Java 9 缺少 JAXB 依赖错误信息 ClassNotFoundException: javax.xml.bind.JAXBException解决方案 添加JAXB依赖xmldependencygroupIdjavax.xml.bind/groupIdartifactIdjaxb-api/artifactIdversion2.3.1/version/dependency问题2OSS设置公共读被拒绝错误信息** Put public bucket acl is not allowed解决方案** 使用签名URL替代公共读不修改Bucket权限问题3AI无法下载图片内容错误信息 Failed to download multimodal content解决方案- 确保URL可公网访问签名URL方式- 或改用Base64方式直接传递图片内容问题4MessageManager在新版SDK中不存在解决方案新版DashScope SDK移除了MessageManager改用ListMessage方式// 旧版2.9.0MessageManager msgManager new MessageManager(10);// 新版2.16.7ListMessage messages Arrays.asList(Message.builder().role(Role.SYSTEM.getValue()).content(...).build(),Message.builder().role(Role.USER.getValue()).content(...).build());七、功能测试效果该阶段测试效果不佳仍需改进部分信息识别不出来后期改进。八、项目总结成果1. ✅ 实现了诊断书图片的上传与智能识别2. ✅ 集成通义千问VL大模型端到端输出结构化数据3. ✅ 设计了专业的医疗Prompt提升识别准确率4. ✅ 采用签名URL方案保障医疗数据安全5. ✅ 前端页面美观用户体验良好技术收获- 掌握了多模态大模型VL的调用与Prompt工程- 深入理解了阿里云OSS签名URL的使用场景- 积累了SpringBoot AI集成的实战经验- 学会了处理医疗文档OCR的特殊挑战后续优化方向1. 增加更多医疗文书模板的适配2. 优化手写体识别准确率3. 接入医学知识图谱提供更精准的分析建议4. 增加分析结果的PDF报告导出功能
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2487851.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!