大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略

系列篇章💥

No.文章
1大模型之Spring AI实战系列(一):基础认知篇 - 开启智能应用开发之旅
2大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略


前言

在当前人工智能技术迅猛发展的时代背景下,大语言模型(LLM)已然成为企业级应用不可或缺的重要组成部分。Spring AI作为Spring官方推出的AI开发框架,极大地简化了与大型语言模型的集成流程,使得开发者能够将更多精力聚焦于业务逻辑的设计与实现。
本篇文章是《Spring AI实战》专栏的第一篇开发入门文章,我们将借助一个完整的OpenAI聊天应用示例,详细介绍如何运用Spring Boot和Spring AI快速搭建一个支持OpenAI API的聊天服务,全面涵盖基础对话、流式对话、多提供商配置等核心功能。

一、开发环境准备

(一)Java 版本要求

本项目采用Java 17进行编译和运行,请务必确保你的开发环境已成功安装JDK 17。你可以在命令行中输入以下命令进行检查:

java -version

输出应类似如下内容:

openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
OpenJDK 64-Bit Server VM (build 17.0.8+7, mixed mode, sharing)

(二)Maven 构建工具

确保你已安装 Maven 并配置好环境变量:

mvn -v

输出应类似如下内容:

Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: D:\Program Files (x86)\apache-maven-3.8.8
Java version: 17.0.12, vendor: Oracle Corporation, runtime: D:\Program Files\jdk-17.0.12
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

(三)OpenAI API 密钥

你需要注册 OpenAI 官网 获取 API Key(国内可以直接使用中转地址),并设置为环境变量:

export OPENAI_API_KEY="your_openai_api_key"
export OPENAI_API_URL="https://api.openai.com/v1"

注意:出于安全考虑,不建议将密钥硬编码在代码中,推荐使用环境变量或配置中心进行管理。

二、POM依赖引入

(一)Spring AI与OpenAI集成依赖包

 <dependency>
     <groupId>org.springframework.ai</groupId>
     <artifactId>spring-ai-starter-model-openai</artifactId>
 </dependency>

此依赖包用于实现Spring AI与OpenAI的集成,为后续与OpenAI API进行交互提供了必要的支持。

(二)SpringAI相关依赖包版本管理

版本管理

 <dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.ai</groupId>
            <artifactId>spring-ai-bom</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

部分通过引入spring-ai-bom,实现了对SpringAI相关依赖包版本的统一管理。这样,在项目中使用Spring AI相关依赖时,无需在每个依赖声明中单独指定版本号,只需遵循spring-ai-bom中定义的版本即可,极大地简化了依赖管理工作,同时确保了项目中依赖版本的一致性和稳定性。

三、配置文件详解

在配置文件application.yml中我们需要进行openai API相关配置:

server:
  port: 8881
spring:
  ai:
    openai:
      base-url: ${OPENAI_API_URL}
      api-key: ${OPENAI_API_KEY}
      chat:
        options:
          model: gpt-3.5-turbo
          temperature: 0.7
  • base-url 和 api-key 从环境变量注入,这种方式增强了配置的安全性,避免了密钥在代码中硬编码带来的风险。
  • model 指定了默认使用的模型版本,这里设置为gpt-3.5-turbo,开发者可以根据实际需求进行调整。
  • temperature 用于控制输出的随机性,数值越高,生成的回复越随机,取值范围通常在0到1之间。

四、核心代码详解

接下来我们将逐个分析项目中的关键类及其功能实现。

(一)Application启动类

这是 Spring Boot 的启动类,非常简洁:

@SpringBootApplication
public class SpringAiApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringAiApplication.class, args);
    }
}

Spring Boot会自动扫描并加载所有的Controller、Service等Bean,为项目的启动和运行奠定基础。它通过@SpringBootApplication注解开启了Spring Boot的自动配置功能,使得项目能够快速搭建起一个完整的Spring应用环境。

(二)基于ChatClient API对话聊天

该类使用 ChatClient 接口来构建通用的聊天服务,适用于多提供商场景。

@RestController
@RequestMapping("/client")
public class ChatClientController {
    private final ChatClient chatClient;

    public ChatClientController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

    // 多个 @GetMapping 方法省略...
}

1. 基本对话接口

基本对话接口 /chat核心代码如下:

