基于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

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

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


七、扩展功能建议

  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

### 使用Spring和Vue进行AI项目开发 #### 构建环境准备 为了构建一个基于Spring AI和Vue的AI项目,首先需要准备好相应的技术栈。所使用的架构版本包括JDK 17, Spring Boot 3.3.3, Spring-AI 1.0.0-M3以及Spring-AI-Alibaba 1.0.0-M3.1 和前端框架vue3[^1]。 #### 后端服务搭建 后端部分主要依赖于Spring Boot来创建RESTful API接口,这些API用于处理来自客户端的数据请求并返回响应数据。通过引入`spring-ai-alibaba`组件可以增强应用程序对于自然语言处理的支持能力,使得开发者能够更方便地集成阿里云平台上的各种人工智能服务。 #### 前端页面设计 在前端方面,则采用Vue.js作为核心库来进行单页应用(SPA)的设计与实现工作。利用其声明式的视图层语法特性简化HTML模板编写过程;借助Vuex状态管理模式管理复杂的应用逻辑;同时配合Router插件完成多路由配置下的页面跳转操作[^2]。 #### 数据交互方式 针对实时性较高的场景需求,在前后端之间建立WebSocket连接以支持双向通信机制成为一种理想的选择之一。这样不仅可以有效降低延迟时间提高用户体验度,而且还能更好地满足诸如聊天机器人这类应用场景的要求。 #### 组件化开发实践 考虑到大型项目的维护性和可扩展性的要求,推荐按照模块划分原则将业务功能拆分成多个独立的小型部件——即所谓的“微前端”。每个子系统都可以单独部署运行而不影响其他部分正常运作,从而大大提升了整体系统的灵活性和稳定性[^3]。 ```javascript // 示例:Vue3 中使用 WebSocket 进行消息传递 import { ref } from 'vue'; export default { setup() { const messages = ref([]); let socket; function connectSocket() { socket = new WebSocket('ws://localhost:8080/chat'); socket.onmessage = (event) => { messages.value.push(JSON.parse(event.data)); }; } return { messages, connectSocket } } } ```
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VarYa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值