SpringBoot中使用Spring AI框架集成本地Ollama实现AI快速对话完整示例

场景

SpringBoot中使用SpringAIAlibaba框架集成阿里云百炼实现AI快速对话入门示例:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/160024361

基于上述文章基础。

在实际开发中,我们经常需要在本地运行大模型进行测试和开发。虽然阿里云百炼等云平台提供了便捷的API服务,但在以下场景中,本地Ollama是更好的选择:

  1. 开发测试:快速验证AI功能,无需等待网络请求
  2. 数据隐私:敏感数据不想上传到云端
  3. 成本控制:完全免费,无API调用费用
  4. 离线环境:无外网或网络不稳定时使用
  5. 定制化需求:需要运行特定开源模型

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大模型。主要步骤包括:

  1. 安装Ollama:下载并拉取所需模型
  2. 配置JDK 17:确保满足Spring AI的版本要求
  3. 创建SpringBoot项目:添加Spring AI OpenAI Starter依赖
  4. 配置Ollama连接:设置base-url为本地Ollama服务
  5. 实现对话接口:使用ChatClient进行AI对话
  6. 测试验证:通过API接口测试功能

核心优势:

  • ✅ 完全免费,无API费用
  • ✅ 数据完全本地,隐私安全
  • ✅ 无需外网,离线可用
  • ✅ 支持多种开源模型
  • ✅ 与Spring AI无缝集成

适用场景:

  • 本地开发和测试
  • AI功能原型验证
  • 敏感数据处理
  • 离线环境使用
  • 学习大模型技术
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