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 费用 · 无网络依赖            │
└─────────────────────────────────────────────────┘
1
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
1

安装完成后,Ollama 会作为后台服务自动启动。

# 2.3 拉取并运行 DeepSeek 模型

打开终端,执行:

ollama run deepseek-r1:1.5b
1

这条命令会做两件事:

  1. 从 Ollama 模型仓库下载 deepseek-r1:1.5b 模型(约 1.1 GB)
  2. 下载完成后自动启动交互式对话

你可以直接在终端里输入问题测试效果:

>>> 用一句话解释什么是递归
<think>
...
</think>

递归就是:一个函数调用自身,直到满足终止条件后逐层返回结果。
1
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>
1
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
1
2
3
4
5
6
7
8
9
  • base-url:Ollama 服务地址,默认 localhost:11434
  • model:模型名称,对应 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();
    }
}
1
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 的链式调用清晰表达了整个调用流程:

  1. prompt() — 构建请求
  2. user(message) — 设置用户输入
  3. call() — 发起调用
  4. content() — 提取响应文本

# 3.5 启动验证

启动 Spring Boot 应用后,在浏览器或终端访问:

curl "http://localhost:8080/api/chat?message=用三句话介绍Java的发展历史"
1

你会收到来自本地 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();
}
1
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();
    }
}
1
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();
}
1
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);
}
1
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
1
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
1
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 团队来说,这是一条投入最低、风险最小的技术验证路径。