SpringBoot中使用Spring AI框架集成本地Ollama实现AI快速对话完整示例
SpringBoot中使用Spring AI框架集成本地Ollama实现AI快速对话完整示例
场景
SpringBoot中使用SpringAIAlibaba框架集成阿里云百炼实现AI快速对话入门示例:
https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/160024361
基于上述文章基础。
在实际开发中,我们经常需要在本地运行大模型进行测试和开发。虽然阿里云百炼等云平台提供了便捷的API服务,但在以下场景中,本地Ollama是更好的选择:
- 开发测试:快速验证AI功能,无需等待网络请求
- 数据隐私:敏感数据不想上传到云端
- 成本控制:完全免费,无API调用费用
- 离线环境:无外网或网络不稳定时使用
- 定制化需求:需要运行特定开源模型
Ollama是一个开源的大模型运行工具,支持多种主流模型,并提供OpenAI兼容的API接口,可以无缝集成到Spring AI框架中。
注:
- 博客:https://blog.csdn.net/badao_liumang_qizhi
实现
安装和配置Ollama
步骤1:下载并安装Ollama
访问Ollama官网下载安装包:
https://ollama.com/
Windows用户下载Windows版本,安装后Ollama默认运行在 http://localhost:11434
步骤2:启动Ollama服务
安装完成后,Ollama会自动启动。可以通过以下命令检查状态:
# Windows PowerShell
ollama list
# 查看运行的模型
ollama ps
步骤3:拉取本地模型
# 拉取qwen2.5模型(推荐,与阿里云百炼兼容性好)
ollama pull qwen2.5
# 或者拉取其他模型
ollama pull llama3.2
ollama pull phi3
ollama pull mistral
模型选择建议:
- qwen2.5: 中文支持好,适合练手
- llama3.2: 性能优秀,生态丰富
- phi3: 体积小,适合低配置机器
- mistral: 平衡性能和效果
步骤4:验证模型是否正常工作
# 测试模型对话
ollama run qwen2.5 "你好,请介绍一下你自己"
# 测试完成后退出
/bye
环境准备:JDK 17配置
为什么必须使用JDK 17?
Spring AI框架和Spring Boot 3.x都要求最低JDK 17版本。如果您的系统环境变量配置的是JDK 8,需要为项目单独指定JDK 17。
为项目单独配置JDK 17(不影响全局JDK 8)
步骤1:下载JDK 17解压版
直接解压到指定目录,例如:D:\SoftWare\jdk\jdk17
注意:
- ✅ 不要添加到系统PATH
- ✅ 不要修改系统环境变量
- ✅ 全局JDK 8完全不动
步骤2:在项目中指定JDK 17
创建项目启动脚本,在脚本中指定JDK路径:
@echo off
REM 设置JDK 17路径
set JAVA_HOME=D:\SoftWare\jdk\jdk17
set PATH=%JAVA_HOME%\bin;%PATH%
REM 验证Java版本
java -version
REM 执行Maven命令
mvn clean install
mvn spring-boot:run
新建SpringBoot项目
修改pom.xml
添加Spring AI OpenAI Starter依赖(Ollama兼容OpenAI API):
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
</parent>
<groupId>com.example</groupId>
<artifactId>spring-ai-ollama-demo</artifactId>
<version>1.0</version>
<properties>
<java.version>17</java.version>
<spring-ai.version>1.0.0-M5</spring-ai.version>
</properties>
<dependencies>
<!-- Spring Boot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AI OpenAI Starter (兼容Ollama) -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M5</version>
</dependency>
<!-- Spring Boot Test Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
</repository>
</repositories>
注意:
- 使用
spring-ai-openai-spring-boot-starter而不是spring-ai-alibaba-starter - Ollama提供OpenAI兼容的API接口
配置application.yml
server:
port: 885
servlet:
context-path: /
tomcat:
uri-encoding: UTF-8
max-threads: 800
min-spare-threads: 30
logging:
level:
com.example: info
org.springframework: info
spring:
ai:
openai:
api-key: ollama # Ollama不需要API key,但必须填写
base-url: http://localhost:11434 # Ollama服务地址
chat:
options:
model: qwen2.5 # 使用本地模型名称
temperature: 0.7
max-tokens: 2048
关键配置说明:
api-key: ollama- Ollama不需要真实的API key,但字段不能为空base-url: http://localhost:11434- 指向本地Ollama服务model: qwen2.5- 必须与ollama pull下载的模型名称一致
创建对话Controller
新建一个对话Controller,实现AI对话接口:
package com.badao.ai.controller;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
@RestController
public class ChatController {
private final ChatClient chatClient;
public ChatController(ChatClient.Builder builder) {
this.chatClient = builder.build();
}
/**
* GET方式简单对话
* 访问:http://localhost:885/ai/generate?message=你好
*/
@GetMapping("/ai/generate")
public String generate(@RequestParam(value = "message", defaultValue = "你好") String message) {
return chatClient.prompt()
.user(message)
.call()
.content();
}
/**
* POST方式JSON对话
* 请求体:{"message": "你好"}
*/
@PostMapping("/ai/chat")
public Map<String, String> chat(@RequestBody Map<String, String> request) {
String message = request.get("message");
String response = chatClient.prompt()
.user(message)
.call()
.content();
return Map.of(
"message", message,
"response", response,
"model", "ollama-qwen2.5"
);
}
/**
* 健康检查接口
*/
@GetMapping("/ai/health")
public Map<String, String> health() {
return Map.of(
"status", "running",
"model", "ollama-qwen2.5",
"type", "local"
);
}
}
创建启动类
package com.badao.ai;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringAiDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiDemoApplication.class, args);
}
}
项目完整结构
spring-ai-ollama-demo/
├── src/
│ ├── main/
│ │ ├── java/com/badao/ai/
│ │ │ ├── SpringAiDemoApplication.java
│ │ │ └── controller/
│ │ │ └── ChatController.java
│ │ └── resources/
│ │ └── application.yml
│ └── test/
│ └── java/com/badao/ai/
│ └── SpringAiZhipuHelloApplicationTests.java
├── pom.xml
└── 一键启动.bat
创建交互式启动脚本
为方便项目管理,创建一键启动脚本 一键启动.bat:
@echo off
chcp 65001 >nul
echo ========================================
echo Spring AI Ollama Manager
echo ========================================
echo.
REM 配置路径(修改这里)
set MVN=D:\SoftWare\Maven\apache-maven-3.6.3\bin\mvn.cmd
set JAVA_HOME=D:\SoftWare\jdk\jdk17
set PATH=%JAVA_HOME%\bin;%PATH%
set PROJECT_DIR=%~dp0
cd /d %PROJECT_DIR%
echo Maven: %MVN%
echo JDK: %JAVA_HOME%
echo.
if not exist "%JAVA_HOME%\bin\java.exe" (
echo [ERROR] JDK 17 not found
pause
exit /b 1
)
java -version
echo.
if not exist "%MVN%" (
echo [ERROR] Maven not found
pause
exit /b 1
)
:MENU
echo ========================================
echo 1. Build Project
echo 2. Start Project
echo 3. Package Project
echo 4. Exit
echo ========================================
set /p choice=Choice (1-4):
if "%choice%"=="1" goto BUILD
if "%choice%"=="2" goto START
if "%choice%"=="3" goto PACKAGE
if "%choice%"=="4" goto END
echo Invalid choice!
goto MENU
:BUILD
call "%MVN%" clean install -DskipTests
if %errorlevel% neq 0 (echo Build FAILED! & pause & goto MENU)
echo Build SUCCESS!
pause
goto MENU
:START
echo Starting on http://localhost:885
call "%MVN%" spring-boot:run
goto MENU
:PACKAGE
call "%MVN%" clean package -DskipTests
if %errorlevel% neq 0 (echo Package FAILED! & pause & goto MENU)
echo Package SUCCESS!
dir /b target\*.jar 2>nul
pause
goto MENU
:END
echo Goodbye!
exit /b 0
运行测试
方式1:使用启动脚本
# 双击运行
一键启动.bat
# 选择选项2启动项目
方式2:使用Maven命令
# 设置环境
$env:JAVA_HOME = "D:\SoftWare\jdk\jdk17"
$env:PATH = "D:\SoftWare\jdk\jdk17\bin;" + $env:PATH
# 进入项目目录
cd d:\WorkSpace\Gitee\java-demo\AI\spring-ai-ollama-demo
# 编译项目
mvn clean install -DskipTests
# 启动项目
mvn spring-boot:run
测试接口
1. 浏览器访问:
http://localhost:885/ai/generate?message=你好,请介绍下你自己

