
简介一份面向计算机、医学信息工程等专业毕业设计的完整项目包基于LLM与多模态人工智能实现健康管理与辅助诊疗系统覆盖从需求分析到答辩展示的关键环节。资源共247个文件压缩包约93.2MB以Python/vue/js源码、SQL数据库脚本、PDF论文及md说明为主并含jpg/webp等图片素材用于界面与流程示意。已有92人浏览学习。项目后端采用Flask与SQLAlchemy集成pika连接RabbitMQ处理消息队列前端基于Vue.js与Element Plus并通过PyTorch与Transformers调用Qwen2.5-3B-Instruct完成语义理解。从前端交互到后端服务均有对应实现可学习多模态数据接入、大模型推理、健康指标管理以及辅助诊疗功能的完整思路适合作为毕业设计参考或二次开发蓝本。1. 毕业设计选这个题赌的是大模型 LLM 的推理能力不是模型大小每年毕设选题季总有人抱着“基于 LLM 与多模态人工智能的健康管理与辅助诊疗系统”这类题目来找我问要不要动刀健康管理是问得最多的方向之一。这个话题看起来是做个网页实际上真正的难点在于用户上传一张体检报告或口述一段症状系统要能用大模型 LLM 的推理能力做分析同时用多模态人工智能把图片、语音、数值这些异构输入统一收进来。这个项目的核心竞争力不在模型本身而在数据规整、Prompt 工程和风险兜底三件事——把这三个点吃透论文、现场演示和答辩 PPT 就都有了支撑。适合有 Python 基础、想走 AI 应用方向、希望在答辩时展示完整工程链路的学生。2. 先定技术路线本地 GGUF 还是云端 API多模态管线怎么搭2.1 本地 GGUF 与云端 API 的取舍毕设演示不能赌现场网络选题在“LLM”上最常见的纠结点是要不要本地部署。我的建议是两条路都走但主次分明。云端 API 的优势是模型能力上限高、代码量少适合把功能先跑通本地 GGUF 的优势是演示现场不受网络影响而且“能在自己电脑上跑大模型”本身就是答辩时容易被认可的工作量。不要二选一开发态用云端 API演示态用本地 GGUF一套调用逻辑覆盖两种模式。对比维度本地 GGUFllama.cpp server云端 API演示可靠性断网可用但受笔记本算力限制现场网络断了就翻车模型能力7B 量化模型推理质量够用商用模型质量更高成本零成本按 token 计费工程量需要写部署与调优章节接口调用较简单答辩风险可能被追问性能瓶颈容易被质疑“套壳”所以我一般会要求先把云端 API 的链路写通等功能全部验收后再花两天时间用 llama.cpp 的 server 模式在本地起一个兼容 OpenAI 协议的服务模型文件提前下载到电脑上。这样开发时不用等本地推理演示时又不怕断网。为什么选它而不是跑 Python 推理框架原因很实际llama.cpp 的 server 启动后提供一个/v1/chat/completions接口和 OpenAI SDK 的调用方式几乎一样应用层只写一套调用逻辑切换模型只需要改base_url。对毕设来说这个抽象让“本地/云端双轨”的实现成本降到最低。本地模型一般选 7B 量级的开源指令模型GGUF 量化后体积在 4 到 5GB 左右普通笔记本用 CPU 也能跑只是速度会慢一些。要注意别一上来就选 13B 或 70B那是给学生机挖坑。再进一步GGUF 的量化模型也能被移动端应用加载如果你后续想扩展到安卓端做健康提醒这算是一条现成的路。另外有些同学会引入 LangChain 这类框架来减少胶水代码但我不太建议在毕设里用——框架抽象会遮住数据流答辩被追问某个回调是怎么触发的容易卡壳。2.2 多模态管线体检报告走 OCR语音走 ASR文本直达 LLM“多模态人工智能”这个词听起来重但实际上健康管理场景的常见工程做法是把多模态拆成三条感知管线再用一个统一数据结构去对齐它们而不是去训练一个大一统模型。视觉模态负责“看”体检报告、化验单以图片上传用 OCR 把版面转成文字再从文字里抽出指标名、数值和单位听觉模态负责“听”用户口述症状时用 ASR 把语音转成文本文本模态负责“读”用户在对话框输入的健康自述直接进入结构化流程不需要额外感知。三条管线汇合后所有信息最终都映射到同一个“健康快照”字典里用户画像年龄、性别、身高、体重、病史、指标列表名称、数值、单位、参考范围、主诉文本。这个字典就是多模态融合的产物后续 Prompt 构造、规则引擎、结果展示都只依赖它。在论文里把这一节命名为“多模态异构数据的结构化对齐”评审会觉得你理解了多模态的本质不是“模型能看图”而是“数据能对齐”。2.3 系统边界设计为什么只做辅助建议不做自动诊断辅助诊疗这四个字如果把握不好容易被答辩老师追问你的系统凭什么做诊断谁来负责所以项目定位从一开始就要明确——这是一个辅助决策支持系统不是诊断系统。我在设计里会刻意做三个边界约束。第一个约束是措辞边界所有输出都用“建议”“可能”“请咨询医生”这类词绝不出现“确诊”“患有”这样的断言。Prompt 里明确告诉模型它是“健康管理助手”而不是“医生”只负责整理信息、提示风险和引导就医。第二个约束是规则边界危急值判断绝不放给 LLM 自由发挥血糖低于 2.8mmol/L、血压高于 180/110mmHg 这类临界情况由代码硬编码的规则引擎直接拦截输出固定提示。LLM 可以做趋势分析和个性化建议但“是否立即就医”这种决定性判断必须由规则层先兜底。第三个约束是隐私边界论文里写明所有上传数据仅保存在本地不持久化存储答辩时用假数据演示即可不用真实体检报告。这三条边界写进需求分析章节能直接把系统的专业度拉起来。3. 核心链路实现把多模态输入变成 LLM 能推理的结构化数据3.1 体检报告图片的多模态提取OCR 与正则的配合下面给一个能跑的最小实现用 PaddleOCR 对体检报告图片做中文识别再用正则抽取几个常见指标。版式不同就改正则这是一个常规起点。# 体检报告图片 - 结构化健康指标 # 常见做法PaddleOCR 识别中文版面正则抽取指标名与数值 from paddleocr import PaddleOCR import re ocr PaddleOCR(use_angle_clsTrue, langch) # 指标清单用于正则匹配 METRIC_PATTERN re.compile( r(血压|空腹血糖|总胆固醇|甘油三酯|谷丙转氨酶|肌酐|尿酸) r\s*[:]?\s*([\d.])\s*(mmHg|mmol/L|umol/L)? ) def extract_metrics(image_path: str) - dict: result ocr.ocr(image_path, clsTrue) lines [] for page in result: for item in page: text item[1][0] confidence item[1][1] if confidence 0.8: lines.append(text) metrics {} for line in lines: m METRIC_PATTERN.search(line) if m: name m.group(1) metrics[name] { value: float(m.group(2)), unit: m.group(3) or 未知, } return metrics这段代码有几个参数值得解释use_angle_clsTrue表示对倾斜图片做方向校正手机拍的报告经常是歪的这个选项能明显提高识别率langch指定中文语种confidence 0.8把低置信度的识别结果丢弃避免把“日期”“联系人”这类噪声文本误当成指标。正则里的单位是可选组因为有些报告把单位写在表头而不是数值后面这时候 unit 会是“未知”需要在后面做单位推断。跑完这段你会得到类似{空腹血糖: {value: 6.5, unit: mmol/L}}的字典。注意正则只覆盖了 7 个指标真实报告通常有几十项正确做法是把指标清单维护成配置文件逐项写匹配规则。不要指望一次覆盖全部能在论文里讲清楚“哪些受支持、哪些需要扩展”就够了。OCR 在清晰图片上的识别率通常能到 90% 以上但打印版和手机拍的报告差异很大。提示演示前务必用目标图片实测一遍 OCR 识别率不合格的图片先手动标注后再展示别让 OCR 在答辩现场出丑。3.2 健康快照构建指标归一化与危急值规则兜底从 OCR 拿到的只是“原始读数”LLM 记不住每家医院的参考范围不能直接把读数喂给它。构建健康快照时要在代码层把每个指标的参考范围补齐并统一单位这一步是后面 Prompt 少翻车的关键。# 健康快照把原始读数转成带参考范围的结构化数据 # 规则层做两件事单位归一化 危急值硬拦 REF_RANGES { 空腹血糖: {unit: mmol/L, low: 3.9, high: 6.1}, 血压: {unit: mmHg, low: 90, high: 139}, # 收缩压示例 } # 单位换算有的报告用 mg/dL需要转回 mmol/L UNIT_CONVERT { 空腹血糖: {mg/dL: lambda v: round(v / 18.02, 2)}, } def build_snapshot(metrics: dict, profile: dict) - dict: snapshot {profile: profile, metrics: []} for name, item in metrics.items(): rule REF_RANGES.get(name) if not rule: continue unit item[unit] value item[value] if unit in UNIT_CONVERT.get(name, {}): value UNIT_CONVERT[name][unit](value) unit rule[unit] snapshot[metrics].append({ name: name, value: value, unit: unit, ref_low: rule[low], ref_high: rule[high], }) return snapshot # 危急值规则代码层硬判不走 LLM def check_critical(snapshot: dict) - list: alerts [] for m in snapshot[metrics]: if m[name] 空腹血糖 and m[unit] mmol/L: if m[value] 2.8: alerts.append(血糖低于 2.8mmol/L存在低血糖危急值请立即就医) if m[value] 16.7: alerts.append(血糖高于 16.7mmol/L存在高血糖危急值请立即就医) # 其他指标的危急值规则按需扩展 return alerts逻辑说明build_snapshot把 OCR 结果与静态参考范围表关联过滤掉系统不认识的指标。单位归一化通过UNIT_CONVERT里的换算函数完成比如 mg/dL 会转回 mmol/L。check_critical是独立规则层每新增一个指标只需在REF_RANGES和check_critical里各加一行不需要动 LLM 逻辑。参数说明ref_low和ref_high是判断正常与否的基准不同人群参考范围不一样毕设里可以简化为成年人通用值但要在论文里写明这个简化假设。value 2.8是低血糖的经典切割值16.7是高血糖的常用参考值如果查到的范围略有差异以权威指南为准代码里留好注释即可。做完这一步你手里就有了一份“带上下文的健康快照”它既是规则引擎的输入也是下一步 Prompt 的素材。3.3 诊疗推理的 Prompt 模板用 JSON 约束让模型按格式输出健康快照准备好后就该调用 LLM 了。下面这套代码先用统一的 OpenAI 兼容接口调用本地 GGUF 服务再要求模型输出 JSON方便后续程序解析。# 诊疗推理把健康快照和主诉拼成 Prompt要求模型输出 JSON # 适用于本地 llama.cpp server 或任何 OpenAI 兼容接口 import json from openai import OpenAI client OpenAI( base_urlhttp://127.0.0.1:8080/v1, # 本地 GGUF 服务地址 api_keynot-needed ) SYSTEM_PROMPT 你是一名健康管理助手仅提供辅助建议不做医疗诊断。 你必须基于输入的健康快照进行分析禁止使用记忆中的参考范围。 如果快照中存在危急值提醒need_see_doctor 必须为 true。 回答必须是合法的 JSON不要输出任何额外文字。 def analyze_health(snapshot: dict, complaint: str) - dict: user_payload { profile: snapshot[profile], metrics: snapshot[metrics], complaint: complaint, output_format: { risk_level: low|medium|high, abnormal_metrics: [指标名及异常原因], suggestions: [可执行建议], need_see_doctor: False, reason: 一句简要解释 } } resp client.chat.completions.create( modelqwen2.5-7b-instruct-q4_k_m.gguf, # 换成你实际下载的模型文件 messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: json.dumps(user_payload, ensure_asciiFalse)} ], temperature0.2, max_tokens1024, ) content resp.choices[0].message.content return json.loads(content) # 若解析失败说明模型没按约定输出这里几个参数是踩过坑之后才定下来的temperature0.2让输出更确定医学相关内容不适合创造性发挥太高会出现同一个指标被解释成三种结论的情况max_tokens1024基本够用太长会增加演示等待时间把整个用户输入用json.dumps序列化而不是拼成自然语言段落可以显著降低模型误解析的几率。我在用本地服务时遇过response_format{type: json_object}不被支持的情况所以上面的代码没有依赖这个参数而是靠 Prompt 强制输出 JSON。如果你的本地服务支持 json_object 模式建议加上但要注意加了response_format或tools参数后部分本地服务会直接拒绝请求报类似 “provider rejected the request schema or tool payload” 的错误。遇到这个报错先去掉 schema 相关参数再看日志。到这里一条最小链路已经闭环图片进 OCROCR 进规则层规则层进 PromptPrompt 进 LLMLLM 输出 JSON。论文实现章节把这张数据流图画出来比任何文字都有说服力。4. 把毕设做成完整交付物论文、PPT 与演示脚本三线并行4.1 演示脚本三段式先跑通主流程再讲边界最后晒评测毕业答辩的现场演示时间一般只有 5 到 8 分钟很多学生把时间浪费在展示“能登录、能注册”上这是最亏的。演示的本质是让老师在有限时间内相信三件事系统有用、系统有难度、系统是可靠的。我习惯把演示拆成三段。第一段跑通主流程2 分钟上传一张体检报告截图系统识别指标后给出健康快照再输入一句“最近总是口渴”系统给出风险等级和就医建议。第二段展示边界能力1 分钟故意输入一个包含危急值的快照让系统直接弹出“请立即就医”的干预层说明规则引擎在起作用。第三段晒评测1 分钟打开一个统计页面展示 30 条测试用例的通过率和 LLM as Judge 的平均分告诉老师“这个系统不只是能跑而是可度量”。演示环节预计时长核心要点主流程演示2 分钟完整链路一次走通边界干预演示1 分钟危急值必须触发硬规则评测结果展示1 分钟测试集加回归脚本体现工程能力如果现场网络或硬件不给力至少要备一份提前录好的演示视频。录屏不是作弊是工程演示的标准兜底方案论文测试章节里也可以引用录屏中的结果。4.2 论文系统实现章节写设计决策别贴大段代码论文里系统实现这一章最容易写成代码附录一整段代码贴上去然后配一句“本模块实现了某某功能”。评审老师并不想读代码他们想看到的是“你为什么这么设计”和“实现过程中做了什么关键决策”。我建议按模块组织每个模块包含三个层次模块职责、关键设计决策、核心代码片段。以 OCR 模块为例职责是“将体检报告图片转为结构化指标”设计决策要写两点——为什么用 OCR 加正则而不是直接把图片喂给多模态大模型以及为什么用独立规则层处理危急值代码片段只放 15 到 20 行核心逻辑其余放入附录。论文章节建议内容篇幅控制绪论背景、意义、国内外现状15%相关技术LLM、多模态、OCR、ASR10%需求分析用例图、功能需求、边界约束15%系统设计架构图、模块划分、数据流20%系统实现各模块职责加决策加核心代码25%系统测试用例表、评测集、LLM as Judge 结果15%这个结构里需求分析放“边界约束”是我比较坚持的一点把辅助诊疗不做自动诊断、数据本地化、危急值规则优先这三条写进去。就这三条能让论文的查重风险下降也让答辩老师觉得你不是在做一个玩具。测试章节别写“经测试系统运行正常”这种废话直接把回归脚本的评分表放上去。4.3 汇报 PPT 的信息结构一页一个说服任务汇报 PPT 和论文不同论文允许完整展开PPT 必须做减法。常见问题是每页塞 5 个要点老师一页都没看清就翻过去了。我的原则是一页一个说服任务整份 PPT 只讲一段完整逻辑。页码说服任务页面要点1说明价值“做了什么 解决什么问题”一句话2问题背景健康数据碎片化、指标看不懂3技术路线LLM 负责推理、多模态负责感知4架构图五模块数据流一图胜千言5核心创新健康快照对齐多模态输入6系统演示嵌入录屏或现场演示7测试验证评测集、回归脚本、评分表8总结展望局限与后续计划每页正文不超过 4 行图表优先。架构图和演示截图的视觉冲击力远大于文字。答辩 PPT 不用出现大量代码核心逻辑用一张数据流图就能说清。最后一页的“局限与后续计划”很关键主动说不足比被老师追问出来要好得多。5. 落地避坑从模型幻觉到答辩质疑的五个翻车现场5.1 正常指标被误判为异常参考范围必须注入 Prompt现象血压 120/80mmHg、空腹血糖 5.2mmol/L 这类完全正常的指标被 LLM 提示为“存在高血压风险”“血糖偏高”。原因模型训练时见过的参考范围和你用的不一样或者它根本就是在发挥概率联想。如果你不把参考范围喂给它它就用自己的记忆去猜。解决把ref_low和ref_high显式放进健康快照并在 System Prompt 里加一句“只能基于给定的参考范围判断禁止使用记忆中的参考范围”。temperature 降到 0.2 以下每次更新 Prompt 后都跑一遍测试用例做回归具体做法在第 6 章展开。5.2 演示现场卡顿图片压缩与模型预热必不可少现象上传一张 3MB 的体检报告照片OCR 识别加本地 LLM 推理耗时接近 40 秒答辩现场气氛瞬间凝固。原因图片过大导致 OCR 排队本地 7B 模型没有被预热首次推理还要加载权重。解决图片上传前先压缩到最长边 2000px 以内JPEG 质量保持 80 以上既能保留识别率又能显著提速。演示前先跑一条与现场无关的查询让模型常驻内存这属于“预热”而不是“作弊”。如果还慢就换更小量化的本地模型或者演示时改用云端接口本地模型作为离线兜底。5.3 论文查重超标框架文档复述是重灾区现象技术综述部分查重率居高不下明明是自己写的却全被标红。原因很多学生直接复述了框架官方文档和教程原文。LangChain 的文档描述、PaddleOCR 的 README这类文本是查重系统的高频比对源。解决每写一个技术点先关闭参考文档用自己的话写下“这个技术解决什么问题、为什么选它、代价是什么”。代码只保留核心片段流程图和架构图全部自己画不要截图别人的图。查重前自查一遍“我看这段能认出是哪篇博客吗”能认出来就重写。5.4 “这不就是套壳吗”用三层自研设计回应现象答辩现场被问“你这个系统不就是把 API 包装了一下吗”直接语塞。原因系统的技术深度没有展示出来。如果只做了“前端提交、后端转发、API 拼 Prompt”确实容易被归为套壳。解决答辩前准备好三张牌。第一张是健康快照层的自研工作量——指标配置、单位换算、危急值规则第二张是评测集与回归脚本——用 30 条用例保障可靠输出第三张是本地部署能力——模型能在断网条件下跑。这三件事没有一件是调 API 自动完成的每张牌都是一页 PPT 能讲清的独立工作。5.5 本地 GGUF 资源失控量化级别与上下文窗口的取舍现象8GB 内存的笔记本跑 7B 量化模型单次推理 40 秒偶尔直接内存溢出退出。原因量化级别选得过高上下文窗口开太大或者模型本身就超过了笔记本的承载范围。解决优先选 7B 级别的 q4_k_m 量化版本内存占用能压到 4GB 左右上下文窗口从默认 4096 降为 2048关掉并行请求推理一次只处理一条。如果笔记本确实吃力换成 5B 或 6B 模型或者用 CPU 推理加小模型组合。演示前先跑一次 llama.cpp 的 server 启动命令确认内存峰值心里有底才敢现场操作。6. 验证与进阶技巧用 LLM as Judge 做回归测试把评估变成答辩亮点6.1 用 LLM as Judge 给系统输出打分功能跑通后最容易被漏掉的一步是验证。你不可能手工核对每一轮对话的合理性而一份评估集只有在“法官”的帮助下才能规模化运转。常规做法是让一个能力更强的模型当裁判从准确性、安全性、友好性三个维度给系统输出打分。# LLM as Judge让另一个模型评估系统输出 # 裁判模型与系统模型分开避免“互相吹捧” def judge_score(case, system_result, judge_client): prompt f 根据标准答案评价系统输出。 标准答案{case[expect]} 系统输出{system_result} 分别打分准确性(0-10)、安全性(0-10)、友好性(0-10) 只输出 JSON格式{{accuracy: 8, safety: 9, friendliness: 7}} resp judge_client.chat.completions.create( modelgpt-4o-mini, # 换成你实际可用的裁判模型 messages[{role: user, content: prompt}], temperature0, ) return json.loads(resp.choices[0].message.content)注意裁判模型要和被测模型不同否则分数容易虚高。这里的temperature0是为了让裁判多次打分的结果一致否则同一条输出每次分数都变回归就失去意义。6.2 把评估集变成回归测试改完 Prompt 立即回测比代码更值钱的资产是评估集。我会维护 30 到 50 条用例覆盖正常、异常、危急值三类场景每次改完 Prompt 就批量跑一遍把平均分变化记到日志里。这样哪一次改动让哪项指标掉了分日志会直接告诉你。def run_regression(cases, judge_client): total {accuracy: 0, safety: 0, friendliness: 0} for case in cases: system_result run_case(case[input]) scores judge_score(case, system_result, judge_client) for k in total: total[k] scores[k] return {k: v / len(cases) for k, v in total.items()}这套流程跑完你的模型输出就不再是黑匣子了哪次改动让哪项分数下降一眼就能定位。答辩时把回归脚本的截图放进论文测试章节比任何空洞的“系统测试通过”都有说服力。如果遇到 LLM 输出解析失败规则层要先能兜住这就是系统级的容错。我自己带过的项目里凡是提前把评估集和回归脚本做好的答辩时都从容得多。这个习惯不限于毕设做过一次你就会知道它的价值。希望帮到你。本文还有配套的精品资源点击获取