基于Spring AI Alibaba + Spring Boot + Ollama搭建本地AI对话机器人API

前言

Spring AI Alibaba 开源项目基于 Spring AI 构建,是阿里云通义系列模型及服务在 Java AI 应用开发领域的最佳实践,提供高层次的 AI API 抽象与云原生基础设施集成方案,帮助开发者快速构建 AI 应用。

  1. 项目地址

gitcode平台:https://gitcode.com/Var_ya/springAI_ollama_chatInterfaceApi

  1. 核心技术官网地址

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

  1. Ollama官网安装

官网地址:https://ollama.com/

官网下载window版本地址:https://ollama.com/download

  1. 百度网盘下载安装

百度网盘地址:https://pan.baidu.com/s/1mx_3R4NVjOSC9D8BaGdYHg?pwd=9eg7

  1. 运行OllamaSetup安装包
  • 双击OllamaSetup.exe
  • 安装包点击:Install
  • 安装成功
    (截图示例:终端执行ollama --version

2. 下载模型

本教程使用的模型:deepseek-r1:8b

模型运行下载命令:ollama run deepseek-r1:8b

bash 复制代码
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

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.yml

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

java 复制代码
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. 支持流式响应(可选)

java 复制代码
	/**
	 * 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


七、扩展功能建议

  1. 多模型切换:通过@RequestParam动态选择模型
  2. 对话历史管理:使用Redis存储上下文
  3. 速率限制:添加Bucket4j限流
  4. API鉴权:集成Spring Security

八、常见问题排查

问题现象 解决方案
连接Ollama超时 确认ollama serve正在运行
模型加载失败 检查ollama list确认模型存在
内存不足 尝试更小参数的模型版本

九、项目效果展示


十、总结

本文演示了如何通过:

  1. 本地部署Ollama服务
  2. Spring AI集成LLM能力
  3. 构建RESTful API接口

优势:数据隐私性强、无需API密钥、支持离线环境

完整代码示例:https://gitcode.com/Var_ya/springAI_ollama_chatInterfaceApi

相关推荐
@yanyu6661 小时前
springboot实现查询学生
java·spring boot·后端
酷爱码2 小时前
Spring Boot项目中JSON解析库的深度解析与应用实践
spring boot·后端·json
java干货3 小时前
虚拟线程与消息队列:Spring Boot 3.5 中异步架构的演进与选择
spring boot·后端·架构
武昌库里写JAVA6 小时前
iview Switch Tabs TabPane 使用提示Maximum call stack size exceeded堆栈溢出
java·开发语言·spring boot·学习·课程设计
小白杨树树6 小时前
【WebSocket】SpringBoot项目中使用WebSocket
spring boot·websocket·网络协议
clk660712 小时前
Spring Boot
java·spring boot·后端
爱敲代码的TOM13 小时前
基于JWT+SpringSecurity整合一个单点认证授权机制
spring boot
loser.loser13 小时前
QQ邮箱发送验证码(Springboot)
java·spring boot·mybatis