电子书 – Spring Cloud 指南 – NPI EA (分类=Spring Cloud)
announcement - icon

让我们开始使用 Spring Cloud 的微服务架构

>> 加入 Pro 并下载电子书

电子书 – Mockito – NPI EA (标签 = Mockito)
announcement - icon

模拟是单元测试的重要组成部分,Mockito 库使编写 清晰直观的单元测试 变得容易,用于您的 Java 代码。

通过我们的 Mockito 指南 开始模拟,并改进您的应用程序测试

下载电子书

电子书 – Java 并发 – NPI EA (分类=Java 并发)
announcement - icon

在应用程序中处理并发可能是一个棘手的过程,其中包含许多 潜在的陷阱。 扎实的掌握基本知识将有助于最大程度地减少这些问题。

通过我们的 Java 并发 指南开始了解多线程应用程序

>> 下载电子书

电子书 – 响应式 – NPI EA (分类=响应式)
announcement - icon

Spring 5 增加了对使用 Spring WebFlux 模块进行响应式编程的支持,此支持自那时起不断改进。 开始使用 Reactor 项目基础知识和 Spring Boot 中的响应式编程

>> 加入 Pro 并下载电子书

电子书 – Java Streams – NPI EA (分类=Java Streams)
announcement - icon

自从 Java 8 引入以来,Stream API 已成为 Java 开发的基础。 基本操作,例如迭代、过滤、映射元素序列,使用起来看似很简单。

但这些也可能被过度使用并陷入一些常见陷阱。

更好地了解 Stream 的工作方式 以及如何将其与其他语言功能结合使用,请查看我们关于 Java Streams 的指南

>> 加入 Pro 并下载电子书

电子书 – Jackson – NPI EA (分类=Jackson)
announcement - icon

用 Jackson 正确处理 JSON

下载电子书

电子书 – HTTP 客户端 – NPI EA (分类=Http 客户端)
announcement - icon

充分利用 Apache HTTP 客户端

下载电子书

电子书 – Maven – NPI EA (分类 = Maven)
announcement - icon

开始使用 Apache Maven

下载电子书

电子书 – 持久化 – NPI EA (分类=持久化)
announcement - icon

您在努力实现正确的持久化层 Spring 吗?

探索电子书

电子书 – RwS – NPI EA (分类=Spring MVC)
announcement - icon

使用 Spring 构建 REST API 吗?

下载电子书

课程 – LS – NPI EA (分类=Jackson)
announcement - icon

通过 Learn Spring 课程开始学习 Spring 和 Spring Boot

>> 学习 SPRING
课程 – RWSB – NPI EA (分类=REST)
announcement - icon

通过构建一个完整的 REST API,深入了解 Spring Boot 3 和 Spring 6,使用该框架

>> 全新的“REST With Spring Boot”

课程 – LSS – NPI EA (分类=Spring Security)
announcement - icon

是的,Spring Security 可能很复杂,从核心内的更高级功能到框架中深入的 OAuth 支持。

我将安全材料构建为 两个完整的课程 - 核心和 OAuth,以针对这些更复杂的场景进行实践。 我们探索何时以及如何使用每个功能,并 在后台项目中对其进行编码

您可以在这里探索该课程

>> 学习 Spring Security

课程 – LSD – NPI EA (标签=Spring Data JPA)
announcement - icon

Spring Data JPA 是处理 JPA 复杂性的绝佳方式,它具有 Spring Boot 的强大简洁性

通过引导式参考课程开始使用 Spring Data JPA

>> 查看课程

合作伙伴 – Moderne – NPI EA (类别=Spring Boot)
announcement - icon

使用 OpenRewrite 安全且自动地重构 Java 代码。

手动重构大型代码库既缓慢、有风险,又容易拖延。OpenRewrite 应运而生。这个用于大规模、自动化代码转换的开源框架可以帮助团队安全、一致地进行现代化改造。

每个月,OpenRewrite 的创建者和维护者 Moderne 都会举办现场、实践培训课程——一个面向初学者,一个面向经验丰富的用户。您将了解配方的运作方式、如何将其应用于项目,以及如何自信地进行代码现代化改造。

参加下一次课程,带来您的问题,并学习如何自动化通常会占用您 sprint 时间的工作。

合作伙伴 – LambdaTest – NPI EA (类别=测试)
announcement - icon

回归测试是发布流程中的重要步骤,以确保新代码不会破坏现有功能。随着代码库的不断发展,我们希望频繁运行这些测试,以便尽早发现任何问题。

