文章目录
-
- 一、开篇:为什么要让AI"断网"工作?
- 二、技术选型:为什么选择这对CP?
-
- [2.1 Spring AI 2.0:Java程序员的"春天"](#2.1 Spring AI 2.0:Java程序员的"春天")
- [2.2 Gemma 4:能在笔记本跑的"小钢炮"](#2.2 Gemma 4:能在笔记本跑的"小钢炮")
- 三、环境准备:工欲善其事,必先利其器
-
- [3.1 硬件要求](#3.1 硬件要求)
- [3.2 安装 Ollama(本地模型管家)](#3.2 安装 Ollama(本地模型管家))
- [四、Spring Boot 项目初始化](#四、Spring Boot 项目初始化)
-
- [4.1 pom.xml 核心依赖](#4.1 pom.xml 核心依赖)
- [4.2 application.yml 配置](#4.2 application.yml 配置)
- 五、核心代码:最简单AI对话接口
- 六、实战:离线Java代码审查助手
- [七、进阶:流式输出 + RAG 私有知识库](#七、进阶:流式输出 + RAG 私有知识库)
-
- [7.1 流式对话(逐字输出)](#7.1 流式对话(逐字输出))
- [7.2 RAG 向量库(Redis)](#7.2 RAG 向量库(Redis))
- 八、性能优化与踩坑
- 九、总结
无意间发现了一个巨牛巨牛巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/HHX_01
一、开篇:为什么要让AI"断网"工作?
想象一下,你在高铁上信号断断续续,突然想查个技术文档,结果发现因为没网,连ChatGPT都打不开。这时候你就像那个被困在孤岛上、手里有金条却花不出去的富翁------别提多憋屈了。
很多程序员兄弟以为搞AI就必须联网调API,就像认为吃顿好饭必须去米其林一样。其实,本地化部署大模型这个技能,就像是在自家厨房做满汉全席------既省钱(不用按token付费),又安全(数据不出本地),还能离线使用(飞机上也照样干活)。
今天这篇教程,咱们要用Spring AI 2.0 搭配Google Gemma 4 ,手把手教你搭建一套完全离线的Java AI应用。
二、技术选型:为什么选择这对CP?
2.1 Spring AI 2.0:Java程序员的"春天"
Spring AI 2.0 基于 Spring Boot 4.0 和 Spring Framework 7.0 构建,彻底打通了Java与AI的任督二脉。
核心亮点:
- Java 21+ 起步,支持虚拟线程、模式匹配
- 内置 Redis 向量存储,RAG 开发极简
- OpenAI SDK 原生兼容
- 深度集成 Ollama,本地模型一键接入
2.2 Gemma 4:能在笔记本跑的"小钢炮"
Google Gemma 4 是端侧轻量化大模型,性能强、资源占用低,支持离线运行。
关键参数:
- 上下文长度:256K tokens
- 支持文本/多模态理解
- 量化后体积小,普通电脑可流畅运行
三、环境准备:工欲善其事,必先利其器
3.1 硬件要求
- 内存:16GB 起步,推荐 32GB
- 显卡:NVIDIA 独显 6GB+ 更佳(非必需)
- 硬盘:预留 20GB 空间
- 系统:Windows / macOS / Linux 均可
3.2 安装 Ollama(本地模型管家)
macOS / Linux 一键安装:
bash
curl -fsSL https://ollama.com/install.sh | sh
Windows 直接官网下载安装包。
下载 Gemma 4 模型
bash
# 12B 推荐版
ollama pull gemma4:12b
# 低配机器用 4B
ollama pull gemma4:4b
验证:
bash
ollama list
四、Spring Boot 项目初始化
4.1 pom.xml 核心依赖
xml
org.springframework.boot
spring-boot-starter-parent
4.0.0-M1
org.springframework.ai
spring-ai-starter-model-ollama
org.springframework.boot
spring-boot-starter-web
4.2 application.yml 配置
yaml
spring:
ai:
ollama:
base-url: http://localhost:11434
chat:
model: gemma4:12b
options:
temperature: 0.7
num-predict: 2048
server:
port: 8080
五、核心代码:最简单AI对话接口
java
import org.springframework.ai.chat.model.ChatModel;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai")
public class ChatController {
private final ChatModel chatModel;
public ChatController(ChatModel chatModel) {
this.chatModel = chatModel;
}
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatModel.call(message);
}
}
启动后访问:
http://localhost:8080/ai/chat?message=用Java写冒泡排序
拔掉网线依然可用,真正离线AI。
六、实战:离线Java代码审查助手
java
import org.springframework.ai.chat.messages.*;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
@RestController
@RequestMapping("/code-review")
public class CodeReviewController {
private final ChatModel chatModel;
public CodeReviewController(ChatModel chatModel) {
this.chatModel = chatModel;
}
@PostMapping("/upload")
public String reviewCode(@RequestParam("file") MultipartFile file) throws IOException {
String code = new String(file.getBytes(), StandardCharsets.UTF_8);
String systemPrompt = """
你是资深Java代码审查专家,审查以下内容:
1. 空指针风险
2. 资源泄漏
3. 线程安全
4. SQL注入、XSS
5. 性能瓶颈
输出格式:
【严重】【警告】【建议】
给出重构代码。
""";
Message sys = new SystemMessage(systemPrompt);
Message user = new UserMessage("代码:\n```java\n" + code + "\n```");
Prompt prompt = new Prompt(List.of(sys, user));
return chatModel.call(prompt).getResult().getOutput().getText();
}
}
七、进阶:流式输出 + RAG 私有知识库
7.1 流式对话(逐字输出)
java
import org.springframework.ai.chat.model.StreamingChatModel;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/stream")
public class StreamController {
private final StreamingChatModel streamingChatModel;
public StreamController(StreamingChatModel streamingChatModel) {
this.streamingChatModel = streamingChatModel;
}
@GetMapping(value = "/chat", produces = "text/plain;charset=UTF-8")
public Flux streamChat(@RequestParam String message) {
return streamingChatModel.stream(message)
.map(chunk -> chunk.getResult().getOutput().getText());
}
}
7.2 RAG 向量库(Redis)
java
@Configuration
public class RAGConfig {
@Bean
public RedisVectorStore vectorStore(EmbeddingModel embeddingModel) {
return RedisVectorStore.builder(embeddingModel)
.initializeSchema(true)
.build();
}
}
八、性能优化与踩坑
-
模型加载慢 :使用 4bit 量化版本
bashollama pull gemma4:12b-q4_0 -
响应超时:延长 Rest 客户端超时时间
-
Windows 端口冲突
bashollama serve --port 11435 -
并发卡顿:虚拟线程 + 缓存 + 异步
九、总结
本篇完整实现:
- Ollama + Gemma4 本地离线大模型
- Spring AI 2.0 极简集成
- 基础对话、代码审查、流式输出、私有知识库 RAG
优势:
- 完全离线
- 数据不泄露
- 零 token 费用
- Java 生态原生友好
AI 时代,Java 程序员必须掌握本地部署,从此不依赖网络、不依赖第三方API,安全可控、企业内网首选。
无意间发现了一个巨牛巨牛巨牛的人工智能教程,非常通俗易懂,对AI感兴趣的朋友强烈推荐去看看,传送门https://blog.csdn.net/HHX_01