天天看點

在 Java 中建立可擴充的 OpenAI GPT 應用程式

作者:科技狠活與軟體技術

關注留言點贊,帶你了解最流行的軟體開發知識與最新科技行業趨勢。

在本教程中,了解如何通過僅在必要時向引擎發送提示,以可擴充的方式将 ChatGPT 引擎內建到您的 Java 應用程式中。

ChatGPT 更值得注意的方面之一是它的引擎,它不僅為基于 Web 的聊天機器人提供動力,還可以內建到您的Java應用程式中。

無論您喜歡閱讀還是觀看,讓我們回顧一下如何通過僅在必要時向引擎發送提示,以可擴充的方式在您的 Java 項目中開始使用 OpenAI GPT 引擎:

預算之旅應用程式

想象一下,您想參觀一個城市并且有一個特定的預算。您應該如何花錢并讓您的旅行難忘?這是委托給 OpenAI 引擎的一個很好的問題。

讓我們通過建構一個名為BudgetJourney的簡單 Java 應用程式來幫助使用者充分利用他們的旅行。該應用程式可以建議城市内的多個興趣點,以适應特定的預算限制。

BudgetJourney 應用程式的架構如下所示:

在 Java 中建立可擴充的 OpenAI GPT 應用程式

BudgetJourney 應用程式

使用者打開在Vaadin上運作的 BudgetJourney Web UI 。

當使用者想要獲得針對特定城市和預算的建議時,Vaadin 會連接配接到Spring Boot後端。

Spring Boot 連接配接到一個YugabyteDB 資料庫執行個體,以檢查是否已經有任何關于請求的城市和預算的建議。如果資料已經在資料庫中,則将響應發送回給使用者。

否則,Spring Boot 連接配接到 OpenAI API 以從神經網絡擷取建議。響應存儲在 YugabyteDB 中以備将來參考并發回給使用者。

現在,讓我們看看應用程式如何與 Open AI 引擎通信(第 4 步),以及如何使用資料庫(第 3 步)使解決方案具有可擴充性和成本效益。

OpenAI Java 庫

可以通過HTTP API查詢 OpenAI 引擎。您需要建立一個帳戶,擷取您的令牌(即 API 密鑰)并在向其中一個 OpenAI 模型發送請求時使用該令牌。

OpenAI 上下文中的模型是一種在大型資料集上訓練的計算結構,用于識别模式、進行預測或根據輸入資料執行特定任務。目前,該服務支援多種模型,可以了解和生成自然語言、代碼、圖像,或将音頻轉換為文本。

我們的 BudgetJourney 應用程式使用GPT-3.5 模型,該模型可以了解并生成自然語言或代碼。該應用程式要求模型在考慮預算限制的同時建議城市内的幾個興趣點。該模型然後以 JSON 格式傳回建議。

開源OpenAI Java 庫實作了 GPT-3.5 HTTP API,可以通過定義明确的 Java 抽象輕松地與服務進行通信。以下是您如何開始使用該庫:

将最新的 OpenAI Java 工件添加到您的pom.xml檔案中。

XML

<dependency>

<groupId>com.theokanning.openai-gpt3-java</groupId>

<artifactId>service</artifactId>

<version>${version}</version>

</dependency>

OpenAiService通過為應用程式和 OpenAI 引擎之間的請求提供令牌和逾時來建立該類的執行個體。

OpenAiService openAiService = new OpenAiService(

apiKey, Duration.ofSeconds(apiTimeout));

簡單的!接下來,讓我們看看如何通過執行個體使用 GPT-3.5 模型OpenAiService。

向 GPT-3.5 模型發送提示

您可以通過發送文本提示來與 OpenAI 模型進行通信,這些文本提示告訴您期望模型做什麼。當您的說明清晰并包含示例時,模型表現最佳。

要為 GPT-3.5 模型建構提示,您可以使用ChatCompletionRequestOpenAI Java 庫的 API:

ChatCompletionRequest chatCompletionRequest = ChatCompletionRequest

.builder()

.model(“gpt-3.5-turbo”)

.temperature(0.8)

.messages(

List.of(

new ChatMessage("system", SYSTEM_TASK_MESSAGE),

new ChatMessage("user", String.format("I want to visit %s and have a budget of %d dollars", city, budget))))

.build();

model(“gpt-3.5-turbo”)是 GPT-3.5 模型的優化版本。

temperature(...)控制模型響應中預期的随機性和創造性。例如,較高的值(如 0.8)将使輸出更加随機,而較低的值(如 0.2)将使輸出更具确定性。

messages(...)是對模型的實際說明或提示。有“system”訓示模型以某種方式運作的消息,“assistant”存儲以前響應的消息,以及“user”攜帶使用者請求和詢問的消息。

BudgetJourney 應用程式SYSTEM_TASK_MESSAGE的外觀如下所示:

你是一個以 JSON 格式響應的 API 伺服器。别說别的了。僅響應 JSON。

使用者将為您提供城市名稱和可用預算。在考慮該預算時,您必須建議一個參觀地點清單。

将 30% 的預算配置設定給餐廳和酒吧。再配置設定 30% 用于表演、遊樂園和其他觀光活動。将剩餘的預算用于購物。請記住,使用者必須花費預算的 90-100%。

以 JSON 格式響應,包括名為“places”的數組。數組的每一項都是另一個 JSON 對象,其中包括作為文本的“place_name”、作為文本的“place_short_info”和作為數字的“place_visit_cost”。