@GetMapping("/chat")
public String chat(@RequestParam String question) {
    return chatClient.prompt(question).call().content();
}
  • 此接口使用默认配置发起一次同步聊天请求,即向OpenAI API发送聊天问题,并等待返回同步的回复。
  • 返回值为字符串类型的AI回复内容,直接将API返回的聊天结果返回给调用者,方便在各种场景中进行使用。

2. 带通用选项对话

带通用选项的对话 /chat/generic-options,代码如下:

@GetMapping("/chat/generic-options")
public String chatGenericOptions(@RequestParam String question) {
    return chatClient
            .prompt(question)
            .options(ChatOptions.builder()
                    .model(DEFAULT_MODEL)
                    .temperature(DEFAULT_TEMPERATURE)
                    .build())
            .call()
            .content();
}
  • 该接口支持自定义模型(如gpt-4-turbo)和温度系数(控制回复随机性),通过ChatOptions进行配置。
  • 这种方式适用于需要适配多个AI提供商的场景,开发者可以根据不同的需求灵活调整模型和温度参数,以获取不同风格的回复。

3. 带OpenAI 特有参数的对话

带 OpenAI 特有参数的对话 /chat/provider-options,核心代码如下:

@GetMapping("/chat/provider-options")
public String chatProviderOptions(@RequestParam String question) {
    return chatClient
            .prompt(question)
            .options(OpenAiChatOptions.builder()
                    .logprobs(true)
                    .build())
            .call()
            .content();
}
  • 使用OpenAiChatOptions设置OpenAI特有的参数,例如logprobs(返回token概率分布),满足特定的业务需求。
  • 此接口适用于仅针对OpenAI的深度定制需求,开发者可以利用OpenAI提供的特有参数,进一步优化聊天回复的生成效果。

4. 流式对话接口

流式对话接口 /chat/stream,核心代码如下:

@GetMapping("/chat/stream")
public Flux<String> chatStream(@RequestParam String question) {
    return chatClient.prompt(question).stream().content();
}
  • 返回类型为Flux,表示响应是流式的。这意味着浏览器或客户端可以实时接收AI逐步生成的内容。
  • 这种流式响应方式非常适合聊天机器人、问答助手等交互场景,能够为用户提供更加流畅和实时的交互体验。

(三)基于OpenAiChatModel API对话聊天

该类使用 OpenAiChatModel 接口,更适合专注于 OpenAI 的项目。

@RestController
@RequestMapping("/model")
public class ChatModelController {
    private final OpenAiChatModel chatModel;

    @Autowired
    public ChatModelController(OpenAiChatModel chatModel) {
        this.chatModel = chatModel;
    }

    // 方法实现省略...
}

1. 基本对话接口

@GetMapping("/chat")
public Map<String, String> chat(@RequestParam(value = "message", defaultValue = "给我讲一个笑话") String message) {
    return Map.of("content", this.chatModel.call(message));
}
  • 返回值封装为Map<String, String>,便于JSON序列化,将聊天结果以一种易于处理的格式返回。
  • 默认消息为“给我讲一个笑话”,为接口提供了一个默认的输入内容,方便测试和快速使用。

2. 流式对话接口

@GetMapping("/chat/stream")
public Flux<ChatResponse> chatStream(@RequestParam(value = "message", defaultValue = "给我讲一个笑话") String message) {
    Prompt prompt = new Prompt(new UserMessage(message));
    return this.chatModel.stream(prompt);
}
  • 使用Prompt对象构造请求体,更加灵活地组织聊天请求的内容。
  • 返回值为Flux<ChatResponse>,包含完整的响应对象,适合需要更多元数据的场景,例如不仅获取聊天内容,还需要了解回复的详细信息。

(四)ChatClient vs OpenAiChatModel

OpenAiChatModelChatClient 是 Spring AI 中用于与大语言模型(LLM)交互的两个核心接口,它们在功能定位和适用场景上有所不同。以下是两者的详细对比:

1. 定义与核心区别

特性OpenAiChatModelChatClient
接口来源org.springframework.ai.openai 包下的具体实现类org.springframework.ai.chat.client 包下的抽象客户端
是否绑定 OpenAI✅ 强绑定 OpenAI 实现❌ 抽象层,支持多提供商(如 Anthropic、Google Vertex、Azure 等)
是否封装底层细节是,面向 OpenAI 的简化封装否,提供统一 API,但允许深度配置
是否支持流式响应✅ 支持 Flux<ChatResponse> 流式输出✅ 支持 Flux<String>Flux<ChatResponse>
是否适合多模型切换❌ 不适合✅ 适合

2. 主要功能对比

