一、方案概述
1.1 项目背景
项目基于Java SpringAI框架开发,需实现医疗大模型全内网离线私有化部署,杜绝患者医疗数据外网传输,满足医疗数据安全规范、合规性要求,同时兼顾部署轻量化、运维低成本、业务无缝对接。
1.2 旧方案缺陷复盘
前期调研的Medical-Qwen3-14B+vLLM部署方案存在多处适配短板:
-
部署成本高:vLLM依赖CUDA、Python离线环境配置,步骤繁琐,运维门槛高
-
资源性能过剩:项目并发量低,vLLM高并发优势无法发挥,存在资源浪费
-
运维复杂:纯命令行运行,无自带服务管理、日志管控,不满足常态化运维规范
1.3 最终核心选型理由
综合合规性、稳定性、部署难度、SpringAI适配性四大核心维度,最终选型如下:
-
大模型 :社区优质医疗微调模型 Medical-Qwen3-14B(真实开源可下载、临床数据微调)
-
部署工具:Ollama(轻量化离线部署框架,运维极简)
-
对接框架:SpringAI 原生接口无缝对接
选型核心优势:
-
部署极简:Ollama一键部署、自动量化、环境自包含,无需复杂依赖,完美适配内网离线场景
-
业务适配:基于三甲脱敏病历、10万+临床问答、国内权威诊疗指南微调,医疗术语精准,贴合临床业务场景
-
框架兼容:SpringAI原生适配Ollama接口,Java项目零改造对接
二、软硬件资源配置标准
本配置适配内网离线部署、低并发医疗业务场景,分为最低可用配置、生产稳定配置两套标准。
2.1 硬件资源配置
| 硬件类别 | 最低可用配置 | 生产推荐配置 | 备注说明 |
|---|---|---|---|
| GPU显卡 | RTX 4090 24GB | RTX 4090 24GB / L40S | 支持FP8量化,满足14B模型推理显存需求 |
| 系统内存 | 64GB DDR4 | 96GB/128GB ECC DDR4 | 规避模型加载、推理过程内存溢出问题 |
| 存储空间 | 100GB NVMe SSD | 200GB NVMe SSD | 存放模型文件、日志、缓存数据,高速读写保障推理效率 |
| CPU核心 | 8核 | 16核及以上 | 负责数据预处理、接口调度、服务监听 |
| 网络环境 | 千兆内网 | 千兆内网 | 纯内网隔离环境,无外网访问,保障医疗数据安全 |
2.2 软件环境配置
-
操作系统:Ubuntu 20.04/22.04 LTS 服务器版(无桌面版,轻量化稳定)
-
部署框架:Ollama 最新稳定版
-
模型版本:Medical-Qwen3-14B(FP8量化,平衡推理精度与硬件资源占用)
-
开发框架:SpringAI 2023.x+
-
运行环境:JDK 17+
三、整体技术架构
采用内网隔离、轻量化部署、分层调用架构,全程无数据外网泄露,完全符合医疗数据安全规范:
Java SpringAI应用层 → 内网Ollama模型服务层 → Medical-Qwen3-14B推理层
-
SpringAI层:接收前端业务请求,封装调用参数,调用内网大模型接口,处理业务逻辑
-
Ollama服务层:提供标准化API接口,负责模型加载、推理调度、并发管控、服务常驻
-
模型推理层:Medical-Qwen3-14B执行医疗问答、病历解析、健康咨询、医疗文本结构化等核心能力
四、完整离线部署流程
本方案为纯内网离线部署,分为外网准备阶段(一次性操作)、内网部署启动阶段,全程无需服务器联网,杜绝数据外泄。
4.1 外网准备阶段(可联网电脑操作)
4.1.1 下载Ollama离线安装包
下载Linux系统离线安装包,传输至内网服务器 /usr/local/ 目录备用。
4.1.2 下载Medical-Qwen3-14B模型
通过ModelScope国内开源仓库下载完整版Medical-Qwen3-14B模型文件,统一存放为离线模型包,传输至内网服务器 /data/ollama/models/ 目录。
模型有效开源地址:
- ModelScope国内唯一开源地址:https://modelscope.cn/models/zjydiary/Medical-Qwen3-14B
4.1.3 编写模型导入Modelfile文件
新建 Medical-Qwen3-14B.Modelfile,配置模型基础参数,适配医疗业务场景:
Plain
FROM /data/ollama/models/Medical-Qwen3-14B
PARAMETER temperature 0.3
PARAMETER top_p 0.8
PARAMETER max_ctx_len 8192
SYSTEM "你是专业临床医疗大模型,基于海量中文临床问答、脱敏病历、国内诊疗指南训练,专注医疗健康咨询、病历结构化、医学知识解答,回答严谨专业、贴合临床规范、通俗易懂"
4.2 内网服务器部署阶段
4.2.1 安装Ollama离线服务
Plain
# 赋予安装权限
chmod +x ollama-linux-amd64
# 离线安装
mv ollama-linux-amd64 /usr/local/bin/ollama
# 验证安装
ollama --version
4.2.2 离线导入并创建模型服务
Plain
# 进入模型目录
cd /data/ollama/models/
# 基于Modelfile创建本地模型
ollama create medical-qwen3-14b -f Medical-Qwen3-14B.Modelfile
# 查看已导入模型
ollama list
4.2.3 启动内网模型服务
Plain
# 后台启动服务,对外开放内网访问权限
nohup ollama serve --host 0.0.0.0 > ollama.log 2>&1
服务默认接口地址:http://内网服务器IP:11434
健康检查命令 :curl http://内网IP:11434/api/health
4.3 设置开机自启
创建systemd系统服务,保障服务器重启后自动启动模型服务,无需人工干预:
Plain
[Unit]
Description=Medical-Qwen3-14B Ollama Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ollama serve --host 0.0.0.0
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
生效服务配置:
Plain
systemctl daemon-reload
systemctl enable ollama-medical
systemctl start ollama-medical
五、SpringAI Java项目对接配置
SpringAI 原生完美适配 Ollama,无需额外适配改造,仅需简单配置即可完成内网模型调用,适配医疗业务。
5.1 Maven依赖引入
Plain
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
</dependency>
5.2 application.yml 核心配置
Plain
spring:
ai:
ollama:
base-url: http://内网服务器IP:11434
chat:
model: medical-qwen3-14b
options:
temperature: 0.3
max-context-length: 8192
5.3 业务接口调用示例
Plain
@RestController
@RequestMapping("/api/medical")
public class MedicalAiController {
private final ChatClient chatClient;
public MedicalAiController(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
// 医疗咨询、病历解析通用接口
@PostMapping("/chat")
public String medicalChat(@RequestBody String prompt) {
return chatClient.prompt(prompt).call().content();
}
}
六、日常运维方案
6.1 服务管控命令
Plain
# 查看服务状态
systemctl status ollama-medical
# 重启服务
systemctl restart ollama-medical
# 停止服务
systemctl stop ollama-medical
6.2 日志管理
-
运行日志:/root/ollama.log
-
系统服务日志:
journalctl -u ollama-medical -
默认日志持续累加,易造成磁盘占用过高,需配置定时日志切割脚本,自动归档、清理过期日志
6.2.1 日志切割脚本(可直接执行)
新建脚本文件 /data/script/ollama_log_cut.sh:
bash
#!/bin/bash
# Ollama医疗模型日志切割脚本
# 日志存放路径
LOG_PATH="/root/ollama.log"
# 日志归档路径
BAK_PATH="/data/ollama/log_backup"
# 保留日志天数
SAVE_DAY=7
# 创建归档目录
mkdir -p ${BAK_PATH}
# 按日期切割日志
cp ${LOG_PATH} ${BAK_PATH}/ollama_$(date +%Y%m%d).log
# 清空原日志文件
echo "" > ${LOG_PATH}
# 删除7天前的过期日志
find ${BAK_PATH} -name "ollama_*.log" -mtime +${SAVE_DAY} -delete
6.2.2 配置定时任务
添加crontab定时任务,每日凌晨2点自动执行日志切割:
bash
# 编辑定时任务
crontab -e
# 写入以下内容
0 2 * * * /bin/bash /data/script/ollama_log_cut.sh >/dev/null 2>&1
# 重启crond服务生效
systemctl restart crond
systemctl enable crond
6.3 模型备份
定期备份模型目录,防止误删、数据丢失,保障项目稳定运行,以下为全自动模型备份脚本,支持定时备份、过期备份清理。
6.3.1 模型备份脚本(可直接执行)
新建脚本文件 /data/script/ollama_model_backup.sh:
bash
#!/bin/bash
# Medical-Qwen3-14B模型自动备份脚本
# 源模型目录
SOURCE_DIR="/data/ollama/models"
# 备份存放目录
BAK_DIR="/data/ollama/model_backup"
# 备份文件前缀
BAK_PREFIX="medical-qwen3-14b_backup"
# 备份文件保留天数
SAVE_DAY=30
# 创建备份目录
mkdir -p ${BAK_DIR}
# 打包备份模型文件(排除临时缓存文件)
tar -zcvf ${BAK_DIR}/${BAK_PREFIX}_$(date +%Y%m%d).tar.gz --exclude="*.tmp" --exclude="*.cache" ${SOURCE_DIR}
# 删除30天前的过期备份包
find ${BAK_DIR} -name "${BAK_PREFIX}_*.tar.gz" -mtime +${SAVE_DAY} -delete
6.3.2 配置定时备份任务
配置每周日凌晨3点自动备份模型文件:
bash
# 编辑定时任务
crontab -e
# 写入以下内容
0 3 * * 0 /bin/bash /data/script/ollama_model_backup.sh >/dev/null 2>&1
# 重启crond服务生效
systemctl restart crond
systemctl enable crond
6.3.3 手动备份命令
如需临时手动备份,执行以下命令即可:
bash
bash /data/script/ollama_model_backup.sh
七、常见问题解决方案
7.1 内网无法访问模型接口
解决方案:关闭服务器防火墙或放行11434端口,执行 firewall -cmd --permanent --add -port=11434/tcp && firewall -cmd --reload
7.2 模型加载显存不足
解决方案:开启Ollama自动量化,或调低上下文参数max_ctx_len,降低显存占用
7.3 SpringAI调用超时
解决方案:调整SpringBoot全局超时时间,适配大模型推理延迟特性
八、方案总结
本方案摒弃了复杂冗余的vLLM部署模式,采用Medical-Qwen3-14B+Ollama轻量化内网部署架构:
-
部署极简:全程离线部署、一键启停、开机自启,大幅降低运维成本
-
业务适配:医疗推理精度高,适配问诊咨询、病历结构化等核心医疗场景
-
安全合规:全内网隔离部署,无数据外泄风险,符合医疗数据安全规范
(注:文档部分内容可能由 AI 生成)