确保这些测试以自动化的方式频繁运行的最佳方法当然是将其包含在 CI/CD 管道中。 这样,每次向仓库提交代码时,回归测试将自动执行。

在本教程中,我们将学习如何使用 Selenium 创建回归测试,然后使用 GitHub Actions 将它们包含在我们的管道中,在 LambdaTest 云网格上运行

>> 如何使用 GitHub Actions 运行 Selenium 回归测试

课程 – LJB – NPI EA (类别 = Core Java)
announcement - icon

通过编码方式构建 Java 的坚实、实用的基础

>> 学习 Java 基础

1. 概述

现代应用程序越来越多地使用 大型语言模型 (LLM) 来构建超越传统编程能力的应用。 然而,将这些模型集成到我们的应用程序中通常涉及处理复杂的 API、管理不同的 AI 提供商以及处理各种配置挑战。

Spring AI 作为 Spring 生态系统的新增成员,通过提供一个通用的抽象层来使用熟悉的 Spring 编程模式与不同的 AI 提供商协作,从而解决了这些问题。

它消除了显式使用特定于提供商的 SDK 的需要,并使我们能够在不更改应用程序代码的情况下在不同的模型之间切换。

在本教程中,我们将通过构建一个基本的诗歌生成服务来实际探索 Spring AI 的基本概念

2. 设置项目

为了演示,我们将使用 OpenAI 的 GPT-5 模型 构建我们的诗歌生成服务

然而,Spring AI 支持来自各种其他提供商的模型,例如 AnthropicDeepSeek,甚至通过 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() 方法中,我们使用 chatClientprompt() 方法发送一个请求,请求生成一首 俳句

然后,我们调用 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 会员 身份登录,就开始学习并在项目上进行编码。
Baeldung Pro – NPI EA (类别 = Baeldung)
announcement - icon

Baeldung Pro 具有完全无广告以及最终具有深色模式,提供干净的学习体验

>> 探索干净的 Baeldung

一旦早期采用者的席位全部用完,价格将上涨并保持在每年 33 美元。

电子书 – HTTP 客户端 – NPI EA (类别=HTTP 客户端)
announcement - icon

Apache HTTP Client 是一个非常强大的库,适用于简单和高级用例,在测试 HTTP 端点时尤其适用。 查看我们的指南,涵盖基本请求和响应处理,以及安全性、Cookie、超时等。

>> 下载电子书

电子书 – Java 并发 – NPI EA (分类=Java 并发)
announcement - icon

在应用程序中处理并发可能是一个棘手的过程,其中包含许多 潜在的陷阱。 扎实的掌握基本知识将有助于最大程度地减少这些问题。

通过我们的 Java 并发 指南开始了解多线程应用程序

>> 下载电子书

电子书 – Java Streams – NPI EA (分类=Java Streams)
announcement - icon

自从 Java 8 引入以来,Stream API 已成为 Java 开发的基础。 基本操作,例如迭代、过滤、映射元素序列,使用起来看似很简单。

但这些也可能被过度使用并陷入一些常见陷阱。

更好地了解 Stream 的工作方式 以及如何将其与其他语言功能结合使用,请查看我们关于 Java Streams 的指南

>> 加入 Pro 并下载电子书

电子书 – 持久化 – NPI EA (分类=持久化)
announcement - icon

您在努力实现正确的持久化层 Spring 吗?

探索电子书

课程 – LS – NPI EA (类别=REST)

announcement - icon

从 Spring Boot 开始,通过 Learn Spring 课程了解核心 Spring。

>> 查看课程

合作伙伴 – Moderne – NPI EA (标签=重构)
announcement - icon

现代 Java 团队行动迅速——但代码库并不总是跟上。 框架会发生变化,依赖关系会漂移,技术债务会累积,直到它开始拖慢交付速度。 OpenRewrite 就是为此而构建的:一个开源重构引擎,可在保持开发人员意图不变的同时自动化重复的代码更改。

由 Moderne 的 OpenRewrite 创建者和维护者领导的每月培训系列,将介绍实际的迁移和现代化模式。 无论您是重构配方的新手,还是准备编写自己的配方,您都将学习以安全且可扩展的方式进行重构的实用方法。

如果您曾经希望重构感觉像编写代码一样自然——并且一样快速——这是一个很好的起点

电子书 Jackson – NPI EA – 3 (类别 = Jackson)
3 条评论
最早
最新
内联反馈
查看所有评论
© .