Spring AI 入门
最后更新:2025 年 12 月 15 日
1. 概述
现代应用程序越来越多地使用 大型语言模型 (LLM) 来构建超越传统编程能力的应用。 然而,将这些模型集成到我们的应用程序中通常涉及处理复杂的 API、管理不同的 AI 提供商以及处理各种配置挑战。
Spring AI 作为 Spring 生态系统的新增成员,通过提供一个通用的抽象层来使用熟悉的 Spring 编程模式与不同的 AI 提供商协作,从而解决了这些问题。
它消除了显式使用特定于提供商的 SDK 的需要,并使我们能够在不更改应用程序代码的情况下在不同的模型之间切换。
在本教程中,我们将通过构建一个基本的诗歌生成服务来实际探索 Spring AI 的基本概念。
2. 设置项目
为了演示,我们将使用 OpenAI 的 GPT-5 模型 构建我们的诗歌生成服务。
然而,Spring AI 支持来自各种其他提供商的模型,例如 Anthropic、DeepSeek,甚至通过 Hugging Face 或 Ollama 使用本地 LLM。 我们可以选择最适合我们要求的模型,因为对于这个实现而言,特定的 AI 模型是无关紧要的。
2.1. 依赖项
让我们从向项目的 pom.xml 文件添加必要的依赖项开始
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
<version>1.0.1</version>
</dependency>
OpenAI starter 依赖项 是 OpenAI Chat Completions API 的封装,我们将使用它在我们的应用程序中与 GPT-5 模型交互。
2.2. 配置 LLM 属性
接下来,让我们在 application.yaml 文件中配置我们的 OpenAI API 密钥 和聊天模型
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-5
temperature: 1
我们使用 ${} 属性占位符从 环境变量 中加载 API 密钥的值。
接下来,我们将 gpt-5 指定为模型 ID。 我们可以根据需要使用 不同的模型。
此外,我们将 temperature 设置为 1,因为我们配置的模型 仅接受此默认值。
3. 构建诗歌生成服务
有了我们的配置,让我们构建一个使用配置的 LLM 生成诗歌的服务。 我们将从一个基本的实现开始,并逐步对其进行重构以使用更高级的 Spring AI 功能。
3.1. 使用 ChatClient 与 LLM 通信
在 Spring AI 中,ChatClient 类是与我们配置的任何模型交互的主要入口点。
我们可以使用 ChatClient.Builder bean 获取它的实例,该 bean 根据我们在 application.yaml 文件中配置的属性自动为我们创建。
让我们用它来创建一个新的 PoetryService 类
private final ChatClient chatClient;
PoetryService(ChatClient.Builder chatClientBuilder) {
this.chatClient = chatClientBuilder.build();
}
String generate() {
return chatClient
.prompt("Write a playful haiku about morning coffee following the traditional 5-7-5 syllable structure.")
.call()
.content();
}
在这里,我们将 ChatClient.Builder 注入到我们的服务的构造函数中,并使用它来构建一个 ChatClient 实例。
接下来,在我们的 generate() 方法中,我们使用 chatClient 的 prompt() 方法发送一个请求,请求生成一首 俳句。
然后,我们调用 call() 方法在配置的 LLM 上执行请求,并调用 content() 方法将生成的文本提取为简单的 String。
3.2. 使用 PromptTemplate 和结构化输出重构
虽然我们的初始实现有效,但它仅限于生成关于咖啡的固定提示的俳句。 此外,我们返回一个纯字符串响应,客户端可能难以处理。
为了解决这些限制,我们将重构我们的服务,使用一个提示模板,可以在运行时动态替换流派和主题值,并将 LLM 的响应映射到一个结构化的 Java 对象。
首先,让我们定义一个 Poem record 来表示我们输出的结构
record Poem(
String title,
String content,
String genre,
String theme) {
}
我们定义这个 record,包含 title(标题)、content(内容)、genre(流派)和 theme(主题)字段,以表示我们期望从 LLM 获得的结构化响应。
接下来,让我们重构我们的服务方法
private final static PromptTemplate PROMPT_TEMPLATE
= new PromptTemplate("Write a {genre} haiku about {theme} following the traditional 5-7-5 syllable structure.");
Poem generate(String genre, String theme) {
Prompt prompt = PROMPT_TEMPLATE
.create(Map.of(
"genre", genre,
"theme", theme));
return chatClient
.prompt(prompt)
.call()
.entity(Poem.class);
}
在重构后的版本中,我们将硬编码的提示替换为包含 genre(流派)和 theme(主题)占位符的 PromptTemplate。 在 generate() 方法中,我们现在期望这些值作为方法参数,并使用它们创建一个 Prompt 实例。
此外,我们将 content() 方法替换为 entity(),并在其中指定我们的 Poem record。 Spring AI 将自动在提示中添加指令,引导 LLM 生成可以映射到这个 record 的响应。
3.3. 暴露 REST API 和处理错误
既然我们已经实现了服务层,让我们在其之上暴露一个 REST API
@PostMapping("/poems")
ResponseEntity<Poem> generate(@RequestBody PoemGenerationRequest request) {
Poem response = poetryService.generate(request.genre, request.theme);
return ResponseEntity.ok(response);
}
record PoemGenerationRequest(String genre, String theme) {}
在这里,我们简单地定义一个 POST /poems 端点,它接受一个 PoemGenerationRequest record 作为请求体,并简单地委托给我们的服务层来返回生成的诗歌。
此外,与任何外部服务的通信一样,配置的 LLM 有时可能会失败。 为了优雅地处理这种情况,Spring AI 提供了一个 OpenAiApiClientErrorException,它为所有 OpenAI 错误 提供了一个抽象。
让我们为这个类定义一个 异常处理程序
private static final String LLM_COMMUNICATION_ERROR =
"Unable to communicate with the configured LLM. Please try again later.";
@ExceptionHandler(OpenAiApiClientErrorException.class)
ProblemDetail handle(OpenAiApiClientErrorException exception) {
logger.error("OpenAI returned an error.", exception);
return ProblemDetail.forStatusAndDetail(HttpStatus.SERVICE_UNAVAILABLE, LLM_COMMUNICATION_ERROR);
}
在这里,我们故意避免在响应中暴露实际的错误细节,以防止泄露有关我们的基础设施或 API 密钥的敏感信息。 相反,我们记录完整的异常以进行调试,并通过标准化的 ProblemDetail 响应格式返回用户友好的消息。
4. 测试我们的应用程序
最后,让我们使用我们暴露的 API 端点来与我们的应用程序交互和测试。
我们将使用 HTTPie CLI 来调用 API
http POST :8080/poems genre="frustrated" theme="code review comments"
在这里,我们向我们的 /poems 端点发送一个 POST 请求,并附带我们想要的 genre(流派)和 theme(主题)。
让我们看看我们收到的响应是什么
{
"title": "Nitpick Nightmare",
"content": "Tabs versus spaces\nThey argue while prod is down\nPriorities... where?",
"genre": "frustrated",
"theme": "code review comments"
}
正如我们所见,我们获得了一首俳句,有效地捕捉了我们提供的流派和主题。
这证实了我们的应用程序正确填充了提示模板,并以可以映射到我们的 Poem record 的格式接收了 LLM 的输出.
5. 结论
在本文中,我们探讨了使用 Spring AI 将 AI 功能集成到 Spring Boot 应用程序中。
我们介绍了必要的配置,并使用 OpenAI 的 GPT-5 模型实现了一个诗歌生成服务。 我们将简单的实现从基于字符串的提示演变为更复杂的解决方案,使用提示模板和结构化输出。
虽然这个入门教程涵盖了基础知识,Spring AI 提供了广泛的 AI 功能,可以在我们的 Spring AI 教程合集 中探索。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















