系列篇章💥
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
OpenAiChatModel
和 ChatClient
是 Spring AI 中用于与大语言模型(LLM)交互的两个核心接口,它们在功能定位和适用场景上有所不同。以下是两者的详细对比:
1. 定义与核心区别
特性 | OpenAiChatModel | ChatClient |
---|---|---|
接口来源 | 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 等) | ✅ OpenAiChatModel 或 ChatClient + 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的探索之旅,开启智能时代的大门!