前言
Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。
- 项目地址
gitcode平台:https://gitcode.com/Var_ya/springAI_ollama_chatInterfaceApi
- 核心技术官网地址
Spring AI Alibaba 官网地址:https://java2ai.com/
knife4j官网地址: https://doc.xiaominfo.com/
ollama官网地址:https://ollama.com/
一、技术选型说明
1. 核心组件
- Spring Boot 3.4.5:后端服务基础框架
- spring-ai-ollama-spring-boot-starte:alibaba官方AI集成框架(1.0.0-M6版本)
- knife4j 4.5.0:可视化展示后端接口页面
- Ollama:本地大模型运行环境(支持Llama2、Mistral等模型)
2. 环境要求
- JDK 17+
- 8GB+ 内存(运行大模型需要)
- ollama version is 0.5.13
二、环境准备
1. 安装Ollama
- Ollama官网安装
官网地址:https://ollama.com/
官网下载window版本地址:https://ollama.com/download
- 百度网盘下载安装
百度网盘地址:https://pan.baidu.com/s/1mx_3R4NVjOSC9D8BaGdYHg?pwd=9eg7
- 运行OllamaSetup安装包
- 双击OllamaSetup.exe
- 安装包点击:Install
- 安装成功
(截图示例:终端执行ollama --version
)
2. 下载模型
本教程使用的模型:deepseek-r1:8b
模型运行下载命令:ollama run deepseek-r1:8b
ollama run deepseek-r1:8b
2. 模型运行效果
三、创建Spring Boot项目
注意 :类型修改为:Maven
1. 项目初始化
使用start.spring.io创建项目:
- 添加依赖:
- Spring Web
- spring-ai-ollama-spring-boot-starter
- knife4j-openapi3-jakarta-spring-boot-starter
2. 配置核心POM.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 阿里巴巴ollama--> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-ollama-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency> <!-- Swagger3-knife4j依赖 --> <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId> <version>4.5.0</version> </dependency> </dependencies>
四、配置Ollama连接
application.properties
server: port: 9999 spring: ai: ollama: base-url: http://localhost:11434 # 哦llama地址 chat: model: deepseek-r1:7b # 模型 options: temperature: 0.8 # 温度越高,回答越有创意 top-p: 0.9 # 数值越高,回答越多样 top-k: 100 # 数值越高,回答越多样 # knife4j的增强配置,不需要增强可以不配 knife4j: enable: true # 开启knife4j,无需添加@EnableKnife4j注解 setting: language: zh_cn #中文 # swagger-model-name: 实体列表 #默认为: Swagger Models basic: # 开启Swagger的Basic认证功能,默认是false enable: false username: varya password: varya
五、编写AI对话接口
1. 创建Controller
package cn.varin.springai_ollama_chatinterfaceapi.controller; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import reactor.core.publisher.Flux; import org.springframework.ai.chat.client.ChatClient; import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor; import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.ollama.api.OllamaOptions; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.util.stream.Stream; @RestController @Tag(name="客户端实例") @RequestMapping("/client") public class OllamaChatClientController { private static final String DEFAULT_PROMPT = "你好,介绍下你自己!请用中文回答。"; private final ChatClient ollamaiChatClient; public OllamaChatClientController(ChatModel chatModel) { // 构造时,可以设置 ChatClient 的参数 this.ollamaiChatClient = ChatClient.builder(chatModel) // 实现 Logger 的 Advisor .defaultAdvisors( new SimpleLoggerAdvisor() ) // 设置 ChatClient 中 ChatModel 的 Options 参数 .defaultOptions( OllamaOptions.builder() .topP(0.7) .model("deepseek-r1:1.5b") .build() ) .build(); } /** * ChatClient 简单调用 */ @Operation(summary = "无参数调用") @GetMapping("/simple/chat") public String simpleChat() { return ollamaiChatClient.prompt(DEFAULT_PROMPT).call().content(); } /** * ChatClient 流式调用 */ @Operation(summary = "流式调用") @GetMapping("/stream/chat") public Flux<String> streamChat1(@RequestParam String message) { return ollamaiChatClient.prompt(message).stream().content(); } @GetMapping("/stream") public SseEmitter streamChat2(@RequestParam String message) { SseEmitter emitter = new SseEmitter(); Flux<String> content = ollamaiChatClient.prompt(message).stream().content(); try { emitter.send(content); System.out.println(emitter.toString()); } catch (IOException e) { throw new RuntimeException(e); } return emitter; } }
2. 支持流式响应(可选)
/** * ChatClient 流式调用 */ @Operation(summary = "流式调用") @GetMapping("/stream/chat") public Flux<String> streamChat1(@RequestParam String message) { return ollamaiChatClient.prompt(message).stream().content(); }
六、knife4j测试接口
访问Url:http://localhost:9999/doc.html
1. 无参数接口测试
接口:/client/simple/chat
2. 流式调用接口测试
接口:/client/stream/chat
七、扩展功能建议
- 多模型切换:通过@RequestParam动态选择模型
- 对话历史管理:使用Redis存储上下文
- 速率限制:添加Bucket4j限流
- API鉴权:集成Spring Security
八、常见问题排查
问题现象 |
解决方案 |
连接Ollama超时 |
确认 |
模型加载失败 |
检查 |
内存不足 |
尝试更小参数的模型版本 |
九、项目效果展示
十、总结
本文演示了如何通过:
- 本地部署Ollama服务
- Spring AI集成LLM能力
- 构建RESTful API接口
优势:数据隐私性强、无需API密钥、支持离线环境
完整代码示例:https://gitcode.com/Var_ya/springAI_ollama_chatInterfaceApi