在 Spring Boot Java 框架中整合 OpenAI 的 ChatGPT API 和 Spring AI.
目標:
我在今天的文章中將探討如何在 Spring Boot 應用程式中整合 OpenAI ChatGPT API 和 Spring AI. 我們的目標是建立一個 Spring Boot 應用程式, 該應用程式可以使用 OpenAI ChatGPT API 和 Spring AI 生成對所提供 Prompt 的響應.
什麼是 ChatGPT?
ChatGPT 是生成式AI的一種形式, 使用者可以輸入 Prompt , 並收到由AI建立的類人的影象, 文字或影片形式的輸出.
ChatGPT 是 OpenAI 的一部分, 它利用 GPT-3.5, GPT-4 等各種模型來根據給定的 Prompt 生成回覆.
什麼是 ChatGPT 中的 Prompt ?
ChatGPT Prompt 是你輸入 AI 介面以獲取回覆的指令或詢問. Prompt 由關鍵字和短語組成, 旨在引發回覆.
例如, 如果你向 ChatGPT 提出一個問題或指令, 它就會像對話一樣做出迴應.
讓我們來探索一下 OpenAI ChatGTP API:
我們將利用聊天補全建立API (POST api.openai.com/v1/chat/com…)根據給定的 Prompt 生成回覆.
在 上面的連結中, 你可以看到 CURL API URL 和 API 輸入.
下面是我提出的問題 Spring Boot 是什麼?
curl https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d '{ "model": "gpt-3.5-turbo", "messages": [ { "role": "system", "content": "What is springboot?" } ], "temperature": 1 "max_tokens" :256 }'
分析該 API 的基本請求引數:
model: 該引數指定了接收請求的模型版本. 有不同的模型版本可供選擇, 在本任務中, 我們將使用
gpt-3.5-turbo
模型, 這是公眾可訪問的最新版本.messages: 每條訊息都有兩個重要部分:
role
和content
.role
說明資訊是來自使用者還是助手.content
是實際的資訊文字.temperature: 預設設定為 1, 範圍從 0 到 2. 數值越大, 響應越隨機, 數值越小, 響應越集中, 可預測.
max_tokens: 通常沒有限制, 但你可以使用此設定來決定回覆中單詞或符號的最大數量. 這有助於管理超長的響應並控制成本.
如果在沒有將 OpenAI API Key 作為 bearer token 的情況下嘗試 Postman 中前面提到的請求, 就會遇到驗證失敗. 要驗證對 OpenAI ChatGPT 補全 API 的訪問, 將 OpenAI API Key 作為 bearer token 至關重要.
建立 OpenAI Key:
登入你的 ChatGPT 賬戶並建立 OpenAI API Key, 可以點選這裏深度.
建立 OpenAI Key
將 OpenAI ChatGTP API 與 Spring Boot 整合:
這裏是我的專案的結構:
專案結構
這裏是使用的依賴關係:
maven 依賴項
建立 ChatRequest
, ChatResponse
和 Message 類:
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class ChatRequest { private String model; private List<Message> messages; private int n; private double temperature; } --------------------------------------------------------------------------- @Data @AllArgsConstructor @NoArgsConstructor public class ChatResponse { private List<Choice> choices; @Data @AllArgsConstructor @NoArgsConstructor public static class Choice { private int index; private Message message; } } --------------------------------------------------------------------------- @Data @NoArgsConstructor @AllArgsConstructor public class Message { private String role; private String content; }
將這些配置新增到 application.properties
檔案中:
spring.application.name=openai-java server.servlet.context-path=/openai #OpenAI openai.model=gpt-3.5-turbo openai.api.key=REPLACE_YOUR_KEY openai.api.url=https://api.openai.com/v1/chat/completions openai.max-completions=1 openai.temperature=0
RestTemplate
配置:
在配置包中建立一個名為 ChatGPTConfiguration
的類:
@Configuration public class ChatGPTConfiguration { @Value("${openai.api.key}") private String apiKey; @Bean RestTemplate restTemplate() { RestTemplate restTemplate = new RestTemplate(); restTemplate.getInterceptors().add((request, body, execution) -> { request.getHeaders().add("Authorization", "Bearer " + apiKey); return execution.execute(request, body); }); return restTemplate; } }
@Value("${openai.api.key}")
註解從應用程式的屬性檔案中獲取資訊. 具體來說, 它會從檔案中獲取 OpenAI API Key.
RestTemplate
資料類定義了一個用 Java 發出 HTTP 請求的工具. 它為 RestTemplate
配置了攔截器. 基本上, 每當 RestTemplate
傳送請求時, 攔截器都會用Authorization
header 對其進行補充. 該標頭包括一個從apiKey
變數中獲取的 bearer token. 通常, 這種設定用於驗證對需要 token
才能訪問的應用程式介面的請求.
API Controller:
現在, 我們可以繼續製作 REST 控制器. 它將使用我們在 RestTemplate
中完成的設定, 向 API 傳送請求並管理我們得到的響應.
在 controller
包下建立一個類 ChatAPIController
:
@RestController @RequestMapping("/api/vi") @Slf4j public class ChatAPIController { @Autowired private RestTemplate restTemplate; @Value("${openai.model}") private String model; @Value("${openai.max-completions}") private int maxCompletions; @Value("${openai.temperature}") private double temperature; @Value("${openai.api.url}") private String apiUrl; @PostMapping("/chat") public ChatResponse chat(@RequestParam("prompt") String prompt) { ChatResponse chatResponse=null; List<Message> ChatMessages = new ArrayList<>(); ChatRequestBuilder request = ChatRequest.builder(); try { ChatMessages.add(new Message("user", prompt)); request .model(model) .messages(ChatMessages) .n(maxCompletions) .temperature(temperature); chatResponse = restTemplate.postForObject(apiUrl, request.build(), ChatResponse.class); }catch(Exception e) { log.error("error : "+e.getMessage()); } return chatResponse; } }
編碼部分已經完成. 現在, 我們將著手測試應用程式.
Postman 中的 api 測試
現在, 你可以看到我從 OpenAI API 收到了對我所提問題的回覆.
使用 OpenAI ChatGPT 補全 API 有哪些可能性?
以下是使用 OpenAI 補全 API 和 ChatGPT 等模型可以完成的一些任務:
建立聊天機器人: 製作能像人類一樣交談的聊天機器人. 它們可以自然地回答問題或與使用者聊天.
幫助客戶支援: 建立自動幫助客戶的系統, 使支援更快, 更高效.
自動生成內容: 自動撰寫文章, 故事或產品說明, 為內容建立者節省時間.
翻譯語言: 製作可在不同語言間翻譯文字的工具, 幫助人們在全球範圍內進行交流.
建立個人助理: 建立虛擬助理來設定提醒事項, 安排約會或回答問題.
教育工具: 協助學生完成家庭作業或講解, 使學習更加個性化.
管理內容: 自動過濾網站或社交媒體上的不當內容.
市場研究: 分析大量文字資料, 為企業尋找趨勢或見解.
以上是你可以使用 OpenAI 補全 API 和 ChatGPT 等模型所做的一些示例. 這些模型在教育, 醫療保健, 客戶服務和寫作等許多領域都很有用. 請記住, 它們生成的文字質量會根據你使用它們的目的和你提供給它們的資訊而有所不同.
使用 Spring AI 將生成式AI整合到 Spring Boot 應用程式中:
Spring AI:將 AiClient 與 Spring Boot 應用程式相結合
Spring AI 計劃, 其目標是簡化建立具有AI功能的應用程式的過程, 消除 Spring Boot java 中不必要的複雜性.
Spring AI 提供以下功能
支援領先的AI模型提供商, 包括 OpenAI, 微軟, 亞馬遜, 谷歌和 Huggingface.
Spring AI 支援聊天和文字生成影象等不同型別的模型. 更多型別的模型正在開發中.
針對聊天和嵌入模型, 為各種AI提供商提供了通用的 API. 你可以選擇同步和流 API 選項. 此外, 訪問特定模型的功能也很方便.
將AI模型輸出對映到 POJO 中.
支援所有主要的向量資料庫提供商, 如 Azure Vector Search, Chroma, Milvus, Neo4j, PostgreSQL/PGVector, PineCone, Qdrant, Redis 和 Weaviate.
針對 AI 模型和向量儲存的 Spring Boot 自動配置和啟動器.
注意:
Spring-AI 非常新, 目前還沒有穩定版本, 最新版本為為v1.0.0-M3. 不過, 預計將來會發布穩定版本.
Spring AI 引入了
AiClient
介面, 並實現了 OpenAI 和 Azure 的 OpenAI.
讓我們開始編碼...
pom.xml
中需要的依賴項:
要使用 Spring AI, 請新增以下資源庫. 請注意, 這是一個實驗專案, 目前只能訪問 SNAPSHOT 版本.
OpenAI 的 SNAPSHOT 倉庫
要整合 OpenAI, 可新增以下依賴關係:
maven 依賴項
你也可以選擇使用 Azure OpenAI, 而不是 OpenAI, 方法是加入以下依賴關係:
<dependency> <groupId>org.springframework.experimental.ai</groupId> <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId> <version>0.2.0-SNAPSHOT</version> </dependency>
在這篇文章中, 我使用了OpenAI.
將這些配置新增到 application.properties
檔案中:
#SpringAI spring.ai.openai.api-key=REPLACE_WITH_YOUR_API_KEY
在 service 包中建立 AIServiceHelper
:
@Service @Slf4j public class AIServiceHelper { @Autowired AiClient aiClient; @Value("${spring.ai.openai.api-key}") private String apiKey; public String chat(String question){ PromptTemplate promptTemplate = null; try { promptTemplate = new PromptTemplate(question); }catch(Exception e) { log.error("error : "+e.getMessage()); } return this.aiClient.generate(promptTemplate.create()).getGeneration().getText(); } public String generateDocument(String topic) { PromptTemplate promptTemplate =null; try { promptTemplate = new PromptTemplate(""" Generate document content for a {topic}. It should be at least two pages long and include comprehensive information covering all aspects of the topic, including background information, current trends or developments, relevant statistics or data, key concepts or theories, potential challenges, and future outlook. The document should be well-structured with clear headings and sub-headings, and it should provide an in-depth analysis that offers insights and engages the reader effectively. """); promptTemplate.add("topic", topic); }catch(Exception e) { log.error("error : "+e.getMessage()); } return this.aiClient.generate(promptTemplate.create()).getGeneration().getText(); }
讓我們一步步地分析一下程式碼.
DI: 該類使用 @Autowired 註解引入了
AiClient
介面的例項.AiClient
是與 OpenAI 服務對話的一種方式.chat
方法: 該方法用於使用AI模型為給定問題生成回覆. 它首先使用提供的問題建立一個 Prompt 模板. 然後, 利用AI客戶端根據 Prompt 模板生成回覆. 最後, 它會返回生成的回覆文字. Prompt 模板建立過程中出現的任何錯誤都會被記錄下來.generateDocument
方法: 該方法使用AI模型為給定話題生成文件內容. 它會建立一個帶有話題佔位符和文件內容說明的 Prompt 模板. 然後, 它將佔位符{topic}
替換為實際提供的話題. 最後, 它利用AI客戶端根據 Prompt 模板生成文件內容, 並返回生成內容的文字. Prompt 模板建立過程中出現的任何錯誤都會被記錄下來.
在 controller 包內建立 SpringAIController
:
@RestController @RequestMapping("/api/v1") public class SpringAIController { @Autowired AIServiceHelper aiService; @GetMapping("/qa") public String chat(@RequestParam String question) { return aiService.chat(question); } @GetMapping("/docuGenAI") public String generateDocument(@RequestParam String topic) { return aiService.generateDocument(topic); }
編碼部分已經完成. 現在, 我們將著手測試應用程式.
在 controller 器類中, 我定義了兩個 API:
API
api/v1/qa
: 透過提供AI服務生成的響應來處理問答請求.
API
api/v1/docuGenAI
: 使用AI服務根據提供的話題生成文件內容.
大家可以看到, 我在 url 中透過輸入了一些英文或者中文問題, 搭建的應用程式成功的給予了我返回, 簡直太完美了!
總結一下
在今天的文章中, 主要透過 Spring Boot 推薦了一個十分簡易的應用程式, 透過目前尚未正式發版的 Spring AI 整合了 OpenAI 的 ChatGPT API, 搭建了一個智慧問答小程式. 透過該小程式, 探索了 Spring AI 推薦 AI 應用的無限可能! 當然, 能夠接入的 AI API 包括但不限於 OpenAI 的 ChatGPT API.
作者:bytebeats
連結:https://juejin.cn/post/7434466695828209690