Spring AI 初步集成(1)-初始化

简单集成

从这里我们开始使用 Spring AI 来集成 AI 模型到 Spring Boot 应用中。我们将通过一个简单的聊天接口示例来演示如何使用 Spring AI。

前置条件

创建 Spring Boot 项目

我们可以使用 Spring Initializr 来创建一个新的 Spring Boot 项目,或者通过IntelliJ IDEA 或其他方式来创建。在此,我们直接通过 IntelliJ IDEA 来创建一个新的 Spring Boot 项目,使用Java24,用Gradle进行依赖管理(也可以选择用Maven),项目名为 canaan。此项目名的含义是"迦南",来源于养猪场的某个游戏角色名,可以根据自己的偏好更改。

因为我们需要接口来与 AI 模型进行交互,所以我们需要添加web依赖,Spring提供了两种web依赖:

  • Spring Web(spring-boot-starter-web):使用Spring MVC构建Web应用程序,包括RESTful应用程序。默认使用Apache Tomcat作为嵌入式容器。
  • Spring Reactive Web(spring-boot-starter-webflux):使用Spring WebFlux和Netty构建响应式Web应用程序。

可以根据自己的需求选择使用的在这里选择 spring-boot-starter-web 作为依赖。

因为Gradle包下载问题,建议将Gradle下载换成国内镜像,例如阿里云。

我们可以在 gradle/wrapper/gradle-wrapper.properties 文件中修改distributionUrl配置来使用国内镜像:

properties 复制代码
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
# 更换成国内的下载地址,例如:
# distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip
distributionUrl=https\://mirrors.aliyun.com/gradle/distributions/v9.0.0-RC3/gradle-9.0.0-rc-3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

建议修改build.gradle文件,添加以下国内镜像仓库

groovy 复制代码
repositories {
    // 使用阿里云的公共仓库
    // 其他仓库可以根据需要添加
    maven { url 'https://maven.aliyun.com/repository/public' }
    mavenCentral()
    maven { url 'https://repo.spring.io/milestone' }
    maven { url 'https://repo.spring.io/snapshot' }
    maven {
        name = 'Central Portal Snapshots'
        url = 'https://central.sonatype.com/repository/maven-snapshots/'
    }
}

添加Spring AI 依赖

我们需要添加Spring AI的依赖。Spring AI提供了一个物料清单(BOM),它声明了Spring AI给定版本所使用的所有依赖项的推荐版本。我们可以在 build.gradle 文件中的dependencies下添加以下内容:

groovy 复制代码
dependencies {
    // 其他依赖项...
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    /**
    * 添加内容
    */

    // Spring AI物料清单(BOM)声明了Spring AI给定版本所使用的所有依赖项的推荐版本。这是一个仅包含BOM的版本,它仅包含依赖项管理,不包含插件声明或对Spring或Spring Boot的直接引用。
    implementation platform("org.springframework.ai:spring-ai-bom:1.0.0-SNAPSHOT")
    // 具体的AI模型依赖,我们选择 DeepSeek,因为DeepSeek兼容OpenAi的API,也可以使用OpenAI
    implementation 'org.springframework.ai:spring-ai-starter-model-deepseek'
}

具体的AI模型依赖可以根据需要选择不同的模型,例如 OpenAI、DeepSeek 等。这里我们选择 DeepSeek 作为示例。如果需要使用其他模型,可以参考 Chat Models Comparison 中的说明。

配置 DeepSeek API 密钥

为了使用 DeepSeek 模型,我们需要配置 API 密钥,API密钥可以在 DeepSeek 的官网上注册账号后获取。获取到 API 密钥后,我们需要将其添加到 Spring Boot 应用的配置文件中,以便应用能够访问 DeepSeek 的服务。 通常,我们会将 API 密钥存储在环境变量中,以避免将敏感信息硬编码到代码中。可以在 src/main/resources/application.yml 文件中添加以下配置:

yaml 复制代码
spring:
  ai:
    deepseek:
      api-key: ${DEEPSEEK_API_KEY} # 从环境变量中读取 DeepSeek API 密钥
      base-url: https://api.deepseek.com/v1

这里我们使用环境变量 DEEPSEEK_API_KEY 来存储 DeepSeek 的 API 密钥。可以在运行应用程序之前设置这个环境变量,或者直接在配置文件中填写 API 密钥(不推荐)。

