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 PowerShellollama list# 查看运行的模型ollamaps步骤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:885servlet:context-path:/tomcat:uri-encoding:UTF-8max-threads:800min-spare-threads:30logging:level:com.example:infoorg.springframework:infospring:ai:openai:api-key:ollama# Ollama不需要API key,但必须填写base-url:http://localhost:11434# Ollama服务地址chat:options:model:qwen2.5# 使用本地模型名称temperature:0.7max-tokens:2048关键配置说明:
api-key: ollama- Ollama不需要真实的API key,但字段不能为空base-url: http://localhost:11434- 指向本地Ollama服务model: qwen2.5- 必须与ollama pull下载的模型名称一致
创建对话Controller
新建一个对话Controller,实现AI对话接口:
packagecom.badao.ai.controller;importorg.springframework.ai.chat.client.ChatClient;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.PostMapping;importorg.springframework.web.bind.annotation.RequestBody;importorg.springframework.web.bind.annotation.RequestParam;importorg.springframework.web.bind.annotation.RestController;importjava.util.Map;@RestControllerpublicclassChatController{privatefinalChatClientchatClient;publicChatController(ChatClient.Builderbuilder){this.chatClient=builder.build();}/** * GET方式简单对话 * 访问:http://localhost:885/ai/generate?message=你好 */@GetMapping("/ai/generate")publicStringgenerate(@RequestParam(value="message",defaultValue="你好")Stringmessage){returnchatClient.prompt().user(message).call().content();}/** * POST方式JSON对话 * 请求体:{"message": "你好"} */@PostMapping("/ai/chat")publicMap<String,String>chat(@RequestBodyMap<String,String>request){Stringmessage=request.get("message");Stringresponse=chatClient.prompt().user(message).call().content();returnMap.of("message",message,"response",response,"model","ollama-qwen2.5");}/** * 健康检查接口 */@GetMapping("/ai/health")publicMap<String,String>health(){returnMap.of("status","running","model","ollama-qwen2.5","type","local");}}创建启动类
packagecom.badao.ai;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassSpringAiDemoApplication{publicstaticvoidmain(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-XPOST http://localhost:885/ai/chat\-H"Content-Type: application/json"\-d"{\"message\":\"请解释机器学习\"}"3. 健康检查:
curlhttp://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:ollamabase-url:http://localhost:11434chat:options:model:qwen2.5temperature: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# 手动启动Ollamaollama serve# 检查服务状态curlhttp://localhost:11434/api/tagsQ2: 模型下载慢?
# 可以使用国内镜像或代理# 或者选择较小的模型(如phi3)ollama pull phi3Q3: 内存不足?
- 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")publicSseEmitterstream(@RequestParamStringmessage){SseEmitteremitter=newSseEmitter();chatClient.prompt().user(message).stream().content().subscribe(content->{try{emitter.send(content);}catch(IOExceptione){emitter.completeWithError(e);}},error->emitter.completeWithError(error),()->emitter.complete());returnemitter;}总结
通过本示例,我们成功实现了在SpringBoot项目中集成本地Ollama大模型。主要步骤包括:
- 安装Ollama:下载并拉取所需模型
- 配置JDK 17:确保满足Spring AI的版本要求
- 创建SpringBoot项目:添加Spring AI OpenAI Starter依赖
- 配置Ollama连接:设置base-url为本地Ollama服务
- 实现对话接口:使用ChatClient进行AI对话
- 测试验证:通过API接口测试功能
核心优势:
- ✅ 完全免费,无API费用
- ✅ 数据完全本地,隐私安全
- ✅ 无需外网,离线可用
- ✅ 支持多种开源模型
- ✅ 与Spring AI无缝集成
适用场景:
- 本地开发和测试
- AI功能原型验证
- 敏感数据处理
- 离线环境使用
- 学习大模型技术