ChatGPT 值得深化运用的方面之一是它的引擎,它不仅为依据Web的谈天机器人供给动力,还能够集成到Java应用程序中。

▌Budget Journey App

想象一下,你想去一个城市游览而且设置好了预算,你应该怎么分配你的钱并让你的游览难忘?这是能够托付给 OpenAI 引擎的一个很好的问题。

咱们经过构建一个名为 BudgetJourney 的简略Java应用程序来协助用户充分享受他们的游览。

这个APP能够引荐多个城市内的参观点并附上相应的预算规划。

BudgetJourney 应用程序的架构如下所示:

用Java创建可扩展的OpenAI GPT应用程序

  1. 用户打开在Vaadin上运行的 BudgetJourney 页面;

  2. 当用户想要取得针对特定城市和预算的主张时,Vaadin 会连接到 Spring Boot 后端;

  3. Spring Boot 连接到一个 YugabyteDB 数据库实例,以检查是否已经有任何关于恳求的城市和预算的主张。如果数据已经在数据库中,则将呼应发送回给用户;

  4. 不然,Spring Boot 连接到 OpenAI API 以从神经网络获取主张。呼应存储在 YugabyteDB 中以备将来参考并发回给用户。

现在,让咱们看看应用程序怎么与 Open AI 引擎通讯(第 4 步),以及怎么运用数据库(第 3 步)使解决方案具有可扩展性和成本效益。

▌OpenAI Java 库

OpenAI 引擎经过 HTTP API 进行查询。你需求创建一个帐户,获取你的令牌(即API密钥),并在向其间一个 OpenAI 模型发送恳求时运用该令牌。

OpenAI 布景下的模型是在大型数据集上训练的核算结构,用于识别模式、做出猜测或依据输入数据执行特定任务。现在,该服务支持多种模型,这些模型能够理解并生成自然语言、代码、图像或将音频转换为文本。

咱们的 BudgetJourney 应用程序运用 GPT-3.5 模型,该模型能够理解并生成自然语言或代码。该应用程序要求模型在考虑预算约束的一起,提出城市内的几个参观点主张。然后,模型以 JSON 格局回来主张。

开源的 OpenAI Java 库实现了 GPT-3.5 HTTP API ,能够经过定义明确的 Java 轻松地与服务进行通讯。

以下是您怎么开端运用该库:

  • 将最新的 OpenAI Java 工件增加到您的 pom.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));

简略的!接下来,让咱们看看怎么经过 OpenAiService 实例运用 GPT-3.5 模型。

▌向 GPT-3.5 模型发送提示

你能够经过发送文本提示来与 OpenAI 模型进行通讯,告诉模型你希望得到什么结果。当你的阐明明晰并包含示例时,模型体现最佳。

要为 GPT-3.5 模型构建提示,你能够运用 OpenAI Java 库的 ChatCompletionRequest 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进行呼应后,不要增加任何其他内容。

虽然冗长且需求优化,但此体系音讯传达了所需的操作:以最大的预算利用率主张多个爱好点,并以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 转换为不同参观点的列表,然后向用户显示:

用Java创建可扩展的OpenAI GPT应用程序

注:GPT-3.5 模型是依据2021年9月的数据集训练的。因而,它不能供给100%精确和相关的游览主张。但是,这种不精确性能够在 OpenAI 插件的协助下得到改善,这些插件能够让模型拜访实时数据。例如,一旦 OpenAI 的 Expedia 插件作为 API 公开可用,就能够进一步改善 BudgetJourney 应用程序。

▌运用数据库扩展

正如你所看到的,将神经网络集成到 Java 应用程序中并以相似于其他第三方 API 的办法与之通讯是很简略的。你还能够调整 API 行为,例如增加所需的输出格局。

但是,这仍然是一个第三方 API ,它会对你的每个恳求收取费用。你发送的提示越多,时刻越长,你付出的费用就越多。

此外,模型处理你的提示需求时刻。例如,BudgetJourney 应用程序可能需求10-30秒才能从 OpenAI 收到完好的引荐列表。这可能有些过头了,尤其是当不同的用户发送相似的提示时。

为了使 OpenAI GPT 应用程序具有可扩展性,值得将模型呼应存储在数据库中,需求数据库:

  1. 减少对OpenAI API的恳求量,从而下降相关成本;

  2. 经过从数据库回来曾经处理过(或预加载过)的引荐,以下降为用户恳求供给服务的延迟。

BudgetJourney 应用程序运用的是 YugabyteDB 数据库,由于它能够在全球范围内扩展并将模型呼应存储在用户位置附近。

运用地舆分区部署模式,你能够拥有一个单一的数据库集群,其间数据自动固定到不同的地舆位置,并从不同的地舆区域以低延迟供给服务。

用Java创建可扩展的OpenAI GPT应用程序

自定义地舆分区列(上图中的“region”列)答应数据库决议方针行的位置。

例如,来自欧洲的数据库节点已经存储了预算为1500美元的迈阿密游览的主张。接下来,假设来自欧洲的用户想要去迈阿密并花费1500美元。在这种情况下,应用程序能够经过直接从同一地舆位置的数据库节点获取主张,在几毫秒内做出呼应。

BudgetJourney 应用程序运用以下 JPA 存储库从 YugabyteDB 集群获取主张:​​​​​​​

@Repositorypublic 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);}

如下所示:​​​​​​​

@Entitypublic 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 的谈天机器人是展示 OpenAI 引擎功用的绝佳办法。探索引擎强壮的模型,并开端构建新式Java应用程序。只要保证以可扩展的办法进行即可!

作者:Denis Magda

更多内容请关注公号“云原生数据库”