使用 JSON 響應後不要添加任何其他内容。

在 Java 中建立可擴充的 OpenAI GPT 應用程式

盡管冗長且需要優化,但此系統消息傳達了所需的操作:以最大預算使用率建議多個興趣點并以 JSON 格式提供響應,這對于應用程式的其餘部分至關重要。

ChatCompletionRequest建立提供系統和使用者消息以及其他參數的提示 ( ) 後,您可以通過OpenAiService執行個體發送它:

OpenAiService openAiService = … //created earlier

StringBuilder builder = new StringBuilder();

openAiService.createChatCompletion(chatCompletionRequest)

.getChoices().forEach(choice -> {

builder.append(choice.getMessage().getContent());

});

String jsonResponse = builder.toString();

然後該jsonResponse對象由其餘的應用程式邏輯進一步處理,這些邏輯準備興趣點清單并在 Vaadin 的幫助下顯示它們。

例如,假設使用者正在通路東京并希望在該市花費最多 900 美元。該模型将嚴格按照我們從系統消息中擷取的指令進行響應,并使用以下 JSON 進行響應:

{

"places": [

{

"place_name": "Tsukiji Fish Market",

"place_short_info": "Famous fish market where you can eat fresh sushi",

"place_visit_cost": 50

},

{

"place_name": "Meiji Shrine",

"place_short_info": "Beautiful Shinto shrine in the heart of Tokyo",

"place_visit_cost": 0

},

{

"place_name": "Shibuya Crossing",

"place_short_info": "Iconic pedestrian crossing with bright lights and giant video screens",

"place_visit_cost": 0

},

{

"place_name": "Tokyo Skytree",

"place_short_info": "Tallest tower in the world, offering stunning views of Tokyo",

"place_visit_cost": 30

},

{

"place_name": "Robot Restaurant",

"place_short_info": "Unique blend of futuristic robots, dancers, and neon lights",

"place_visit_cost": 80

},

// More places

]}

然後将此 JSON 轉換為不同興趣點的清單。然後顯示給使用者:

不同的興趣點

注意: GPT-3.5 模型是在 2021 年 9 月的資料集上訓練的。是以,它無法提供 100% 準确且相關的旅行推薦。然而,這種不準确性可以在 OpenAI 插件的幫助下得到改善,這些插件使模型能夠通路實時資料。例如,一旦OpenAI 的 Expedia 插件作為 API 公開可用,您就可以進一步改進此 BudgetJourney 應用程式。

使用資料庫擴充

如您所見,将神經網絡內建到您的 Java 應用程式中并以類似于其他第 3 方 API 的方式與其通信非常簡單。您還可以調整 API 行為,例如添加所需的輸出格式。

但是,這仍然是一個 3rd 方 API,它會為每個請求向您收費。您發送的提示越多,提示時間越長,您支付的費用就越多。沒有什麼是免費的。

另外,模型需要時間來處理您的提示。例如,BudgetJourney 應用程式可能需要 10-30 秒才能收到來自 OpenAI 的完整推薦清單。這可能有點矯枉過正,尤其是當不同的使用者發送相似的提示時。

為了使 OpenAI GPT 應用程式具有可擴充性,值得将模型響應存儲在資料庫中。該資料庫允許您:

減少對 OpenAI API 的請求量,進而減少相關成本。

通過從資料庫傳回先前處理(或預加載)的建議,以低延遲服務使用者請求。

BudgetJourney 應用程式使用 YugabyteDB 資料庫,因為它能夠在全球範圍内擴充并将模型響應存儲在靠近使用者位置的位置。使用地理分區部署模式,您可以擁有一個單一的資料庫叢集,資料自動固定到不同的地理位置并以低延遲提供服務。

在 Java 中建立可擴充的 OpenAI GPT 應用程式

地理分區的 YugabyteDB 叢集

自定義地理分區列(“region”上圖中的列)讓資料庫決定目标行位置。例如,來自歐洲的資料庫節點已經存儲了預算為 1500 美元的邁阿密旅行的建議。接下來,假設來自歐洲的使用者想要去邁阿密并花費該金額。在這種情況下,應用程式可以通過直接從同一地理位置的資料庫節點擷取建議,在幾毫秒内做出響應。

BudgetJourney 應用程式使用以下 JPA 存儲庫從 YugabyteDB 叢集擷取推薦:

@Repository

public interface CityTripRepository extends JpaRepository<CityTrip, Integer> {

@Query("SELECT pointsOfInterest FROM CityTrip WHERE cityName=?1 and budget=?2 and region=?3")

String findPointsOfInterest(String cityName, Integer budget, String region);

}

類Entity如下所示:

@Entity

public class CityTrip {

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "landmark_generator")

@SequenceGenerator(name = "landmark_generator", sequenceName = "landmark_sequence", allocationSize = 5)

int id;

@NotEmpty

String cityName;

@NotNull

Integer budget;

@NotEmpty

@Column(columnDefinition = "text")

String pointsOfInterest;

@NotEmpty

String region;

//The rest of the logic

}

是以,您需要做的就是先調用資料庫,如果相關建議在資料庫中尚不可用,則傳回到 OpenAI API。随着您的應用程式越來越受歡迎,越來越多的本地推薦将可用,随着時間的推移,這種方法将變得更具成本效益。

總結

ChatGPT 基于 Web 的聊天機器人是展示 OpenAI 引擎功能的絕佳方式。探索引擎的強大模型并開始建構新型 Java 應用程式。隻要確定您以可擴充的方式進行即可!