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

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框架中。

注:

实现

安装和配置Ollama

步骤1:下载并安装Ollama

访问Ollama官网下载安装包:

复制代码
https://ollama.com/

Windows用户下载Windows版本,安装后Ollama默认运行在 http://localhost:11434

步骤2:启动Ollama服务

安装完成后,Ollama会自动启动。可以通过以下命令检查状态:

bash 复制代码
# Windows PowerShell
ollama list

# 查看运行的模型
ollama ps
步骤3:拉取本地模型
bash 复制代码
# 拉取qwen2.5模型(推荐,与阿里云百炼兼容性好)
ollama pull qwen2.5

# 或者拉取其他模型
ollama pull llama3.2
ollama pull phi3
ollama pull mistral

模型选择建议:

  • qwen2.5: 中文支持好,适合练手
  • llama3.2: 性能优秀,生态丰富
  • phi3: 体积小,适合低配置机器
  • mistral: 平衡性能和效果
步骤4:验证模型是否正常工作
bash 复制代码
# 测试模型对话
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路径:

batch 复制代码
@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):

xml 复制代码
<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
yaml 复制代码
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对话接口:

java 复制代码
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"
        );
    }
}

创建启动类

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

batch 复制代码
@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:使用启动脚本
bash 复制代码
# 双击运行
一键启动.bat

# 选择选项2启动项目
方式2:使用Maven命令
powershell 复制代码
# 设置环境
$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测试:

bash 复制代码
# 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. 健康检查:

bash 复制代码
curl http://localhost:885/ai/health

预期响应:

json 复制代码
{
  "status": "running",
  "model": "ollama-qwen2.5",
  "type": "local"
}

多模型切换示例

如果想尝试不同的模型,只需修改 application.yml 中的 model 配置:

yaml 复制代码
spring:
  ai:
    openai:
      chat:
        options:
          model: llama3.2  # 切换到Llama模型
          # model: phi3    # 或者切换到Phi模型
          # model: mistral # 或者使用Mistral模型

注意: 切换模型前,需要先使用 ollama pull 下载对应模型。

高级配置

如果需要更精细的控制,可以添加更多配置选项:

yaml 复制代码
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启动失败?
bash 复制代码
# Windows下检查Ollama是否运行
tasklist | findstr ollama

# 手动启动Ollama
ollama serve

# 检查服务状态
curl http://localhost:11434/api/tags
Q2: 模型下载慢?
bash 复制代码
# 可以使用国内镜像或代理
# 或者选择较小的模型(如phi3)
ollama pull phi3
Q3: 内存不足?
  • Ollama默认使用GPU,如果没有GPU会使用CPU
  • 小内存机器建议使用较小模型(如phi3、qwen2.5:1.5b)
  • 查看模型大小:ollama list
Q4: 编译失败 - 测试依赖缺失?

确保pom.xml包含测试依赖:

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
Q5: 端口885被占用?

修改 application.yml 中的端口号:

yaml 复制代码
server:
  port: 8080  # 改为其他端口
Q6: 模型响应慢?
  • 首次加载模型需要时间(从磁盘加载到内存)
  • 后续请求会快很多
  • 可以调整 max-tokens 控制响应长度

进阶使用:流式响应

如果需要实现流式响应(Server-Sent Events),可以修改Controller:

java 复制代码
@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功能原型验证
  • 敏感数据处理
  • 离线环境使用
  • 学习大模型技术
相关推荐
Navicat中国25 分钟前
Navicat 18 内置 AI 助手让数据库开发从繁琐操作迈向智能协作
大数据·人工智能·数据库开发
4SAPI1 小时前
多模型请求路由怎么设计?成本、速度和能力如何平衡
人工智能·python·gateway·php
魔乐社区1 小时前
翼芯・智算测试与适配优化专区,让国产算力“选得准、跑得通、用得好“
人工智能·开源·大模型
Java爱好狂.2 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
XCDoris3 小时前
郴州logo设计机构
大数据·人工智能·python
Goboy3 小时前
一个人带三个Agent,我用全新TRAE从0到1搭了个资讯周刊站
人工智能·trae
俊哥V3 小时前
每日 AI 研究简报 · 2026-10-19
人工智能·ai
AI_AGENT_DEV_AI3 小时前
AI英语教培智能体的开发
人工智能
物联网软硬件开发-轨物科技3 小时前
【技术白皮书】光伏清检一体化机器人系统解决方案技术白皮书
大数据·运维·网络·人工智能·机器人
海宇数据4 小时前
零信任架构实战:基于海宇网上踪迹欺诈行为识别构建自动化信贷资信评估网关
运维·人工智能·架构·自动化