一、为什么不能把所有任务都交给大模型

完整链路可以概括为:

上传图片 → 视觉AI验证 → CNN三分类 → Grad-CAM热力图 → AI通俗解释 → 医生复核

本项目将不同任务分配给不同能力:

  • CNN:完成正常、细菌性肺炎和病毒性肺炎分类;
  • DeepSeek 视觉模型:判断上传内容是不是胸部 X 光片;
  • DeepSeek 文本模型:把 CNN 结构化结果转写为通俗报告;
  • 医生:完成最终复核。

视觉模型只做粗粒度输入把关,不对胸片进行疾病诊断。这样既能过滤明显错误的图片,又避免通用模型越权输出医学结论。

二、配置项设计

为了避免把 Key 写死在代码中,可以在数据库配置表保存以下项目:

deepseek_api_key       DeepSeek API Key
deepseek_vision_model  deepseek-v4-flash-vision-exp
deepseek_text_model    deepseek-chat
llm_timeout            请求超时秒数
image_check_enabled    是否启用影像把关
report_gen_enabled     是否启用报告生成

管理端修改配置后清理缓存,即可立即生效。公开仓库、SQL 文件和截图中都不应包含完整 API Key。

三、图片转Base64 Data URL

视觉接口需要接收图片,可以把本地文件转换为 Base64 Data URL:

import base64
import os

def image_to_data_url(image_path):
    ext = os.path.splitext(image_path)[1].lower().lstrip('.')
    mime = 'jpeg' if ext in ('jpg', 'jpeg') else (ext or 'jpeg')
    with open(image_path, 'rb') as file:
        encoded = base64.b64encode(file.read()).decode('ascii')
    return f'data:image/{mime};base64,{encoded}'

请求消息由一个图片块和一个文本提示词组成:

messages = [{
    'role': 'user',
    'content': [
        {
            'type': 'image_url',
            'image_url': {'url': image_to_data_url(image_path)},
        },
        {
            'type': 'text',
            'text': '判断图片是否为胸部X光片,只输出JSON。',
        },
    ],
}]

四、统一封装HTTP调用

项目使用 requests 访问兼容 Chat Completions 的接口:

def chat_completion(endpoint, api_key, model, messages, timeout):
    headers = {
        'Authorization': f'Bearer {api_key}',
        'Content-Type': 'application/json',
    }
    payload = {
        'model': model,
        'messages': messages,
    }
    response = requests.post(
        endpoint,
        headers=headers,
        json=payload,
        timeout=timeout,
    )
    response.raise_for_status()
    data = response.json()
    return data['choices'][0]['message']['content']

实际项目还增加了一次失败重试,并统一包装超时、限流、余额不足和返回格式异常。

五、解析视觉模型JSON

视觉模型被要求返回:

{"is_cxr": 1, "note": "胸部正位X光片"}

有些模型会在 JSON 外层添加 Markdown 代码块,因此解析前需要剥离围栏。解析失败不能默认图片不合格,否则外部服务波动会阻断所有上传;更稳妥的处理是记录失败状态并降级到本地 CNN 流程。

六、报告生成只传结构化结果

报告生成阶段不需要再次上传胸片,只发送 CNN 已经生成的数据:

检测结论:细菌性肺炎
置信度:0.84
正常概率:0.05
细菌性肺炎概率:0.84
病毒性肺炎概率:0.11
模型关注区域:右下肺野

提示词应明确要求:不下确诊结论、不给出具体用药建议、控制长度,并在结尾保留“仅供参考,以医师意见为准”的声明。

七、为什么要做失败降级

第三方 API 可能出现超时、限流、欠费或模型未开放。如果把它放在核心链路中且不做降级,用户会因为一个辅助服务故障而无法使用本地模型。

本项目采用以下策略:

  • 影像把关失败:跳过把关,继续执行 CNN;
  • 报告生成失败:显示固定模板报告;
  • 健康问答失败:提示服务暂时不可用;
  • 所有失败均记录状态,但不伪装成调用成功。

这是一种“核心能力本地化、增强能力可降级”的设计。

八、安全与隐私注意事项

  1. 不在源码、SQL、日志和截图中暴露完整 Key;
  2. 上传真实医学影像前应获得授权并处理个人信息;
  3. 为问答接口增加按 IP 或账号限流;
  4. 设置合理超时,避免请求长期占用 Web 进程;
  5. 不将通用大模型输出作为临床诊断依据;
  6. 对模型名称和 API 权限进行实际测试,不能只根据 Key 存在就判断可用。

九、总结

大模型接入的关键不是“请求能够返回文字”,而是明确职责、保护隐私、处理异常并保持核心流程可用。将 DeepSeek 作为输入把关和文本增强工具,而把疾病分类交给本地 CNN,是一种更容易解释和维护的工程方案。

参考标签

DeepSeek Django 视觉模型 API 医学影像 Python

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