Spring Boot 集成 Spring AI OpenAI Starter最佳實踐指南
前言
隨著人工智能技術(shù)的快速發(fā)展,將AI能力集成到企業(yè)級應(yīng)用中變得越來越重要。Spring AI作為Spring生態(tài)系統(tǒng)中的新成員,為Java開發(fā)者提供了標(biāo)準(zhǔn)化、開箱即用的AI集成方案。本教程將詳細(xì)介紹如何使用Spring Boot集成Spring AI OpenAI Starter,快速為您的應(yīng)用添加智能對話功能。
一、環(huán)境準(zhǔn)備
1. 技術(shù)要求
- ??JDK??: 17 或更高版本
- ??構(gòu)建工具??: Maven 3.6+ 或 Gradle
- ??Spring Boot??: 3.2+ (推薦最新穩(wěn)定版)
- ??OpenAI賬號??: 需要在OpenAI平臺注冊并獲取API Key
2. 創(chuàng)建Spring Boot項目
您可以通過以下兩種方式之一創(chuàng)建項目:
??方式一:使用start.spring.io??
- 訪問 start.spring.io
- 選擇以下依賴:
- Spring Web
- Spring AI (選擇對應(yīng)版本)
- 其他您可能需要的依賴(如Spring Security等)
??方式二:手動添加依賴??
如果您已有Spring Boot項目,直接在pom.xml中添加以下依賴:
<!-- Spring AI OpenAI Starter -->
<dependency>
<groupId>io.springboot.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0</version> <!-- 請使用最新版本 -->
</dependency>
<!-- Spring Boot Web Starter (如果尚未添加) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>二、配置OpenAI API
1. 獲取OpenAI API Key
- 登錄OpenAI平臺
- 進(jìn)入"API Keys"頁面
- 創(chuàng)建新的API Key并妥善保存
2. 配置application.yml
在src/main/resources/application.yml文件中添加以下配置:
spring:
ai:
openai:
api-key: "sk-your-openai-api-key-here" # 替換為您的實際OpenAI API Key
base-url: "https://api.openai.com/v1" # 默認(rèn)值,通常無需修改
chat:
options:
model: "gpt-4-turbo" # 您想使用的模型,如gpt-3.5-turbo, gpt-4等
temperature: 0.7 # 控制生成文本的隨機(jī)性(0-2)
max-tokens: 500 # 生成的最大token數(shù)??安全建議??:
為了安全起見,建議不要將API Key直接硬編碼在配置文件中,而是使用環(huán)境變量:
spring:
ai:
openai:
api-key: ${OPENAI_API_KEY} # 從環(huán)境變量讀取然后,在運(yùn)行應(yīng)用前設(shè)置環(huán)境變量:
export OPENAI_API_KEY=sk-your-openai-api-key-here
或者在Windows命令提示符中:
set OPENAI_API_KEY=sk-your-openai-api-key-here
三、核心功能實現(xiàn)
1. 基礎(chǔ)對話功能
創(chuàng)建AI控制器
創(chuàng)建一個REST控制器來處理AI對話請求:
import org.springframework.ai.chat.ChatClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai")
public class AIController {
private final ChatClient chatClient;
@Autowired
public AIController(ChatClient chatClient) {
this.chatClient = chatClient;
}
/**
* 基礎(chǔ)對話接口
* @param message 用戶輸入的消息
* @return AI的回復(fù)
*/
@GetMapping("/chat")
public String chat(@RequestParam String message) {
return chatClient.call(message);
}
/**
* 基礎(chǔ)對話接口(POST方式)
* @param userInput 用戶輸入
* @return AI的回復(fù)
*/
@PostMapping("/chat")
public String generateText(@RequestBody String userInput) {
return chatClient.call(userInput);
}
}測試基礎(chǔ)對話
啟動Spring Boot應(yīng)用后,您可以通過以下方式測試:
??方式一:瀏覽器訪問??
http://localhost:8080/ai/chat?message=你好,請介紹一下你自己
??方式二:使用cURL測試??
curl -X GET "http://localhost:8080/ai/chat?message=請寫一個簡單的Java Hello World程序"
??方式三:使用Postman等工具發(fā)送POST請求??
- URL:
http://localhost:8080/ai/chat - Method: POST
- Body: raw, text/plain
- 內(nèi)容: "請解釋Spring Boot的核心特性"
2. 帶上下文的對話
為了讓對話更有連續(xù)性,我們可以實現(xiàn)帶上下文的對話功能:
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.message.Message;
import org.springframework.ai.chat.message.SystemMessage;
import org.springframework.ai.chat.message.UserMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
@RestController
@RequestMapping("/ai")
public class AIContextController {
private final ChatClient chatClient;
// 簡單的上下文存儲(生產(chǎn)環(huán)境應(yīng)使用更可靠的存儲方案)
private List<Message> conversationHistory = new ArrayList<>();
@Autowired
public AIContextController(ChatClient chatClient) {
this.chatClient = chatClient;
// 初始化系統(tǒng)消息
conversationHistory.add(new SystemMessage("你是一個專業(yè)的技術(shù)助手,擅長Java開發(fā)和人工智能相關(guān)知識。"));
}
/**
* 帶上下文的對話
* @param userInput 用戶輸入
* @return AI的回復(fù)
*/
@PostMapping("/chat/context")
public String chatWithContext(@RequestBody String userInput) {
// 添加用戶消息到歷史記錄
conversationHistory.add(new UserMessage(userInput));
// 創(chuàng)建包含歷史記錄的Prompt
Prompt prompt = new Prompt(conversationHistory);
// 調(diào)用AI服務(wù)
String response = chatClient.call(prompt).getResult().getOutput().getContent();
// 添加AI回復(fù)到歷史記錄
conversationHistory.add(new UserMessage(response)); // 注意:這里應(yīng)該是AssistantMessage,但Spring AI可能沒有這個類
return response;
}
/**
* 清除對話上下文
*/
@PostMapping("/chat/context/clear")
public String clearContext() {
conversationHistory.clear();
conversationHistory.add(new SystemMessage("你是一個專業(yè)的技術(shù)助手,擅長Java開發(fā)和人工智能相關(guān)知識。"));
return "對話上下文已清除";
}
}??注意??:上面的代碼中使用了UserMessage來表示AI的回復(fù),這在實際情況中可能不太準(zhǔn)確。Spring AI可能提供了專門的AssistantMessage類,如果沒有,您可能需要自己創(chuàng)建或考慮使用其他方式管理上下文。
3. 高級參數(shù)控制
您可以通過自定義OpenAiChatOptions來更精細(xì)地控制AI的行為:
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.openai.OpenAiChatOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/ai")
public class AIAdvancedController {
private final ChatClient chatClient;
@Autowired
public AIAdvancedController(ChatClient chatClient) {
this.chatClient = chatClient;
}
/**
* 高級參數(shù)控制的對話
* @param message 用戶輸入
* @return AI的回復(fù)
*/
@PostMapping("/chat/advanced")
public String advancedChat(@RequestBody String message) {
// 自定義參數(shù)
OpenAiChatOptions options = OpenAiChatOptions.builder()
.withModel("gpt-4") // 指定模型
.withTemperature(0.3) // 較低的隨機(jī)性,回復(fù)更確定
.withMaxTokens(1000) // 最大生成token數(shù)
// 可以添加更多選項,如topP, frequencyPenalty, presencePenalty等
.build();
// 構(gòu)建 Prompt
Prompt request = new Prompt(message, options);
return chatClient.call(request).getResult().getOutput().getContent();
}
/**
* 使用不同模型的對話
* @param message 用戶輸入
* @param modelName 模型名稱
* @return AI的回復(fù)
*/
@PostMapping("/chat/model/{modelName}")
public String chatWithSpecificModel(@RequestBody String message, @PathVariable String modelName) {
OpenAiChatOptions options = OpenAiChatOptions.builder()
.withModel(modelName) // 動態(tài)指定模型
.withTemperature(0.7)
.withMaxTokens(800)
.build();
Prompt request = new Prompt(message, options);
return chatClient.call(request).getResult().getOutput().getContent();
}
}4. 流式響應(yīng)(Server-Sent Events)
對于長時間運(yùn)行的請求,流式響應(yīng)可以提供更好的用戶體驗:
import org.springframework.ai.chat.StreamingChatClient;
import org.springframework.ai.chat.message.UserMessage;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
@RestController
@RequestMapping("/ai")
public class AIStreamingController {
private final StreamingChatClient streamingChatClient;
@Autowired
public AIStreamingController(StreamingChatClient streamingChatClient) {
this.streamingChatClient = streamingChatClient;
}
/**
* 流式對話接口
* @param message 用戶輸入的消息
* @return 流式的AI回復(fù)
*/
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestParam String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return streamingChatClient.stream(prompt)
.map(content -> content.toString());
}
/**
* 流式對話接口(POST方式)
* @param message 用戶輸入
* @return 流式的AI回復(fù)
*/
@PostMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChatPost(@RequestBody String message) {
Prompt prompt = new Prompt(new UserMessage(message));
return streamingChatClient.stream(prompt)
.map(content -> content.toString());
}
}??測試流式響應(yīng)??:
您可以使用支持SSE的客戶端(如Postman或?qū)iT的SSE客戶端)來測試流式接口,或者創(chuàng)建一個簡單的前端頁面來展示流式效果。
四、進(jìn)階功能:提示詞工程
提示詞工程(Prompt Engineering)是通過精心設(shè)計提示詞來引導(dǎo)AI生成更準(zhǔn)確、更有用內(nèi)容的技術(shù)。
1. 創(chuàng)建自定義提示詞模板
import org.springframework.ai.chat.ChatClient;
import org.springframework.ai.chat.prompt.PromptTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
// 假設(shè)有一個DTO類用于封裝翻譯請求
record TranslationRequest(String sourceLang, String targetLang, String text) {}
@RestController
@RequestMapping("/ai")
public class AIPromptTemplateController {
private final ChatClient chatClient;
@Autowired
public AIPromptTemplateController(ChatClient chatClient) {
this.chatClient = chatClient;
}
/**
* 翻譯功能 - 使用提示詞模板
* @param request 翻譯請求
* @return 翻譯結(jié)果
*/
@PostMapping("/translate")
public String translate(@RequestBody TranslationRequest request) {
// 創(chuàng)建提示詞模板
PromptTemplate promptTemplate = new PromptTemplate("""
將以下{sourceLang}文本翻譯成{targetLang}:
{text}
翻譯結(jié)果:
""");
// 設(shè)置模板變量
promptTemplate.add("sourceLang", request.sourceLang());
promptTemplate.add("targetLang", request.targetLang());
promptTemplate.add("text", request.text());
// 渲染提示詞并調(diào)用AI
return chatClient.call(promptTemplate.render()).getResult().getOutput().getContent();
}
/**
* 代碼生成 - 使用提示詞模板
* @param language 編程語言
* @param description 功能描述
* @return 生成的代碼
*/
@PostMapping("/generate-code")
public String generateCode(@RequestParam String language, @RequestParam String description) {
PromptTemplate promptTemplate = new PromptTemplate("""
用{language}編寫一個程序,實現(xiàn)以下功能: {description}
請?zhí)峁┩暾目蛇\(yùn)行代碼,包括必要的導(dǎo)入語句和主函數(shù)。
代碼應(yīng)該有良好的注釋和結(jié)構(gòu)。
生成的代碼:
""");
promptTemplate.add("language", language);
promptTemplate.add("description", description);
return chatClient.call(promptTemplate.render()).getResult().getOutput().getContent();
}
}2. 測試提示詞模板
??測試翻譯功能??:
curl -X POST -H "Content-Type: application/json" \
-d '{"sourceLang":"English","targetLang":"Chinese","text":"Hello, how are you today?"}' \
http://localhost:8080/ai/translate??測試代碼生成功能??:
curl -X POST "http://localhost:8080/ai/generate-code?language=Java&description=一個簡單的計算器,能夠進(jìn)行加減乘除運(yùn)算" \ -H "Content-Type: application/x-www-form-urlencoded"
五、完整示例項目結(jié)構(gòu)
src/
├── main/
│ ├── java/
│ │ └── com/
│ │ └── example/
│ │ └── aiintegration/
│ │ ├── AiIntegrationApplication.java
│ │ ├── controller/
│ │ │ ├── AIController.java
│ │ │ ├── AIContextController.java
│ │ │ ├── AIAdvancedController.java
│ │ │ └── AIStreamingController.java
│ │ └── dto/
│ │ └── TranslationRequest.java
│ └── resources/
│ ├── application.yml
│ └── static/ # 可選:前端文件
└── test/
└── java/
└── com/
└── example/
└── aiintegration/
└── AiIntegrationApplicationTests.java主應(yīng)用類
package com.example.aiintegration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AiIntegrationApplication {
public static void main(String[] args) {
SpringApplication.run(AiIntegrationApplication.class, args);
}
}六、測試與驗證
1. 啟動應(yīng)用
使用您的IDE或命令行啟動Spring Boot應(yīng)用:
mvn spring-boot:run # 或 gradle bootRun
2. 測試接口
??基礎(chǔ)對話測試??:
- GET請求:
http://localhost:8080/ai/chat?message=你好,介紹一下Spring Boot - 或POST請求到
http://localhost:8080/ai/chat,body為"你好,介紹一下Spring Boot"
??高級參數(shù)測試??:
- POST請求到
http://localhost:8080/ai/chat/advanced,body為"解釋微服務(wù)架構(gòu)的優(yōu)缺點(diǎn)"
??流式響應(yīng)測試??:
- GET請求:
http://localhost:8080/ai/chat/stream?message=給我講一個笑話 - 使用支持SSE的客戶端查看流式效果
??翻譯功能測試??:
curl -X POST -H "Content-Type: application/json" \
-d '{"sourceLang":"English","targetLang":"Chinese","text":"The quick brown fox jumps over the lazy dog."}' \
http://localhost:8080/ai/translate3. 單元測試
創(chuàng)建測試類驗證ChatClient的基本功能:
package com.example.aiintegration;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.ai.chat.ChatClient;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@SpringBootTest
class AiIntegrationApplicationTests {
@Autowired
private ChatClient chatClient;
@Test
void contextLoads() {
}
@Test
void testChatClient() {
String response = chatClient.call("你好,你能做什么?");
System.out.println("AI 回復(fù): " + response);
assertNotNull(response);
}
}七、生產(chǎn)環(huán)境建議
1. 安全最佳實踐
- ??API密鑰管理??:永遠(yuǎn)不要將API密鑰硬編碼在代碼中,使用環(huán)境變量或密鑰管理服務(wù)
- ??訪問控制??:為AI接口添加適當(dāng)?shù)恼J(rèn)證和授權(quán)
- ??輸入驗證??:驗證所有用戶輸入,防止濫用和注入攻擊
- ??速率限制??:實現(xiàn)API速率限制,防止濫用和超額費(fèi)用
2. 性能優(yōu)化
- ??連接池??:配置適當(dāng)?shù)木W(wǎng)絡(luò)連接池參數(shù)
- ??緩存??:對常見問題的AI響應(yīng)實現(xiàn)緩存機(jī)制
- ??異步處理??:對復(fù)雜的AI請求考慮使用異步處理
- ??監(jiān)控??:監(jiān)控AI接口的性能和使用情況
3. 錯誤處理與重試
- 實現(xiàn)健壯的錯誤處理機(jī)制
- 對暫時性錯誤實現(xiàn)重試邏輯
- 監(jiān)控API使用配額和限制
八、總結(jié)
通過本教程,您已經(jīng)學(xué)會了如何使用Spring Boot集成Spring AI OpenAI Starter,為您的應(yīng)用添加強(qiáng)大的AI能力。從基礎(chǔ)對話功能到高級的流式響應(yīng)和提示詞工程,Spring AI提供了豐富的功能來滿足各種AI集成需求。
Spring AI的優(yōu)勢在于其標(biāo)準(zhǔn)化的API設(shè)計,使得您可以輕松切換不同的AI供應(yīng)商而無需大幅修改業(yè)務(wù)代碼。隨著AI技術(shù)的不斷發(fā)展,這種抽象層將為您的應(yīng)用提供更大的靈活性和未來保障。
到此這篇關(guān)于Spring Boot 集成 Spring AI OpenAI Starter最佳實踐指南的文章就介紹到這了,更多相關(guān)Spring Boot Spring AI OpenAI Starter內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java 根據(jù)經(jīng)緯度獲取地址實現(xiàn)代碼
這篇文章主要介紹了 java 根據(jù)經(jīng)緯度獲取地址實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
spring?security?自定義Provider?如何實現(xiàn)多種認(rèn)證
這篇文章主要介紹了spring?security?自定義Provider實現(xiàn)多種認(rèn)證方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
Java java.lang.InstantiationException異常案例詳解
這篇文章主要介紹了Java java.lang.InstantiationException異常案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Netty分布式Server啟動流程服務(wù)端初始化源碼分析
本章主要講解server啟動的關(guān)鍵步驟,?讀者只需要了解server啟動的大概邏輯,?知道關(guān)鍵的步驟在哪個類執(zhí)行即可,?并不需要了解每一步的運(yùn)作機(jī)制,?之后會對每個模塊進(jìn)行深度分析2022-03-03
利用Intellij Idea連接遠(yuǎn)程服務(wù)器實現(xiàn)遠(yuǎn)程上傳部署功能
大家在使用Intellij Idea開發(fā)程序的時候,是不是需要部署到遠(yuǎn)程SSH服務(wù)器運(yùn)行呢,當(dāng)然也可以直接在idea軟件內(nèi)容實現(xiàn)配置部署操作,接下來通過本文給大家分享利用Intellij Idea連接遠(yuǎn)程服務(wù)器實現(xiàn)遠(yuǎn)程上傳部署功能,感興趣的朋友跟隨小編一起看看吧2021-05-05
Java調(diào)用CXF WebService接口的兩種方式實例
今天小編就為大家分享一篇關(guān)于Java調(diào)用CXF WebService接口的兩種方式實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Spring Boot中的@ConfigurationProperties注解解讀
在SpringBoot框架中,@ConfigurationProperties注解是處理外部配置的強(qiáng)大工具,它允許開發(fā)者將配置文件中的屬性自動映射到Java類的字段上,實現(xiàn)配置的集中管理和類型安全,通過定義配置類并指定前綴,可以將配置文件中的屬性綁定到Java對象2024-10-10

