简单集成
从这里我们开始使用 Spring AI 来集成 AI 模型到 Spring Boot 应用中。我们将通过一个简单的聊天接口示例来演示如何使用 Spring AI。
前置条件
- Spring AI 要求spring-boot版本为3.4.0及以上。限制来源于官网原文 Spring AI supports Spring Boot 3.4.x. When Spring Boot 3.5.x is released, we will support that as well.。
- 在上一个条件下,也就意味着Spring AI 需要 Java 17 或更高版本。
创建 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配置来使用国内镜像:
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文件,添加以下国内镜像仓库
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下添加以下内容:
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 文件中添加以下配置:
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,并添加以下内容:
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,并添加以下内容:
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,并添加以下内容:
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,并添加以下内容:
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来测试一下接口,看看效果:
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 模型来回答用户的问题。