AI先验证图片、再解释结果:Django接入DeepSeek视觉与文本API
一、为什么不能把所有任务都交给大模型
完整链路可以概括为:
上传图片 → 视觉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;
- 报告生成失败:显示固定模板报告;
- 健康问答失败:提示服务暂时不可用;
- 所有失败均记录状态,但不伪装成调用成功。
这是一种“核心能力本地化、增强能力可降级”的设计。
八、安全与隐私注意事项
- 不在源码、SQL、日志和截图中暴露完整 Key;
- 上传真实医学影像前应获得授权并处理个人信息;
- 为问答接口增加按 IP 或账号限流;
- 设置合理超时,避免请求长期占用 Web 进程;
- 不将通用大模型输出作为临床诊断依据;
- 对模型名称和 API 权限进行实际测试,不能只根据 Key 存在就判断可用。
九、总结
大模型接入的关键不是“请求能够返回文字”,而是明确职责、保护隐私、处理异常并保持核心流程可用。将 DeepSeek 作为输入把关和文本增强工具,而把疾病分类交给本地 CNN,是一种更容易解释和维护的工程方案。
参考标签
DeepSeek Django 视觉模型 API 医学影像 Python




更多推荐


所有评论(0)