1)OpenAiChatModel
功能特点:

  • 直接使用OpenAI官方API模型,与OpenAI的集成紧密,能够充分利用OpenAI提供的各种模型和功能。
  • 提供简洁的同步 (call) 和异步流式 (stream) 方法,方便开发者根据需求选择合适的调用方式。
  • 可以直接传入字符串或构建完整的Prompt对象,灵活地组织聊天请求内容。

适用场景:

  • 应用只对接OpenAI,不考虑其他模型厂商,专注于利用OpenAI的特定优势进行开发。
  • 需要使用OpenAI特有功能,如logprobs, presence_penalty等参数,以满足特定的业务需求。
  • 快速原型开发或小型项目,追求简单易用,希望能够快速搭建起基于OpenAI的聊天功能。
    2)ChatClient
    功能特点:
  • 提供统一的聊天接口,屏蔽底层模型差异,使得开发者可以使用相同的接口与不同的模型提供商进行交互。
  • 支持通用选项(ChatOptions)和特定提供商选项(如OpenAiChatOptions),可以根据不同的模型需求进行灵活配置。
  • 更灵活的链式调用风格,便于扩展和集成多种LLM提供商,为未来的业务扩展提供了便利。

适用场景:

  • 多模型供应商支持(例如未来可能接入Anthropic、Vertex、Azure等),为项目的长期发展和模型切换提供了可能性。
  • 需要统一管理不同模型的请求逻辑,提升系统可维护性,确保在面对多个模型时,系统的架构和代码逻辑仍然清晰可管理。
  • 企业级项目中需要抽象出统一的AI接口层,以便更好地整合AI功能到现有业务系统中。

3. 选型建议

场景描述推荐使用
仅使用 OpenAI,无需多模型兼容OpenAiChatModel
希望未来能平滑迁移到其他模型平台ChatClient
需要使用 OpenAI 特定高级参数(如 logprobs、top_logprobs 等)OpenAiChatModelChatClient + OpenAiChatOptions
构建模块化、可插拔的 AI 服务架构ChatClient
快速开发验证 MVP 功能OpenAiChatModel

五、部署与测试

(一)启动应用

可以直接基于IntelliJ IDEA启动并运行Spring Boot应用程序,也可以进入项目根目录,执行 mvn clean package 进行打包,之后采用 java -jar xxx.jar 命令进行部署运行。运行成功后,应用将在 http://localhost:8881 启动。
在这里插入图片描述

(二)测试接口

你可以使用 Postman、curl 或浏览器访问以下接口:

  • 基础聊天:GET /client/chat?question=你好
  • 带参数聊天:GET /client/chat/generic-options?question=今天天气怎么样
  • 流式聊天:GET /client/chat/stream?question=请写一首诗
  • OpenAI 模型聊天:GET /model/chat?message=帮我写一段自我介绍
  • 流式模型聊天:GET /model/chat/stream?message=请写一段自我介绍

响应效果如下:

在这里插入图片描述

结语

在本篇章中,我们从Java 17、Maven环境准备,获取OpenAI API密钥开始,经POM依赖引入,借助Spring AI相关包实现与OpenAI集成;通过配置文件详解灵活设置参数,利用ChatClient和OpenAiChatModel接口实现多样对话功能;经部署与测试验证应用可用性。至此,完成了完整的OpenAI聊天应用示例。后续可基于此,凭借Spring AI更多特性进一步拓展优化,探索人工智能在实际业务中的更多应用可能,为项目注入强大智能动力,开启更广阔的技术探索之旅。


若您对本文介绍的技术内容感兴趣,希望进一步探索和实践,欢迎关注我,通过私信的方式与我联系,获取完整的项目代码,开启您的 Spring AI 开发之旅。


在这里插入图片描述

🎯🔖更多专栏系列文章:AI大模型提示工程完全指南AI大模型探索之路(零基础入门)AI大模型预训练微调进阶AI大模型开源精选实践AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑

😎 作者介绍:资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索(CSDN博客之星|AIGC领域优质创作者)
📖专属社群:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,回复‘入群’ 即刻上车,获取邀请链接。
💘领取三大专属福利:1️⃣免费赠送AI+编程📚500本,2️⃣AI技术教程副业资料1套,3️⃣DeepSeek资料教程1套🔥(限前500人)
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我们,一起携手同行AI的探索之旅,开启智能时代的大门!

评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寻道AI小兵

🐳 感谢你的巨浪支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值