
第十二阶段汇报云端算力接入——远程 GPU 分割 影像缓存管线 百炼 VLM Agent 角色隔离阶段目标将 MedSafe 从本地单机推理升级为云端算力混合架构——新增远程 GPU 分割 WorkerAutoDL 云服务器 本地/远程 Fallback 编排器568 行核心代码新增两级影像分析缓存管线574 行避免重复 VLM/多 Agent 调用重写 Vision LLM 客户端接入阿里云百炼 Model StudioQwen3-VL-Plus新增 Agent 角色隔离证据过滤框架126 行 6 个 Agent 重写新增报告段落 RAG、Embedding 自适应发现、MIMIC-III I/O 模块。承接Stage 11科室感知引擎 24 专科 Agent KB v5 309 例 Benchmark。实验日期2026-06-23 ~ 2026-06-24本报告版本v1一、从本地单机到云端混合升级动机Stage 11 完成了科室感知智能规则加权、专科 Agent、KB v5但所有计算仍运行在本地——医学影像的 3D 分割TotalSegmentator、BraTS 肿瘤模型在 CPU 上动辄数分钟VLM 临床报告生成每次都要重新调用 Qwen DeepSeek这在临床场景中不可接受。Stage 12 的核心思想是把算力密集的任务卸载到云端 GPU同时保证本地开发环境的完整可用性——通过 Fallback 机制实现有云用云、无云降级。维度Stage 11 终态Stage 12 终态变化影像分割算力仅本地 CPU本地 远程 GPUAutoDL云端卸载分割降级策略无Remote → Local Fallback新增影像分析缓存无两级缓存VLM 分析 完整报告新增Vision LLM本地 Mock / 简单 HTTP百炼 Model StudioQwen3-VL-Plus重写Agent 证据过滤全量传递角色隔离4 类过滤器新增Embedding 发现硬编码模型名LM Studio 自适应发现新增报告段落 RAG无TF-IDF 段落检索 追问新增测试文件014 个857 行新增二、远程 GPU 分割系统核心功能2.1 架构概览本地 MedSafe 主服务 云端 AutoDL GPU 服务器 ┌─────────────────────┐ ┌─────────────────────────┐ │ app.py /api/v1/ │ │ remote_worker.py │ │ imaging/segment │ │ (独立 FastAPI 应用) │ │ │ │ │ │ │ segment_orchestrator│ │ POST /internal/segment │ │ │ │ │ │ │ │ remote_client.py │ ── HTTP ───► │ SegmentService │ │ (multipart upload) │ ◄── results ── │ (CUDA GPU 推理) │ │ │ │ │ │ │ │ _download_artifacts│ ◄── files ──── │ _stage_artifacts │ │ (overlay/mask 回传)│ │ (overlay/mask 暂存) │ └─────────────────────┘ └─────────────────────────┘ │ │ │ fallback_to_localtrue │ MEDSAFE_IMAGING__DEVICEcuda ▼ │ SegmentService (本地 CPU) │ SSH 隧道: ssh -L 9000:...2.2 文件结构src/imaging/ ├── remote_config.py (31 行) ─ 远程 Worker 配置读取 ├── remote_client.py (222 行) ─ HTTP 客户端上传/下载/健康检查 ├── remote_worker.py (215 行) ─ 远程 GPU Worker独立 FastAPI ├── segment_orchestrator.py (100 行) ─ 本地/远程编排 Fallback scripts/ └── start_segment_worker.sh (22 行) ─ AutoDL 启动脚本远程 GPU 核心代码总计568 行Python 22 行Shell。2.3 配置层remote_config.pyremote_config.py从config.yaml的imaging.remote段读取配置imaging:remote:enabled:false# 总开关base_url:# Worker 地址SSH 隧道后为 http://127.0.0.1:9000api_token:# Bearer Token 认证timeout_seconds:600# 超时 10 分钟3D 分割可能较慢fallback_to_local:true# 远程失败时降级本地health_cache_seconds:30# 健康检查缓存 30 秒worker:host:127.0.0.1port:9000所有配置均可通过环境变量覆盖MEDSAFE_IMAGING__REMOTE__ENABLED等支持.env文件注入。remote_segment_configured()判断是否满足启用条件enabledtruebase_url非空。2.4 HTTP 客户端remote_client.pyremote_client.py的run_remote_segment()实现了完整的远程调用链路上传阶段使用httpx的 multipart 上传将影像文件PNG/JPEG/GZ和可选的 NIfTI 体积文件以UploadFile形式发送同时附带 JSONmetadatamodel_ids、organ、slice_axis、slice_index、point、bbox。认证机制Bearer Token 双通道——支持Authorization: Bearer xxx标准头和X-Api-Token自定义头Worker 端任选其一验证。结果回传Worker 返回job_idartifact_paths列表客户端通过_download_artifacts()逐个下载 overlay/mask 文件到本地data/imaging_cache/remote_pull/{job_id}/然后_rewrite_paths()递归替换结果中的远程路径为本地路径。下载完成后发送DELETE /internal/jobs/{job_id}清理远端临时文件。健康检查check_remote_health()带 30 秒缓存 TTL避免每次分割都做 HTTP 探活。/health端点返回remote_segment_status()供主服务的/api/v1/health聚合使用。2.5 远程 GPU Workerremote_worker.pyremote_worker.py是一个独立的 FastAPI 应用MedSafe Segment Worker v1.0.0部署在 AutoDL 云服务器上# 在 AutoDL 服务器上运行bashscripts/start_segment_worker.sh# 等效于MEDSAFE_IMAGING__DEVICEcuda python -m src.cli segment-workerWorker 暴露 4 个端点端点方法功能POST /internal/segmentPOST接收影像上传执行 GPU 分割暂存产物GET /internal/jobs/{id}/artifactGET下载指定 Job 的产物文件overlay/maskDELETE /internal/jobs/{id}DELETE清理 Job 临时目录GET /healthGET健康检查返回 device 类型和可用模型列表关键设计——_stage_artifacts()将分割后端的输出文件source_image、overlay_path、mask_path、volume_mask_path复制到data/imaging_cache/remote_jobs/{job_id}/artifacts/并将结果中的路径重写为相对路径。这避免了客户端直接访问 GPU 服务器的文件系统。安全方面所有端点通过_auth_dep()依赖注入做 Token 校验download_artifact对路径做..和绝对路径检查防止目录穿越。2.6 编排器与 Fallbacksegment_orchestrator.pyrun_segment_with_fallback()是用户请求的入口实现了三级决策1. 远程已配置 ├── 是 → 调用远程 Worker │ ├── 成功 → 返回 已使用云端 GPU 完成分割 │ └── 失败 → fallback_to_local? │ ├── true → 本地 CPU 执行返回 云端分割服务不可用已降级为本地运算{reason} │ └── false → HTTPException 503 └── 否 → 直接本地执行返回值包含 5 个字段results分割结果列表、memory_peak_mb内存峰值、compute_mode“local” / “remote”、compute_message中文用户提示、fallback_from_remote是否发生了降级。app.py的/api/v1/imaging/segment端点直接调用此编排器响应中的SegmentResponse新增三个字段classSegmentResponse(BaseModel):results:listmemory_peak_mb:floatcompute_mode:strlocal# local | remotefallback_from_remote:boolFalsecompute_message:str# 中文用户提示前端ImagingView.vue在分割完成后展示compute_message作为信息横幅。2.7 AutoDL 部署方案.env.example中提供了完整的部署指引# 1. AutoDL 服务器上启动 Workerbashscripts/start_segment_worker.sh# 2. 本机建立 SSH 隧道ssh-pport-L9000:127.0.0.1:9000 rootconnect.xxx.seetacloud.com# 3. 本机 .env 配置MEDSAFE_IMAGING__REMOTE__ENABLEDtrueMEDSAFE_IMAGING__REMOTE__BASE_URLhttp://127.0.0.1:9000MEDSAFE_IMAGING__REMOTE__API_TOKENchange-meMEDSAFE_IMAGING__REMOTE__FALLBACK_TO_LOCALtrue选择 AutoDL 是因为其按小时计费的 GPU 实例A100/V100适合间歇性的大规模影像分割任务无需维护常驻 GPU 服务器。三、影像分析缓存管线3.1 两级缓存架构Stage 12 引入了两级文件级缓存避免对同一影像研究重复调用昂贵的 VLM 多 Agent 管线L1: VLM 分析缓存 (analysis_cache) ┌──────────────────────────────────────────────┐ │ data/imaging_cache/analysis/{source}/ │ │ {patient_id}/{study_id}.json │ │ 内容: Qwen3-VL 分析结果 DeepSeek 综合 │ └──────────────────────────────────────────────┘ │ ▼ L2: 完整报告缓存 (report_cache) ┌──────────────────────────────────────────────┐ │ data/imaging_cache/reports/{source}/ │ │ {patient_id}/{study_id}.json │ │ 内容: VLM 规则审查 多Agent辩论 综合报告 │ └──────────────────────────────────────────────┘文件行数功能analysis_cache.py50ImagingAnalysisCacheStore——按 study 粒度 JSON 读写report_cache.py50ImagingReportCacheStore——完整报告 JSON 读写warm_analysis.py137VLM 分析预热Qwen → DeepSeek 综合warm_report.py116全流程预热VLM 规则 多 Agent 报告case_persist.py88影像报告桥接 CaseStore缓存管线总计441 行核心代码 133 行预热脚本。3.2 分析预热流程warm_analysis.pywarm_study_analysis()的流程从ImagingCatalog查找目标 studyresolve_study_source_images()解析源影像路径——优先使用 catalog 中的预览图无图则从 NIfTI 体积导出中心切片export_slice_png()最多取 4 张调用 Qwen3-VLanalyze_images()做视觉分析传入影像、患者摘要、模态信息可选调用 DeepSeeksynthesize_report()综合 VLM 分析结果写入ImagingAnalysisCacheEntry并持久化get_or_run_study_analysis()提供 cache-or-compute 语义——有缓存直接返回无缓存则执行分析。3.3 完整报告预热warm_report.pywarm_study_full_report()是更重量级的预热——在 L1 VLM 分析基础上继续执行规则审查 → 多 Agent 辩论 → DeepSeek 综合 → 生成完整临床报告 → 持久化到 L2 缓存 CaseStore。SOURCE_FALLBACK_CANDIDATES字典为不同影像来源提供模态适配的候选药物列表确保规则审查即使在缺少真实处方时也能产出有意义的审查结果。3.4 新增 API 端点端点方法功能GET /api/v1/imaging/analysis-cache/{patient_id}/{study_id}GET读取分析 报告缓存POST /api/v1/imaging/analysis-cache/warmPOST触发 VLM 分析预热3.5 批量预热脚本scripts/warm_imaging_analysis_cache.py133 行支持命令行批量预热python scripts/warm_imaging_analysis_cache.py\--sourcemimic_cxr\--limit10\--vlm-only参数--source指定影像来源、--limit限制数量、--force强制覆盖缓存、--clear清空缓存、--vlm-only仅做 VLM 分析不做完整报告。四、百炼 Model Studio 接入Vision LLM 重写4.1 架构变化src/llm/vision_client.py354 行完全重写从简单的 HTTP 客户端升级为阿里云百炼Model Studio原生集成vision_client.py ├── resolve_bailian_vision_base_url() ─ 区域感知 URL 解析 ├── QwenVisionClient ─ Qwen3-VL-Plus 云端视觉分析 │ ├── analyze_images() ─ 多影像 患者摘要 → VLM 分析 │ └── _build_messages() ─ OpenAI 兼容消息构造 └── DeepSeekSynthesisClient ─ DeepSeek 多源综合报告 └── synthesize_report() ─ VLM分析 规则 Agent意见 → 综合报告4.2 区域感知 URL 解析resolve_bailian_vision_base_url()支持 5 个阿里云区域的别名映射区域代码别名API 端点cn-beijing华北2、beijingdashscope.aliyuncs.comap-southeast-1新加坡、singaporedashscope-intl.aliyuncs.comap-northeast-1东京、tokyodashscope-intl.aliyuncs.comeu-central-1frankfurtdashscope-intl.aliyuncs.comusvirginiadashscope-intl.aliyuncs.com支持 Workspace ID——当配置了workspace_id时URL 自动切换为 MaaS 域名格式。4.3 模型升级模型从qwen-vl-max-latest升级到qwen3-vl-plus后者在医学影像描述任务上有显著提升。新增VisionLLMError异常类带status_code字段支持对 API 错误做精确分类处理。五、Agent 角色隔离与增强5.1 角色证据过滤框架src/agents/role_evidence.py126 行定义了 4 类确定性证据过滤器确保每个 Agent 只看到属于自己职责范围的规则证据过滤器角色允许的 evidence categoryfilter_pharmacist_evidence()临床药师drug_interaction, duplicate_ingredient, ddi_*filter_attending_evidence()主治医师clinical_scenariofilter_specialist_evidence()专科医师special_population, clinical_scenariofilter_department_evidence()科室专员priority_categories ∪ {clinical_scenario, special_population}关键设计opinion_from_evidence()可以纯基于规则证据生成AgentOpinion无需 LLM 调用——这为规则已明确命中的场景提供了确定性快速路径。strip_foreign_evidence_citations()在辩论阶段清理 Agent 引用了不属于自己角色的证据——如果检测到外来证据标记如allergy:前缀出现在药师意见中自动降级block_decision并在 reasons 中标注已忽略超出本角色职责的理由。5.2 六个 Agent 重写Agent 文件行数核心变化allergy_specialist.py277过敏审查 Agent全新角色隔离 证据过滤pharmacy_inventory.py189药房库存 Agent全新药品供应链审查department_specialist.py182科室专员 Agent增强接入科室上下文引擎internal_medicine.py159内科医师 Agent增强综合审查specialist_router.py130专科路由 Agent增强智能分诊clinical_pharmacist.py120临床药师 Agent增强DDI 审查增强5.3 聊天服务患者上下文感知src/react/chat_service.py206 行新增_rule_engine_kwargs()函数从ChatRequest.patient_context中提取patient_age、is_pregnant、conditions、extra_drugs四个维度传递给规则引擎的check_interactions_by_rules()。这意味着规则降级路径L2 RULE_FALLBACK现在也能感知患者上下文。src/yuan_fallback/rule_engine.py479 行对应扩展——接受患者年龄、妊娠状态、合并症、额外药物参数使人群禁忌检查不再依赖硬编码默认值。六、Embedding 自适应发现src/llm/embedding_client.py351 行新增 LM Studio 模型自动发现机制配置: model nomic-embed-text │ ├── _fetch_api_models() → 查询 LM Studio /models 端点 ├── _pick_embedding_model() → 模糊匹配配置名 → embed 关键词 → token 匹配 └── _resolve_api_model() → 缓存解析结果避免重复查询_pick_embedding_model()的匹配优先级精确匹配配置的模型名包含embed关键词的模型Token 匹配nomic、bge、e5、minilm等常见 embedding 模型标识这解决了 LM Studio 中模型 ID 可能是完整路径如nomic-ai/nomic-embed-text-v1.5而配置中只写短名nomic-embed-text的不匹配问题。src/llm/errors.py65 行新增三个异常类DrugSearchModelNotReadyError、DdiModelNotReadyError、VisionLLMError使错误处理更精确。七、报告段落 RAGsrc/reports/paragraph_rag.py62 行src/reports/report_qa.py43 行实现了基于 TF-IDF 的报告段落追问系统医生提问: 这个结节的恶性概率如何 │ ├── ParagraphRAGIndex.search() → TF-IDF cosine 排序返回 top_k 相关段落 ├── build_context() → 段落 最近 5 条历史 QA └── ReportQAService.ask() → 注入 LLM system prompt → 生成回答ParagraphRAGIndex使用中英文双语 tokenizer中文字符 字母数字分词构建 smoothed IDF 向量。ReportQAService将检索到的段落上下文注入 LLM 的 system prompt要求模型基于报告内容回答并将问答记录保存为 supplement关联related_paragraph_ids。八、MIMIC-III 数据基础设施src/mimic_io.py66 行新增 MIMIC-III 数据读取工具函数功能read_table()CSV/CSV.GZ 表读取优先 gzip支持 chunksizecxr_patient_folder()MIMIC-CXR-JPG 目录映射patient_id → 影像目录estimate_egfr_mg_dl()MDRD 公式 eGFR 估算肌酐 mg/dL九、测试覆盖Stage 12 新增14 个测试文件总计857 行测试文件行数覆盖范围test_remote_segment.py134远程分割编排禁用/降级/成功/不可降级 4 场景test_imaging_analysis_cache.py29分析缓存读写test_imaging_report_cache.py36报告缓存读写test_role_scoped_agents.py84角色证据过滤 外来证据剥离test_case_replay.py69病例回放端到端test_allergy_specialist_agent.py115过敏专员 Agent 审查test_pharmacy_inventory_agent.py93药房库存 Agent 审查test_department_agents.py28科室 Agent 激活条件test_vlm_image_paths.py36VLM 影像路径校验test_auth_department_agents.py97科室感知认证 Agent 偏好test_imaging_scope.py111科室级影像访问控制test_embedding_client.py25Embedding 模型名匹配十、与已有模块的集成方式Stage 12 延续加法操作原则同时做了必要的接口适配已有模块是否修改集成方式src/imaging/segment_service.py❌ 零改动编排器调用segment_serial()不变只是选择本地或远程执行src/review_engine.py❌ 零改动Agent 角色隔离在 Agent 层做不影响规则引擎src/knowledge_base.py❌ 零改动证据过滤在role_evidence.py做不改 KB 加载src/department/❌ 零改动科室上下文通过department_specialist.py接入src/app.py✅ 适配/imaging/segment改用编排器新增 2 个缓存端点/health聚合远程状态src/schemas.py✅ 扩展SegmentResponse新增 3 字段新增ImagingAnalysisCacheEntry等config.yaml✅ 新增imaging.remote配置段9 个配置项.env.example✅ 新增5 个远程 Worker 环境变量 SSH 隧道指引requirements.txt✅ 新增python-multipart0.0.9FastAPI 文件上传前端ImagingView.vue✅ 适配展示compute_message信息横幅前端types/index.ts✅ 扩展SegmentResponse新增 3 个 TS 类型字段十一、阶段总览Stage 12 架构全景 用户请求 ─── /api/v1/imaging/segment ───┐ │ segment_orchestrator.py │ │ │ ┌─────────┴──────────┐ │ ▼ ▼ │ remote_client.py SegmentService │ (HTTP multipart) (本地 CPU) │ │ │ ▼ │ remote_worker.py │ (AutoDL GPU CUDA) │ │ │ ▼ │ _stage_artifacts() │ (产物暂存 路径重写) │ │ │ ▼ │ _download_artifacts() │ (本地路径回写) │ 影像分析缓存流 study → resolve_source_images → Qwen3-VL (百炼) → DeepSeek 综合 → L1 分析缓存 (JSON) → 规则审查 多Agent辩论 综合报告 → L2 报告缓存 (JSON) CaseStore Agent 角色隔离流 RuleEvidence[] → filter_pharmacist_evidence() → 药师 Agent → filter_allergy_evidence() → 过敏 Agent → filter_attending_evidence() → 主治 Agent → filter_department_evidence() → 科室 Agent → opinion_from_evidence() (确定性无 LLM)十二、Stage 12 交付物src/imaging/remote_config.py31 行远程 Worker 配置读取src/imaging/remote_client.py222 行HTTP 客户端 健康检查 产物下载src/imaging/remote_worker.py215 行AutoDL GPU Worker 独立 FastAPI 应用src/imaging/segment_orchestrator.py100 行本地/远程 Fallback 编排器scripts/start_segment_worker.sh22 行AutoDL 启动脚本src/imaging/analysis_cache.py50 行L1 VLM 分析缓存src/imaging/report_cache.py50 行L2 完整报告缓存src/imaging/warm_analysis.py137 行VLM 分析预热src/imaging/warm_report.py116 行全流程报告预热src/imaging/case_persist.py88 行影像报告桥接 CaseStorescripts/warm_imaging_analysis_cache.py133 行批量预热脚本src/llm/vision_client.py354 行百炼 Qwen3-VL-Plus DeepSeek 综合src/llm/embedding_client.py351 行LM Studio 自适应模型发现src/llm/errors.py65 行3 个新异常类src/agents/role_evidence.py126 行角色隔离证据过滤框架6 个 Agent 重写allergy/pharmacy/department/internal/specialist/pharmacist共 1,057 行src/react/chat_service.py206 行患者上下文感知规则降级src/yuan_fallback/rule_engine.py479 行患者上下文扩展src/reports/paragraph_rag.py62 行TF-IDF 段落 RAGsrc/reports/report_qa.py43 行报告追问服务src/mimic_io.py66 行MIMIC-III 数据 I/O 工具config.yaml166 行新增imaging.remote配置段.env.example74 行新增 5 个远程 Worker 环境变量src/cli.py183 行新增segment-worker子命令tests/14 个测试文件 / 857 行前端适配ImagingView compute_message 横幅 SegmentResponse 类型扩展十三、一句话总结Stage 12 让 MedSafe 从本地单机推理进化为云端算力混合架构——远程 GPU Worker 部署在 AutoDL 上通过 SSH 隧道接入影像分割自动卸载到云端并在失败时降级本地 CPU两级缓存VLM 分析 完整报告避免重复调用百炼 Qwen3-VL-Plus 和 DeepSeekAgent 系统引入角色隔离证据过滤6 个 Agent 重写实现职责边界清晰化——MedSafe 现在既能利用云端 GPU 的算力加速又能在断网时完全本地运行。