Java 开发者零成本上手:用 Spring AI Alibaba + Ollama 本地跑通 DeepSeek 大模型
# Java 开发者零成本上手:用 Spring AI Alibaba + Ollama 本地跑通 DeepSeek 大模型
无需 API Key、无需云端费用、数据不出本机——一条命令启动模型,十几行 Java 代码完成首次对话。
# 写在前面
过去,Java 开发者想要在大模型上做实验,通常面临几个门槛:
- 需要注册云服务商账号、申请 API Key、绑定支付方式
- 每次调用都产生 Token 费用,调试成本不低
- 业务数据发送到第三方云端,合规和隐私顾虑难以避免
而现在,借助 Ollama(本地模型运行时)+ DeepSeek 开源模型 + Spring AI Alibaba(Java AI 开发框架),你可以在自己的笔记本上完成从模型部署到应用开发的完整闭环。整个过程不需要任何网络请求(除初始下载外),数据完全留在本地。
本文将从零开始,带你一步步完成这条链路。
# 一、整体架构一览
┌─────────────────────────────────────────────────┐
│ 你的笔记本电脑 │
│ │
│ ┌──────────┐ HTTP ┌───────────────────┐ │
│ │ Spring │ ──────────► │ Ollama Server │ │
│ │ AI │ localhost │ :11434 │ │
│ │ Alibaba │ REST API │ │ │
│ │ App │ ◄────────── │ DeepSeek-R1 │ │
│ │ (Java) │ JSON Resp │ (本地运行中) │ │
│ └──────────┘ └───────────────────┘ │
│ │
│ 数据不出本机 · 无 Token 费用 · 无网络依赖 │
└─────────────────────────────────────────────────┘
2
3
4
5
6
7
8
9
10
11
12
13
核心理念很简单:Ollama 负责在本地跑模型,Spring AI Alibaba 负责用 Java 调用它。两者之间通过标准 HTTP 接口通信,与调用云端 API 的代码几乎没有区别。
# 二、本地部署 DeepSeek 模型
# 2.1 什么是 Ollama?
Ollama 是一个开源的大模型本地运行工具,它将复杂的模型推理环境打包成一个可执行文件。你不需要安装 Python、CUDA、PyTorch 等依赖,只需一条命令就能启动模型服务。
它的工作方式类似于 Docker——底层封装了所有复杂性,暴露出一个简洁的 API 接口(默认监听 localhost:11434),任何能发 HTTP 请求的客户端都可以调用它。
# 2.2 安装 Ollama
macOS / Windows:
访问 ollama.com (opens new window),下载对应平台的安装包,双击安装即可。
Linux:
curl -fsSL https://ollama.com/install.sh | sh
安装完成后,Ollama 会作为后台服务自动启动。
# 2.3 拉取并运行 DeepSeek 模型
打开终端,执行:
ollama run deepseek-r1:1.5b
这条命令会做两件事:
- 从 Ollama 模型仓库下载
deepseek-r1:1.5b模型(约 1.1 GB) - 下载完成后自动启动交互式对话
你可以直接在终端里输入问题测试效果:
>>> 用一句话解释什么是递归
<think>
...
</think>
递归就是:一个函数调用自身,直到满足终止条件后逐层返回结果。
2
3
4
5
6
关于模型选择: DeepSeek-R1 提供了多个尺寸——1.5B、7B、8B、14B、32B、70B、671B。选择哪个取决于你的硬件:
模型大小 最低内存/显存 适用场景 1.5B 2 GB 快速体验、低配机器 7B/8B 8 GB 日常开发、一般任务 14B/32B 16-24 GB 高质量输出、复杂推理 70B+ 48 GB+ 服务器部署、生产环境 本文以 1.5B 为例,侧重演示流程。实际项目中建议至少使用 7B 或 14B 版本以获得更好的效果。
# 2.4 为什么选 DeepSeek-R1 蒸馏版?
DeepSeek-R1 的完整版(671B 参数)需要数百 GB 显存,普通电脑根本无法运行。而蒸馏版(Distill)通过知识蒸馏技术,将大模型的能力"压缩"到较小的模型中,在保持较高推理质量的同时,大幅降低了硬件门槛。
特别是基于 Qwen 架构的蒸馏版本,在中文理解与生成方面表现优异,非常适合国内开发者的日常使用。
# 三、用 Spring AI Alibaba 开发 Java 应用
# 3.1 为什么是 Spring AI Alibaba?
Spring AI 是 Spring 生态官方的 AI 集成框架,而 Spring AI Alibaba 在此基础上做了进一步增强:
- 统一的 API 抽象:一套代码可以无缝切换 Ollama、通义千问、OpenAI 等不同模型
- Fluent API(链式调用):
ChatClient提供类似 Stream API 的流畅编程体验 - 企业级能力:内置流式输出、多轮对话记忆、函数调用(Function Calling)、结构化输出等
- Spring Boot 原生集成:配置即生效,零额外学习成本
# 3.2 创建项目
使用 Spring Initializr 或 IDE 创建一个 Spring Boot 3.x 项目,然后在 pom.xml 中添加依赖:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
2
3
4
5
如果你希望使用 Spring AI Alibaba 的增强能力(如 Agent 框架、Graph 工作流等),可以额外引入:
<dependency> <groupId>com.alibaba.cloud.ai</groupId> <artifactId>spring-ai-alibaba-starter</artifactId> <version>1.0.0.2</version> </dependency>1
2
3
4
5
# 3.3 配置文件
在 src/main/resources/application.yml 中配置 Ollama 连接信息:
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: deepseek-r1
options:
temperature: 0.7
num-predict: 2048
2
3
4
5
6
7
8
9
base-url:Ollama 服务地址,默认localhost:11434model:模型名称,对应ollama run时使用的名称temperature:控制输出的随机性(0-1,越高越有创造性)num-predict:最大生成 Token 数
# 3.4 编写第一个聊天接口
创建一个简单的 REST Controller:
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class ChatController {
private final ChatClient chatClient;
// Spring 自动注入 ChatClient.Builder
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
/**
* 简单对话接口
* GET /api/chat?message=你好
*/
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
就这么简单。ChatClient 的链式调用清晰表达了整个调用流程:
prompt()— 构建请求user(message)— 设置用户输入call()— 发起调用content()— 提取响应文本
# 3.5 启动验证
启动 Spring Boot 应用后,在浏览器或终端访问:
curl "http://localhost:8080/api/chat?message=用三句话介绍Java的发展历史"
你会收到来自本地 DeepSeek 模型的回复。整个过程不需要任何外部网络请求。
# 四、进阶用法
# 4.1 流式输出(Streaming)
大模型生成回复可能需要数秒,流式输出可以让用户像看到"打字机"效果一样实时看到结果:
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
return chatClient.prompt()
.user(message)
.stream()
.content();
}
2
3
4
5
6
7
返回类型从 String 变为 Flux<String>,Spring WebFlux 会自动将每个 Token 片段推送给客户端。前端可以使用 EventSource / Server-Sent Events 来接收。
# 4.2 多轮对话(带上下文记忆)
默认情况下,每次请求都是独立的。要实现上下文关联的多轮对话,需要引入 ChatMemory:
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
@Configuration
public class ChatConfig {
@Bean
public ChatMemory chatMemory() {
return new InMemoryChatMemory();
}
}
2
3
4
5
6
7
8
9
10
11
然后在 Controller 中使用:
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder, ChatMemory chatMemory) {
this.chatClient = builder
.defaultSystem("你是一个有帮助的AI助手")
.defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
.build();
}
@GetMapping("/chat/memory")
public String chatWithMemory(@RequestParam String message,
@RequestParam String conversationId) {
return chatClient.prompt()
.user(message)
.advisors(a -> a.param(ChatMemory.CONVERSATION_ID, conversationId))
.call()
.content();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
通过 conversationId,同一用户的多次对话会保留上下文。
# 4.3 结构化输出
有时候你需要模型返回特定格式的数据(比如 JSON),而不是自由文本:
public record ProductInfo(String name, Double price, String category) {}
@PostMapping("/chat/extract")
public ProductInfo extractProductInfo(@RequestParam String text) {
return chatClient.prompt()
.user("从以下文本中提取商品信息: " + text)
.call()
.entity(ProductInfo.class);
}
2
3
4
5
6
7
8
9
Spring AI 会自动将模型的输出反序列化为 Java 对象。
# 五、生产环境考量
虽然本地部署非常适合开发和测试,但在生产环境中还需要考虑以下几点:
# 5.1 硬件资源
| 场景 | 建议配置 |
|---|---|
| 开发调试 | 8GB 内存 + 1.5B/7B 模型 |
| 小规模使用 | 16GB 内存 + 14B 模型 |
| 生产部署 | 独立 GPU 服务器 + 32B+ 模型 |
# 5.2 并发与性能
Ollama 默认单实例处理请求。如果需要支持高并发,可以考虑:
- 部署多个 Ollama 实例 + 负载均衡
- 使用 Spring AI Alibaba 的连接池配置
- 对响应时间要求不高的场景,采用异步处理
# 5.3 模型切换
得益于 Spring AI 的统一抽象,从 Ollama 切换到云端模型只需修改配置:
# 切换到通义千问(DashScope)
spring:
ai:
dashscope:
api-key: ${DASHSCOPE_API_KEY}
chat:
model: qwen-plus
2
3
4
5
6
7
代码层面无需任何改动。
# 六、常见问题
Q:模型回答速度很慢怎么办?
A:蒸馏版 1.5B 模型在 CPU 上推理确实较慢。建议升级到 7B 或 14B 版本,并确保有足够内存。如果有 NVIDIA GPU,Ollama 会自动使用 GPU 加速。
Q:能否在 Docker 中运行?
A:可以。Ollama 提供了官方 Docker 镜像:
docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama
docker exec -it ollama ollama run deepseek-r1:1.5b
2
Q:Spring AI Alibaba 和 Spring AI 有什么区别?
A:Spring AI Alibaba 基于 Spring AI 构建,额外集成了阿里云百炼平台、Nacos 配置管理、分布式 MCP 等企业级能力。对于纯本地 Ollama 场景,两者差异不大;但如果后续需要接入云端模型或构建多智能体系统,Spring AI Alibaba 会提供更多开箱即用的功能。
Q:模型回答中带有 <think> 标签怎么处理?
A:DeepSeek-R1 是推理模型,输出会包含思考过程(包裹在 <think> 标签中)。如果只需要最终答案,可以在代码中做简单的字符串过滤,或者使用非推理版本的模型。
# 七、总结
通过 Ollama + DeepSeek + Spring AI Alibaba 的组合,Java 开发者可以:
- 零成本起步:无需任何 API Key 或云服务费用
- 数据不出本机:敏感业务数据完全本地处理
- 快速验证想法:十几行代码即可搭建 AI 应用原型
- 平滑过渡到生产:同一套代码可无缝切换到云端模型
对于正在探索 AI 应用落地的 Java 团队来说,这是一条投入最低、风险最小的技术验证路径。