2. 使用curl测试:
# GET请求
curl "http://localhost:885/ai/generate?message=请介绍一下人工智能"
# POST请求
curl -X POST http://localhost:885/ai/chat \
-H "Content-Type: application/json" \
-d "{\"message\": \"请解释机器学习\"}"
3. 健康检查:
curl http://localhost:885/ai/health
预期响应:
{
"status": "running",
"model": "ollama-qwen2.5",
"type": "local"
}
多模型切换示例
如果想尝试不同的模型,只需修改 application.yml 中的 model 配置:
spring:
ai:
openai:
chat:
options:
model: llama3.2 # 切换到Llama模型
# model: phi3 # 或者切换到Phi模型
# model: mistral # 或者使用Mistral模型
注意: 切换模型前,需要先使用 ollama pull 下载对应模型。
高级配置
如果需要更精细的控制,可以添加更多配置选项:
spring:
ai:
openai:
api-key: ollama
base-url: http://localhost:11434
chat:
options:
model: qwen2.5
temperature: 0.7 # 创造性 (0-1),越高越有创意
max-tokens: 2048 # 最大生成token数
top-p: 0.9 # 核采样参数
frequency-penalty: 0.0 # 频率惩罚,降低重复内容
presence-penalty: 0.0 # 存在惩罚,鼓励新话题
对比:阿里云百炼 vs 本地Ollama
| 特性 | 阿里云百炼 | 本地Ollama |
|---|---|---|
| 成本 | 有免费额度,超出后收费 | 完全免费 |
| 网络 | 需要外网 | 本地运行,无需外网 |
| 速度 | 受网络影响 | 取决于本地硬件 |
| 隐私 | 数据传到云端 | 数据完全本地 |
| 配置 | 需要API Key | 无需Key(填ollama即可) |
| 模型 | qwen-max等云端模型 | qwen2.5、llama等本地模型 |
| 适用场景 | 生产环境 | 开发测试、离线使用 |
常见问题
Q1: Ollama启动失败?
# Windows下检查Ollama是否运行
tasklist | findstr ollama
# 手动启动Ollama
ollama serve
# 检查服务状态
curl http://localhost:11434/api/tags
Q2: 模型下载慢?
# 可以使用国内镜像或代理
# 或者选择较小的模型(如phi3)
ollama pull phi3
Q3: 内存不足?
- Ollama默认使用GPU,如果没有GPU会使用CPU
- 小内存机器建议使用较小模型(如phi3、qwen2.5:1.5b)
- 查看模型大小:
ollama list
Q4: 编译失败 - 测试依赖缺失?
确保pom.xml包含测试依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
Q5: 端口885被占用?
修改 application.yml 中的端口号:
server:
port: 8080 # 改为其他端口
Q6: 模型响应慢?
- 首次加载模型需要时间(从磁盘加载到内存)
- 后续请求会快很多
- 可以调整
max-tokens控制响应长度
进阶使用:流式响应
如果需要实现流式响应(Server-Sent Events),可以修改Controller:
@GetMapping("/ai/stream")
public SseEmitter stream(@RequestParam String message) {
SseEmitter emitter = new SseEmitter();
chatClient.prompt()
.user(message)
.stream()
.content()
.subscribe(
content -> {
try {
emitter.send(content);
} catch (IOException e) {
emitter.completeWithError(e);
}
},
error -> emitter.completeWithError(error),
() -> emitter.complete()
);
return emitter;
}
总结
通过本示例,我们成功实现了在SpringBoot项目中集成本地Ollama大模型。主要步骤包括:
- 安装Ollama:下载并拉取所需模型
- 配置JDK 17:确保满足Spring AI的版本要求
- 创建SpringBoot项目:添加Spring AI OpenAI Starter依赖
- 配置Ollama连接:设置base-url为本地Ollama服务
- 实现对话接口:使用ChatClient进行AI对话
- 测试验证:通过API接口测试功能
核心优势:
- ✅ 完全免费,无API费用
- ✅ 数据完全本地,隐私安全
- ✅ 无需外网,离线可用
- ✅ 支持多种开源模型
- ✅ 与Spring AI无缝集成
适用场景:
- 本地开发和测试
- AI功能原型验证
- 敏感数据处理
- 离线环境使用
- 学习大模型技术
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)