切換語言為:簡體
將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

  • 爱糖宝
  • 2024-11-08
  • 2041
  • 0
  • 0

在 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 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

讓我們來探索一下 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: 每條訊息都有兩個重要部分: rolecontent. 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 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

建立 OpenAI Key

將 OpenAI ChatGTP API 與 Spring Boot 整合:

這裏是我的專案的結構:

將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

專案結構

這裏是使用的依賴關係:

將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

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;
 }
}

編碼部分已經完成. 現在, 我們將著手測試應用程式.

將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

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 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

OpenAI 的 SNAPSHOT 倉庫

要整合 OpenAI, 可新增以下依賴關係:

將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

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服務生成的響應來處理問答請求.

將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

  • API api/v1/docuGenAI: 使用AI服務根據提供的話題生成文件內容.

將 OpenAI 的 ChatGPT API 與 Spring Boot 中的 Spring AI 相整合

大家可以看到, 我在 url 中透過輸入了一些英文或者中文問題, 搭建的應用程式成功的給予了我返回, 簡直太完美了!

總結一下

在今天的文章中, 主要透過 Spring Boot 推薦了一個十分簡易的應用程式, 透過目前尚未正式發版的 Spring AI 整合了 OpenAI 的 ChatGPT API, 搭建了一個智慧問答小程式. 透過該小程式, 探索了 Spring AI 推薦 AI 應用的無限可能! 當然, 能夠接入的 AI API 包括但不限於 OpenAI 的 ChatGPT API.


作者:bytebeats
連結:https://juejin.cn/post/7434466695828209690

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.