
简介这是一份面向医疗信息化从业者、产品经理、医院信息科人员及AI落地工程师的《基于DeepSeek大模型的智能电子病历生成系统解决方案》PPT资料。内容从电子病历管理现状痛点出发依次讲解系统分层架构、核心技术突破与功能模块实现重点覆盖基于DeepSeek的医疗NLP能力医疗实体识别、语义关系解析、术语标准化、上下文纠错、多模态数据交互与实时协同编辑协议以及结构化病历生成、方言/口语化处理等算法细节并给出实施流程与应用价值展望。压缩包共1个pptx文件大小651KB适合用于方案汇报、内部培训或技术选型参考。目前已有83人学习浏览内容结构完整、要点凝练可直接作为医疗信息化项目汇报或大模型病历生成方案设计的参考骨架与亮点素材。1. DeepSeek进电子病历这份解决方案解决的是“录入-质控-归档”三座山急诊夜班医生最烦的不是病人多是看完病还要对着系统敲主诉、敲现病史、敲既往史敲完第二天被质控科打回来“时间轴呢药物过敏史呢”这份《基于DeepSeek大模型的智能电子病历生成系统解决方案.pptx》要解决的就是这件事把DeepSeek这类大模型接进电子病历流程让系统听懂医患对话自动生成一份符合书写规范、字段完整、能直接进HIS系统的结构化病历初稿。它不是一个聊天机器人而是一条“采集-抽取-映射-质控”的工程管线。适合医院信息科、医疗信息化厂商、病案统计室的技术负责人看。在动手之前有四件事必须想明白模型部署在哪、提示词怎么锁格式、字段怎么映射、翻车怎么兜底。2. 模型选型与部署为什么是DeepSeek病历数据到底放哪2.1 模型选择的三条硬约束语义、可控、成本做智能电子病历生成模型选择不像做聊天助手那样“哪个强选哪个”。病历生成对错误零容忍选型时我一般只盯三条硬约束。第一条是中文医疗语义理解能力。电子病历里大量口语化表达比如“患者说胸口像针扎一样疼一阵一阵的大概有三天了”模型要能把它拆成主诉里的部位、性质、持续时间、诱因这些结构化要素。DeepSeek在中文语料上的表现和成本结构决定了它适合做这件事的基座尤其是它把“通用对话”和“推理”两个能力分得很清楚病历生成这类偏文本转换的任务用chat模型就够了不需要上推理模型。第二条是可控性。病历生成要的不是自由发挥是“照着模板填”。DeepSeek对指令跟随和JSON结构化输出支持得比较好这一点直接决定了后处理代码好不好写。如果模型经常在JSON外面包一层Markdown说明解析就要写一堆容错逻辑。第三条是成本与私有化。医院病历数据出不了院这是刚需。DeepSeek开源了可私有部署的蒸馏版本同时也提供API接入方式两条路都能走相比之下有些商用大模型虽然效果好但数据出境和单次调用成本这两关就很难过。换句话说选DeepSeek不是因为它“最聪明”而是因为它同时满足语义、可控、私有化三条约束。2.2 两套部署方案API接入与院内私有化病历生成系统的部署拓扑决定了整个项目的交付节奏。我见过两种主流做法分别适合不同阶段的医院。第一种做法是“先API接入、后私有化替换”。系统联调期用DeepSeek官方API把提示词、结构化输出、质控逻辑全部跑通等病历生成质量稳定了再决定要不要把模型搬到院内。这种做法的好处是快坏处是病历数据在联调期可能要过外网适合POC阶段用脱敏数据测试。第二种做法是“一步到位院内私有化”。用vLLM在院内GPU服务器上起一个兼容OpenAI接口的服务业务系统只认这一个内网地址。模型一般选DeepSeek的蒸馏版本显存和推理速度都现实一点# 院内私有化部署 DeepSeek 蒸馏模型以 DeepSeek-R1-Distill-Qwen-14B 为例 python -m vllm.entrypoints.openai.api_server \ --model deepseek-ai/DeepSeek-R1-Distill-Qwen-14B \ --served-model-name emr-deepseek \ --port 8000 \ --max-model-len 8192 \ --gpu-memory-utilization 0.9 \ --max-num-seqs 8 \ --enforce-eager这里是几个关键参数。--max-model-len 8192按一份完整病历的输出长度来定太短会在长现病史处截断太长会吃掉大量显存--gpu-memory-utilization 0.9意思是把单卡90%显存分配给模型服务剩下10%留给KV cache和调度抖动--max-num-seqs 8限制同时处理的请求数防止多诊室并发时OOM--enforce-eager关闭CUDA graph的预编译牺牲一点点吞吐换来“第一个请求不用等几分钟编译”的体验。提示如果你只需要文本生成、不需要深度推理私有化部署优先选chat类的蒸馏模型而非强推理模型。病历生成场景里推理链太长反而容易把简单主诉写复杂。还有一种轻量做法是直接在医生工作站所在的科室服务器上部署4bit量化版这种部署方式适合“先把流程跑起来”的小规模试点。2.3 端到端数据流从问诊语音到病历回写系统整体架构围绕一条数据流展开。方案PPT里画的那张架构图落到工程上就是六个环节环节常用工具输出验收口径语音采集诊室拾音设备 / 医生PAD16kHz以上WAV噪声环境下可听懂语音转写ASR服务或端到端多模态大模型带时间戳的对话文本字错率低于5%病历生成DeepSeek chat模型JSON结构化的病历草稿必填字段完整格式映射字段映射引擎CDA/FHIR/院内HIS字段通过Schema校验质控回写规则引擎 大模型语义检查质控意见与修订稿漏检率低于1%医生审核病历编辑器签名归档医生确认后入库数据流里最容易被忽略的一步是“上下文窗口管理”。一个患者的问诊可能是十分钟、两轮对话这三十分钟的文本不能一次性全塞给模型也不能只留最后一句话。我一般会把对话按“主诉追问-现病史-既往史-用药-家族史”分段缓存每一段作为一个独立的上下文单元生成病历时按固定顺序组装进提示词。这样既控制在8192窗口内又能保证病历段落顺序稳定。这一步做扎实了后面的信息抽取和质控都会省很多事。3. 提示词与输出格式工程把DeepSeek调教成“病历书写助手”3.1 提示词工程与上下文工程锁定角色、模板与禁止项大模型提示词工程与上下文工程在病历生成里比模型选型更决定成败。同一个DeepSeek提示词写得松它就把“现病史”写成一段散文提示词写得紧它才会按字段吐结构化文本。我常用的做法是“角色设定任务边界输出Schema禁止项”四段式。角色设定不是简单说“你是医生”而是说“你是病历书写助手你的输出会被医生审核后写入正式病历”。这句话能把模型往保守、规范的方向推。任务边界里要写清楚只根据对话内容生成不推断对话里没有的信息不写诊断结论。输出Schema直接粘贴JSON格式定义让模型把自由文本映射到固定key上。禁止项要写“不要输出任何解释性文字不要使用Markdown”。EMR_SYSTEM_PROMPT 你是一名三甲医院的电子病历书写助手。你的输出将由执业医师审核后写入正式病历。 请根据给定的医患对话生成一份结构化电子病历草稿。 任务要求 1. 只使用对话中出现的患者主诉、体征、既往史、用药史信息不得推断或补充对话中没有的内容。 2. 不输出诊断结论不给出治疗建议。 3. 现病史必须按时间先后顺序组织时间点写到具体日期或“X天前”。 4. 阴性体征和重要的阴性症状必须保留。 5. 全部输出为JSON对象不要输出Markdown不要添加任何解释性文字。 输出JSON格式 { chief_complaint: 主诉一句话概括包含部位、性质、持续时间, present_illness: 现病史按时间轴叙述包含诱因、发展、诊疗经过, past_history: 既往史包含慢性病、手术史、过敏史, physical_exam: 体格检查包含生命体征及阳性/阴性体征, medication_history: 用药史包含药名、剂量、频次、疗程, family_history: 家族史包含与本次就诊相关的遗传病或家族性疾病 } 医患对话 {transcript} 这段提示词有几个参数值得细说。{transcript}是外部传入的转写文本这里用f-string或模板引擎替换不要把对话内容直接拼进系统提示词medication_history单独抽出来作为一个字段是因为药物过敏在后续质控里是必检项“阴性体征必须保留”这条禁令直接对抗的是大模型默认“只写阳性才有价值”的倾向没有这条模型会把“双肺呼吸音清未闻及干湿性啰音”删掉而这句话在病历里恰恰能省一次鉴别诊断的麻烦。上下文工程这里还有一个“顺序敏感”问题。同一段对话放在提示词最后和放在中间生成质量有明显差异。经验值是对话放最后、Schema放中间、角色设定放最前。如果对话太长先让模型做一次“对话精简”把寒暄、重复、打断去掉再用精简结果生成病历比直接硬塞长文本效果好很多。3.2 DeepSeek API如何调用JSON结构化输出与字段兜底DeepSeek API如何调用这件事网上能查到很多例子但病历场景里有一个不一样的要求所有返回必须能稳定解析成JSON解析失败要有兜底路径不能因为一次坏输出就让整个质控流程中断。DeepSeek的API兼容OpenAI协议base_url和model名按官方文档配好即可。下面这段是我在病历生成服务里常用的调用写法from openai import OpenAI import json import re client OpenAI( api_keysk-xxx, base_urlhttps://api.deepseek.com/v1 ) def generate_emr(transcript: str, session_id: str) - dict: resp client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: EMR_SYSTEM_PROMPT}, {role: user, content: transcript} ], response_format{type: json_object}, temperature0.2, max_tokens2048, streamFalse ) content resp.choices[0].message.content try: return json.loads(content) except json.JSONDecodeError: # 兜底剥离可能混入的Markdown代码块再解析 cleaned re.sub(r(?:json)?|, , content).strip() return json.loads(cleaned)参数上有三个点要特别说明。response_format{type: json_object}表示强制模型返回JSON对象但这个约束只保证“是JSON”不保证“key齐全”所以解析后还要做字段校验temperature0.2是病历生成的标准取值高于0.5就会出现主诉措辞漂移低于0.1又会导致模板化严重max_tokens2048给足一份复杂病历的空间但也要配套“截断即失败”的检查如果发现返回长度顶到上限宁可让医生重新发起一次生成也不要留下一份写了一半的病历草稿。这里额外说一个容易踩的点DeepSeek官方API有可选参数如frequency_penalty、presence_penalty病历场景里我建议两个都设成0。设置惩罚系数会让模型刻意换词反而破坏“同一患者同一症状在不同段落里措辞一致”这个要求。3.3 流式输出与中断问诊还没结束病历就开始渲染电子病历生成系统有一个天然矛盾模型生成一份完整病历需要几秒到十几秒而医生习惯的是“患者说完话病历立刻出现”。解决方案是流式输出。后端调用DeepSeek时打开streamTrue把SSE流逐段转发给前端前端用fetch配合ReadableStream逐块解析边生成边渲染。这套交互带来的体验提升非常明显第一行主诉在1秒内出现在屏幕上医生会觉得系统“跟手”而不是“在等模型转圈”。const controller new AbortController(); async function streamEmr(transcript, sessionId) { const res await fetch(/api/emr/stream, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ transcript, session_id: sessionId }), signal: controller.signal }); const reader res.body.getReader(); const decoder new TextDecoder(); while (true) { const { done, value } await reader.read(); if (done) break; const chunk decoder.decode(value, { stream: true }); renderEmrChunk(chunk); } } // 门诊呼叫下一个患者时中断当前流并通知后端清理上下文 function abortCurrentGeneration() { controller.abort(); fetch(/api/emr/abort, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ session_id: currentSessionId }) }); }AbortController的作用不只是“停掉网络请求”关键是要让后端在收到abort时同步杀掉DeepSeek的流式响应、释放GPU显存和并发名额。否则前端早就跳走了后端还在傻傻地把一份没人看的完整病历生成完并发一高vLLM的请求队列就满了。后端abort接口里要做的三件事取消上游流、清理该session的上下文缓存、记录“未完成生成”日志供质控追踪。流式渲染还有一个细节不要把JSON结构直接推给前端渲染更好的做法是后端在流式输出前先固定Schema只流式填充字段值。比如推送的事件是{field:present_illness,content:患者于3天前…}前端拿到后按字段更新对应区块。这样医生看到的是“段落逐渐变长”而不是“一堆尖括号乱跳”。4. 信息抽取与电子病历格式映射从自由文本到结构化字段4.1 病历字段抽取策略大模型抽取加规则修正把医患对话转成结构化病历核心不是“让大模型把话说完整”而是“让大模型把字段填正确”。我建议放弃“一次生成全文”的贪心做法改成“一段对话抽取一次规则修正”的分步策略。先定Schema再让DeepSeek一次性抽取全部字段最后用规则引擎修正。Schema用Pydantic定义既能在Python侧做类型校验又能直接转成提示词里的JSON格式说明from pydantic import BaseModel, Field class EMRDraft(BaseModel): chief_complaint: str Field(description主诉必填一句话含部位、性质、时间) present_illness: str Field(description现病史必填按时间轴排列) past_history: str Field(description既往史选填未提及填空字符串) physical_exam: str Field(description体格检查必填含生命体征与阴/阳性体征) medication_history: str Field(description用药史选填) family_history: str Field(description家族史选填) allergy_history: str Field(description过敏史必填未提及填未诉) def extract_emr_fields(transcript: str) - EMRDraft: prompt f 请从以下医患对话中抽取电子病历字段。 要求只抽取对话中明确提到的内容未提到的过敏史填写“未诉”不要补充推断内容。 对话 {transcript} resp client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: prompt}], response_format{type: json_object}, temperature0.2, max_tokens1024 ) raw json.loads(resp.choices[0].message.content) draft EMRDraft(**raw) # Pydantic 校验key缺失或类型错误直接抛异常 return draft这里EMRDraft(**raw)一旦遇到缺少必填字段会抛ValidationError业务上刚好作为“抽取失败”的判据走兜底流程转人工录入。但要注意关键校验不能只靠Pydantic类型检查真正有用的是后面的规则修正。规则修正至少做三件事日期统一成“2025-03-14”或“3天前”二选一不能混用药物名统一成规范写法比如“扑尔敏”改成“马来酸氯苯那敏”数值单位统一成阿拉伯数字和标准单位。这些规则虽然笨但能稳定兜住大模型最不擅长的“格式一致性”。提示像OneKE这类以知识抽取为目标的大模型框架也可以作为病历抽取管线的一层后处理。但对大部分医院项目直接让DeepSeek按自定义Schema抽取、再用规则修正已经足够不必为“知识抽取”再引入一套框架。4.2 对齐电子病历数据标准字段映射与转换智能电子病历生成系统的终极输出不是给医生看的一段文本而是能写入HIS、能通过质控校验、能和外部系统交换的结构化数据。这一步就落到格式映射上。行业里常见的交换标准有HL7 CDA、FHIR Composition以及国内电子病历基本数据集的标准字段。我的做法是DeepSeek层只输出“业务语义字段”映射层再做一次转换。好处是DeepSeek不需要知道目标系统的字段名提示词保持稳定目标系统升级字段时只改映射表不改模型。业务语义字段常见映射目标说明chief_complaintCDA/component/structuredBody/chiefComplaint主诉单文本present_illnessCDA 现病史章节保留时间轴顺序past_historyCDA 既往史章节手术史、住院史分开可拆解physical_examCDA 体格检查章节生命体征转数值类型allergy_historyFHIR AllergyIntolerance过敏原反应类型medication_historyFHIR MedicationStatement药名映射到药品字典编码转换逻辑里有一个坑同义词合并。医生写“青霉素过敏”系统里可能叫“青霉素G”DeepSeek抽取出来的是自由文本如果不做药品字典映射FHIR里就存了一条无法被医嘱系统引用的过敏史。所以映射步骤不能只是“改个key名”要带一次字典查询比对不到的放“待映射”队列由药剂科人工维护一次后续再遇到就自动匹配了。映射完成后的验证也值得一提。不要只在测试环境比对样本要在上线前对一个批次的脱敏历史病历跑一遍“原病历→对话模拟→模型生成→格式映射→与原病历字段比对”的回归测试。这个批次最好覆盖门诊常见病的前30种每种至少10份否则你根本不知道映射表覆盖了多少真实场景。4.3 质控回写必填项、时间轴与术语一致性病历生成完后端质控是最后一道闸门。不要指望大模型把质控也一并做了更稳的做法是“规则质检做硬校验大模型做语义软校验”两者取并集输出质控意见。硬校验用代码就能完成比如必填项检查、时间轴倒序检查、单位合法性检查def qc_emr(draft: dict) - list[dict]: issues [] required [chief_complaint, present_illness, physical_exam, allergy_history] for field in required: if not draft.get(field) or draft.get(field) 未诉 and field chief_complaint: issues.append({level: error, field: field, msg: f必填字段{field}缺失}) # 时间轴一致性抽取所有日期描述检查是否按时间先后排列 dates re.findall(r(\d{4}[-年]\d{1,2}[-月]\d{1,2}日?|\d天前|\d小时前), draft.get(present_illness, )) # 简化处理将“X天前”转换为负偏移比较顺序 for i in range(len(dates) - 1): if parse_time(dates[i]) parse_time(dates[i 1]): issues.append({level: warning, field: present_illness, msg: f时间轴疑似倒序: {dates[i]} → {dates[i1]}}) # 术语一致性同一次就诊中药物名表述必须一致 meds extract_medications(draft.get(medication_history, )) if len(set(meds)) ! len(meds): issues.append({level: warning, field: medication_history, msg: 药物名存在不一致表述}) return issues这段代码里的parse_time是一个把“3天前”“2025-03-14”统一转成时间偏移值的函数核心就是做比较不追求精确日历换算。质控这一层最重要的是“分级”error级阻挡病历入库warning级只提醒医生确认。电子病历生成系统的责任边界就在这里系统可以生成可以提醒但最终确认权在医生。大模型语义软校验主要盯两类问题一是主诉和现病史是否描述同一部位、同一症状二是现病史里有没有出现对话里完全没提过的“新事实”。后者本质上是幻觉检测做法是把“质控意见”也作为一次提示词任务交给DeepSeek让它对照对话原文逐字段打分再和硬校验结果汇总。汇总后的质控意见要回写到病历编辑器的侧边栏医生可以一键接受修订或逐条忽略这样质控动作本身也有迹可循。5. 避坑智能病历生成的高频翻车现场5.1 时间轴说谎主诉和现病史对不上现象模型生成的主诉写“胸痛3天”现病史里却写“患者于2025年3月10日无明显诱因出现胸痛3月12日加重”但当天是3月15日算下来才5天与主诉矛盾。质控科一眼就抓出来医生还得手工改。原因主诉和现病史是分字段生成的模型在写主诉字段时用了“3天”这个口语表达在写现病史时用了对话里提到的具体日期两处没有做一致性校验。这类问题靠“提示词里强调”效果有限因为模型在长上下文中天然容易丢失跨度信息。解决在主诉生成后加一条独立规则抽取现病史中的最早时间点和主诉时间做比对偏差超过1天就打回重生成。重生成时把主诉作为上下文传给模型明确要求“现病史时间轴须与主诉时间一致”。另外对话里如果有具体日期优先用具体日期而非“X天前”因为日期换算在规则层比在模型层可靠得多。5.2 JSON解析失败输出多了Markdown和解释现象调用DeepSeek返回的内容是{chief_complaint: 胸痛3天...}\n\n已为您生成上述病历请核对。json.loads直接抛异常或者整段被包在json 里。原因response_format设置为json_object时模型大多数时候会遵守但一旦上下文过长或提示词里出现“请核对”这类暗示交互的词模型就倾向在JSON后面补一句人话。另一个诱因是system prompt结尾用了“输出”而不是“只输出JSON对象”。解决提示词禁止项里明确加一条“禁止在JSON前后输出任何非JSON字符”解析时用正则先把JSON块剥离再json.loads如果仍然失败不要直接报错把返回内容拼进一条修复提示发给模型让它“提取其中的JSON并修正格式”多数情况下第二次能成功。把这条修复逻辑封装成repair_json(content)函数所有调用入口统一走它日志里单独统计修复率修复率超过2%就要回头查提示词问题。5.3 会话串号A医生的病历混进了B医生的话现象门诊叫号系统切到下一个患者医生端编辑器里却还在吐上一个患者的病历草稿甚至出现两个患者信息混在同一份主诉里的情况。原因前端abort后后端没有及时清理session上下文DeepSeek的流式响应把后半段内容写进了新会话的缓冲区。这类问题大多不是模型问题是会话生命周期管理没做好。解决前端abort时同时发起一个abort接口后端收到后立刻三步走取消上游流式请求、清空该session的对话历史、生成一条“生成终止”标记事件推给前端。新患者开始时强制创建新的session_id旧session里的未完成草稿统一存为“待处理”状态由医生确认是否删除或归档。多诊室部署时还要注意vLLM侧按session做隔离同一个模型服务进程里不能靠内存里的全局变量存上下文。5.4 幻觉兜底初稿必须过“生成-审核-签名”三关现象模型在现病史里写“患者既往有高血压病史5年”但翻遍整段医患对话患者从没提过高血压。这是典型的大模型幻觉更隐蔽的是它还能编出“5年”这种具体数值。原因模型在生成病历草稿时会把训练语料里的常见病史分布当成先验对话里没提的内容它就按概率补上了。温度调低能减轻但无法根除纯靠提示词禁止“推断”也堵不住。解决架构上强制“生成-审核-签名”三关。生成是DeepSeek的活审核是医生的活签名是住院电子病历系统的活。系统在生成时要把“信息来源”一并带出比如每条现病史后面标注“来自患者原话”没有来源支撑的段落自动标记为“模型补全待确认”。医生审核界面里这些待确认项高亮显示不确认不签字不签字不能归档。这套流程不是给医生添麻烦而是把“大模型是不可靠初稿生成器”这个事实兜进业务流程里让责任边界清晰可查。6. 从“能用”到“好用”RAG知识库增强与微调时机6.1 先用RAG把本院模板和术语喂给DeepSeek病历生成效果做到80分容易再往上走瓶颈往往变成“模型不懂你们医院怎么写病历”。解决方案不是换模型而是先做RAG知识库增强。做法是把三类资料切块入库本院各科室的病历书写模板、药物与诊断的标准术语表、既往质控通过的病历脱敏样本。生成病历时先按“主诉现病史关键词”检索出最相关的模板和样本拼进提示词作为参考from langchain_community.vectorstores import FAISS from langchain_community.embeddings import HuggingFaceEmbeddings embeddings HuggingFaceEmbeddings(model_nameBAAI/bge-large-zh-v1.5) db FAISS.load_local(./emr_knowledge_base, embeddings, allow_dangerous_deserializationTrue) def retrieve_emr_context(transcript: str, k: int 3): # 用患者主诉片段检索取最相近的模板与样例 docs db.similarity_search(transcript[:120], kk) return \n.join([d.page_content for d in docs])检索到的内容不是直接塞给模型就完事要明确告诉模型“参考以下模板的格式和术语习惯但不要复制样例中的患者信息”。RAG的价值在于让模型站在本院书写习惯的肩膀上落笔同时把患者隐私泄漏控制在提示词边界内。注意向量库文件里存的是脱敏样本不能把未脱敏的真实病历直接入库这个红线一次都不能踩。6.2 再谈微调什么时候才值得做大模型微调实战RAG解决“没见过本院写法”的问题但如果同一类错误反复出现比如外科系统经常把“切口愈合等级”漏掉就可以考虑大模型微调实战了。微调的时机我建议用数据量判断当你积攒了2000份以上经过医生确认修改、质控通过的历史病历且RAG调整已经无法降低同类错误率就值得做LoRA微调。数据准备是“对话最终确认版病历”配对训练时让模型学习“从这段对话到这份最终病历的映射路径”。重点不是让模型变聪明而是让它把“本院写法”内化成输出习惯。微调之后不要马上替换线上模型先跑一个月的影子模式新旧模型并行生成由医生在界面上标注“哪个版本更接近最终稿”统计偏好率。我见过不少项目死在“微调完就上线”结果医生反馈还没出来质控先崩了。影子模式是微调落地最便宜的后悔药。6.3 效果怎么验证一张三维度评测表病历生成系统的验收建议每周固定抽50份病历做三维度评测结果直接贴在项目周报里维度指标抽样方式完整性必填字段缺失率、平均段落长度门诊排名前30疾病的病历各抽2份准确性主诉-现病史时间轴矛盾数、药物名错误率主治及以上医师复核规范性术语标准率、模板格式符合率质控科按现有质控标准打分三个维度对应的改进动作不同完整性差先调提示词和必填校验准确性差优先查RAG检索质量和上下文组装顺序规范性差才轮到考虑微调。按这个顺序排查比“感觉模型不行就换模型”靠谱得多。我最后悔的一件事就是项目早期没有把“质控回写”设计进第一版流程导致上线后医生靠手工追补漏诊记录。质控不应该是后补的功能它应该和病历生成同一天上线。希望这套思路对你搭建自己的智能电子病历生成系统有帮助。本文还有配套的精品资源点击获取