如果要在IDEA中使用环境变量,可以在运行配置中添加环境变量。也可以和我一样,将环境变量加入系统变量中,然后直接勾选包含系统变量来使用。

配置ChatClient

接下来,我们需要配置一个 ChatClient,它将用于与 DeepSeek 模型进行交互。我们可以在 src/main/java/com/example/canaan/config/ai 目录下创建一个新的配置类 ChatConfiguration.java.java,并添加以下内容:

java 复制代码
package com.chestnut.canaan.config.ai;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ChatConfiguration {

    @Bean
    public ChatClient chatClient(ChatClient.Builder builder) {
        return builder.defaultSystem("you are a friendly assistant!").build();
    }
}

在这个配置类中,我们定义了一个 ChatClient 的 Bean,并设置了默认的系统提示(system prompt)。这个系统提示将作为模型的上下文信息,帮助模型更好地理解用户的请求。

创建聊天接口

现在,我们可以创建一个简单的聊天接口来与 DeepSeek 模型进行交互。

src/main/java/com/example/canaan/service 目录下创建一个新的服务类 AiService.java,并添加以下内容:

java 复制代码
package com.chestnut.canaan.service;

import reactor.core.publisher.Flux;

public interface AiService {

    Flux<String> chat(String input);

}

接下来,我们需要实现这个服务接口。在 src/main/java/com/example/canaan/service/impl 目录下创建一个新的实现类 AiServiceImpl.java,并添加以下内容:

java 复制代码
package com.chestnut.canaan.service.impl;

import com.chestnut.canaan.service.AiService;
import jakarta.annotation.Resource;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

@Service
public class AiServiceImpl implements AiService {

    @Resource
    private ChatClient chatClient;

    @Override
    public Flux<String> chat(String input) {
        return chatClient.prompt().user(input).stream().content();
    }
}

src/main/java/com/example/canaan/controller 目录下创建一个新的控制器类 AiController.java,并添加以下内容:

java 复制代码
package com.chestnut.canaan.controller;

import com.chestnut.canaan.service.AiService;
import jakarta.annotation.Resource;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/ai")
public class AiController {

    @Resource
    private AiService aiService;

    @GetMapping("/chat")
    public Flux<String> chat(String input) {
        return aiService.chat(input);
    }

}

OK,现在我们已经创建了一个简单的聊天接口,可以通过访问 /ai/chat?input=你的问题 来与 DeepSeek 模型进行交互。

运行应用程序后,可以使用浏览器或 Postman 等工具访问这个接口。例如,访问 http://localhost:8080/ai/chat?input=你好,应该会得到 DeepSeek 模型的回复。

我们使用curl来测试一下接口,看看效果:

bash 复制代码
curl  --url 'http://localhost:8080/ai/chat?input=Are%20you%20ok%3F' --no-buffer

--no-buffer 选项用于禁用 curl 的输出缓冲,这样可以实时看到服务器的响应。

测试效果如下:

至此,我们已经成功地将 DeepSeek 模型集成到 Spring Boot 应用中,并创建了一个简单的聊天接口。接下来,我们可以继续扩展这个应用,添加更多的功能和特性,例如工具调用、聊天记录等。

总结

在本章中,了解了如何使用 Spring AI 来集成 AI 模型到 Spring Boot 应用中。我们创建了一个简单的聊天接口,使用 DeepSeek 模型来回答用户的问题。

相关推荐
流水武qin2 小时前
SpringAI多模态的基本使用
java·spring boot·spring·ai
小飞Coding2 小时前
Spring 容器生命周期:10大核心扩展接口+实战代码
spring boot
吾诺2 小时前
Spring Boot--@PathVariable、@RequestParam、@RequestBody
java·spring boot·后端
jiankeljx2 小时前
Spring Boot实现多数据源连接和切换
spring boot·后端·oracle
xyyaihxl4 小时前
springboot与springcloud对应版本
java·spring boot·spring cloud
小箌4 小时前
springboot_01
java·spring boot·后端
a8a3025 小时前
Springboot中CommandLineRunner的用法以及执行顺序的控制
java·spring boot·spring
sevenlin5 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式
salipopl5 小时前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis