Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
2025.09.25 20:32浏览量:2简介:本文详细介绍如何通过Spring AI与Ollama框架的协同,快速构建并部署deepseek-r1模型的API服务,涵盖环境配置、服务封装、API接口设计及调用示例,助力开发者高效实现AI模型服务化。
一、技术选型与核心价值
在AI模型服务化场景中,开发者常面临两大核心挑战:一是如何将本地运行的模型(如deepseek-r1)快速转化为可调用的API服务;二是如何通过标准化框架(如Spring)实现服务的高可用与可扩展性。本文提出的Spring AI + Ollama方案,正是为解决这一痛点而生。
- Spring AI:作为Spring生态的AI扩展模块,提供模型服务封装、请求路由、负载均衡等企业级能力,支持RESTful/gRPC双协议,天然适配微服务架构。
- Ollama:轻量级模型运行框架,支持本地化部署主流LLM(如Llama、Mistral),通过统一接口屏蔽硬件差异,兼容CPU/GPU环境。
- deepseek-r1:作为目标模型,其高性能与低资源占用特性,使其成为本地化部署的优选。
通过三者结合,开发者可在数小时内完成从模型部署到API服务化的全流程,显著降低技术门槛与运维成本。
二、环境准备与依赖配置
1. 基础环境要求
- 操作系统:Linux(Ubuntu 22.04+)或macOS(12.0+)
- 硬件:至少8GB内存(推荐16GB+),NVIDIA GPU(可选,CUDA 11.8+)
- 依赖工具:Docker(24.0+)、Java 17+、Maven 3.8+
2. Ollama安装与模型加载
# 安装Ollama(以Ubuntu为例)curl -fsSL https://ollama.ai/install.sh | sh# 下载deepseek-r1模型(假设模型已发布至Ollama仓库)ollama pull deepseek-r1:latest# 验证模型ollama run deepseek-r1 --prompt "Hello, world!"
关键点:Ollama通过容器化技术隔离模型运行环境,避免依赖冲突。若模型未在官方仓库,需手动构建Docker镜像并加载。
3. Spring AI项目初始化
通过Spring Initializr(https://start.spring.io/)生成项目,添加以下依赖:
<!-- pom.xml 关键依赖 --><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter</artifactId><version>0.7.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
三、服务封装与API实现
1. Ollama客户端集成
创建OllamaClient类,封装与Ollama的交互逻辑:
@Componentpublic class OllamaClient {private static final String OLLAMA_API = "http://localhost:11434";public String generate(String prompt, String modelName) {// 调用Ollama的REST API(需根据实际API调整)HttpHeaders headers = new HttpHeaders();headers.setContentType(MediaType.APPLICATION_JSON);String requestBody = String.format("{\"model\":\"%s\",\"prompt\":\"%s\"}", modelName, prompt);HttpEntity<String> entity = new HttpEntity<>(requestBody, headers);ResponseEntity<String> response = new RestTemplate().postForEntity(OLLAMA_API + "/api/generate", entity, String.class);// 解析响应(示例为简化版)return extractResponse(response.getBody());}private String extractResponse(String json) {// 实际需用JSON库(如Jackson)解析return json.split("\"response\":")[1].split("\"")[1];}}
优化建议:添加重试机制、超时控制及异步调用支持,提升服务稳定性。
2. Spring AI服务层实现
创建DeepSeekService,结合Spring AI的AiClient接口:
@Servicepublic class DeepSeekService {@Autowiredprivate OllamaClient ollamaClient;public ChatResponse chat(ChatRequest request) {String response = ollamaClient.generate(request.getPrompt(), "deepseek-r1");return ChatResponse.builder().content(response).timestamp(LocalDateTime.now()).build();}}
扩展性设计:通过AiClient抽象层,可无缝切换至其他模型运行时(如Hugging Face、vLLM)。
3. REST API接口定义
使用Spring Web暴露API:
@RestController@RequestMapping("/api/deepseek")public class DeepSeekController {@Autowiredprivate DeepSeekService deepSeekService;@PostMapping("/chat")public ResponseEntity<ChatResponse> chat(@RequestBody ChatRequest request) {ChatResponse response = deepSeekService.chat(request);return ResponseEntity.ok(response);}}// 请求/响应DTO示例@Datapublic class ChatRequest {private String prompt;private String userId; // 可选:用于上下文管理}@Datapublic class ChatResponse {private String content;private LocalDateTime timestamp;}
安全增强:添加API密钥验证、请求限流(如Spring Cloud Gateway)及输入过滤(防止XSS)。
四、服务部署与调用示例
1. 本地运行与测试
启动Spring Boot应用后,通过curl测试:
curl -X POST http://localhost:8080/api/deepseek/chat \-H "Content-Type: application/json" \-d '{"prompt": "解释量子计算的基本原理"}'
预期响应:
{"content": "量子计算利用量子比特...","timestamp": "2024-03-20T10:15:30"}
2. 容器化部署
创建Dockerfile:
FROM eclipse-temurin:17-jdk-jammyWORKDIR /appCOPY target/deepseek-service.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]
构建并运行:
docker build -t deepseek-service .docker run -d -p 8080:8080 --network host deepseek-service
网络配置:--network host确保容器可访问宿主机Ollama服务(默认端口11434)。
3. 高级场景:流式响应
修改OllamaClient支持流式输出:
public Flux<String> streamGenerate(String prompt, String modelName) {// 使用WebClient实现SSE(Server-Sent Events)return WebClient.create(OLLAMA_API).post().uri("/api/generate").contentType(MediaType.APPLICATION_JSON).bodyValue(Map.of("model", modelName, "prompt", prompt)).retrieve().bodyToFlux(String.class).map(this::parseStreamChunk);}
前端可通过EventSource监听流式数据,实现实时交互。
五、性能优化与最佳实践
- 模型缓存:对高频请求的上下文进行缓存(如Redis),减少重复计算。
- 异步处理:使用
@Async注解将长耗时请求转为异步,避免阻塞主线程。 - 监控告警:集成Prometheus+Grafana监控API延迟、错误率,设置阈值告警。
- 多模型路由:根据请求类型(如代码生成、文本摘要)动态选择最优模型。
六、总结与展望
本文通过Spring AI + Ollama方案,实现了deepseek-r1模型从本地部署到API服务化的完整流程。该方案兼具开发效率与运行稳定性,尤其适合资源受限的边缘计算场景。未来可进一步探索:
- 与Kubernetes集成实现自动扩缩容;
- 支持多模态输入(如图像+文本);
- 集成向量数据库实现上下文记忆。
开发者可基于本文代码快速搭建生产级AI服务,聚焦业务逻辑而非底层技术细节。

发表评论
登录后可评论,请前往 登录 或 注册