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

news2024/9/19 2:36:21

ChatGPT 值得深入使用的方面之一是它的引擎,它不仅为基于Web的聊天机器人提供动力,还可以集成到Java应用程序中。 

Budget Journey App

想象一下,你想去一个城市旅行并且设置好了预算,你应该如何分配你的钱并让你的旅行难忘?这是可以委托给 OpenAI 引擎的一个很好的问题。

我们通过构建一个名为 BudgetJourney 的简单Java应用程序来帮助用户充分享受他们的旅行。

这个APP可以推荐多个城市内的观光点并附上相应的预算规划。

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

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 转换为不同观光点的列表,然后向用户显示:

注: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 数据库,因为它能够在全球范围内扩展并将模型响应存储在用户位置附近。

使用地理分区部署模式,你可以拥有一个单一的数据库集群,其中数据自动固定到不同的地理位置,并从不同的地理区域以低延迟提供服务。

自定义地理分区列(上图中的“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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/458856.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

巧用千寻位置GNSS软件|逐点放样应用技巧

线路逐点放样是针对施工需要和设计要求&#xff0c;对线路 20、50、100间隔的整桩距或整桩号的特定桩位进行连续放样设定的程序。运用千寻位置GNSS软件如何快速实现线路逐点放样呢&#xff1f;让我们一探究竟吧&#xff01; 点击【测量】->【线路逐点放样】&#xff0c;选择…

CMake : Linux 搭建开发 - g++、gdb

目录 1、环境搭建 1.1 编译器 GCC&#xff0c;调试器 GDB 1.2 CMake 2、G 编译 2.1 编译过程 编译预处理 *.i 编译 *.s 汇编 *.o 链接 bin 2.2 G 参数 -g -O[n] -l、-L -I -Wall、-w -o -D -fpic 3、GDB 调试器 3.1 调试命令参数 4、CMake 4.1 含义 4.2…

npm全局包及项目包的讲解与方法

看图可知 安装全局包和项目包 我们通过npm install 命令来安装包&#xff0c;简单说就是把包从npm的官网&#xff08;或者是指定的镜像源&#xff09;下载到我们自己的电脑中。那具体这个包下载到哪里了&#xff0c;还是有一点讲究的。 分成两类&#xff1a; 全局安装: 包被…

IntelliJ IDEA 新建安卓项目失败,网上的各种教程都不管用的看向这里!!!

目录 1、出现的问题&#xff1a; 2、解决办法&#xff1a; 1&#xff09;新建项目 2&#xff09;修改设置 3、注意 备注&#xff1a; 目的&#xff1a;最近开发机器人远程控制需要一个安卓app&#xff0c;之前是自己做了个H5app来用的&#xff0c;H5不是很稳定&#xff0c;所…

Kotlin基础

Kotlin基础 一.Kotlin介绍1.诞生2.Kotlin与JVM3.为什么学习kotlin&#xff1f;4.Kotlin跨平台特性 二.变量常量类型条件语句函数1.声明变量2.内置数据类型3.只读变量4.类型推断5.编译时常量6.条件语句&#xff1a;表达式7.String模板8.函数 三.匿名函数函数类型高阶函数&#x…

关于OKD(OpenShift)中组件资源介绍和命令行操作的一些笔记

写在前面 参加考试&#xff0c;会陆续分享一些 OpenShift 的笔记博文内容为 openshift 常见 API 资源对象介绍&#xff0c;包括所特有的 Route&#xff0c;IS&#xff0c;DC&#xff0c;BC 等。学习环境为 openshift v3 的版本&#xff0c;有些旧这里如果专门学习 openshift &a…

第一节 ogre源码编译与安装

一. 电脑环境要求 本机使用的编译环境为&#xff1a;系统为Windows 10&#xff0c; Microsoft Visual Studio Enterprise 2019&#xff0c;版本 16.11.26&#xff0c;cmake-3.18.6-win64-x64 这些为基本的操作环境自己可以从网上下载安装。 二. 依赖环境下载 DirectX SDK &a…

Blade项目的IDE支持

Blade是一个C/C构建工具&#xff0c;详细介绍见Blade构建工具。虽然功能强大&#xff0c;但是缺少IDE支持。本文介绍如何在Blade项目中使用IDE的智能提示、自动补全、自动跳转等特性。 1.VSCode VSCode的C/C插件(ms-vscode.cpptools)提供了C/C代码的智能提示、自动补全和调试…

Java编程设计语言-集合类

API(application programming interface)是JDK的重要组成部分&#xff0c;API提供了Java程序与运行它的系统软件&#xff08;Java虚拟机&#xff09;之间的接口&#xff0c;可以帮助开发者方便、快捷地开发Java程序 集合在程序设计中是一种重要的是数据结构&#xff0c;Java中提…

数据湖Iceberg-FlinkSQL-kafka类型表数据无法成功写入(6)

数据湖Iceberg-简介(1) 数据湖Iceberg-存储结构(2) 数据湖Iceberg-Hive集成Iceberg(3) 数据湖Iceberg-SparkSQL集成(4) 数据湖Iceberg-FlinkSQL集成(5) 数据湖Iceberg-FlinkSQL-kafka类型表数据无法成功写入(6) 数据湖Iceberg-Flink DataFrame集成(7) 数据湖Iceberg-FlinkSQL-…

Linux离线状态下在anaconda中安装pytorch

1. 下载与安装说明 下载地址&#xff08;按安装方法选取&#xff09; bz2压缩包下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/win-64/?CM&ODwhl包下载 torch、torchversion、torchaudio下载地址&#xff1a;https://download.pytorc…

【OS】Linux Process Memory的探究

【OS】Linux Process Memory的探究 前言 刷B站刷到了南大OS的课程&#xff0c;不得不说酒吧舞的教育水平真滴高&#xff0c;狠狠的看了一些关于进程地址相关的课程。 进程地址空间 1.导言 先导入两个问题&#xff1a; 如下的程序会输出什么&#xff1f; #include<stdio…

axios的使用,axios的get请求、post请求方式、put请求方式

axios (发音&#xff1a;艾克C奥斯)是前端圈最火的、专注于数据请求的库。react/vue官方都推荐使用axios发送ajax请求&#xff0c;是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中。 中文官网地址&#xff1a;http://www.axios-js.com/ 英文官网地址&a…

快速下载VScode并配置Python运行环境【详细教程】

快速下载VScode并配置Python运行环境【详细教程】 博主&#xff1a;命运之光 目录 快速下载VScode并配置Python运行环境【详细教程】前言下载vscode第一步vscode官网下载第二步点击下载![请添加图片描述](https://img-blog.csdnimg.cn/1d76c427314b4ddcbd350e0a7e5449d5.png)第…

数据湖Iceberg-FlinkSQL集成(5)

文章目录 数据湖Iceberg-FlinkSQL集成环境准备**Flink与Iceberg的版本对应关系如下**jar包下载地址jar包上传到Flink lib目录下修改flink-conf.yaml配置 创建和使用Catalog创建语法说明Hive CatalogHadoop Catalog配置sql-client初始化文件 DDL语句创建数据库创建表创建分区表使…

ubuntu22.04安装ROS2

ubuntu22.04安装ROS2 0.前言一、安装ROS21.首先将本地的编码格式修改为utf-82.添加ROS2 GPG key3.安装ROS24.设置环境变量 二、简单测试1.Hello ROS&#xff01;2.ROS Turtle 三、总结 0.前言 最近也没找到什么特别感兴趣的小项目&#xff0c;不过偶然间看见ROS2这个东西&#…

中期国际:安卓MT4怎么下载以及下载后需要注意哪些问题

投资现货黄金&#xff0c;需要使用到现货黄金软件。一个简单易用的现货黄金软件&#xff0c;就像是给厨师一把趁手的菜刀&#xff0c;以后的使用会得心应手&#xff0c;投资更加顺利。对于投资者来说&#xff0c;什么现货黄金软件才算是好的呢?小编这里推荐MT4软件。如今不少投…

c++11 标准模板(STL)(std::priority_queue)(四)

适配一个容器以提供优先级队列 std::priority_queue 定义于头文件 <queue> template< class T, class Container std::vector<T>, class Compare std::less<typename Container::value_type> > class priority_queue; priority_queu…

Mysql 查询同类数据中某一数字最大的所有数据

方法一、将时间进行排序后再分组 该表表名为customer, park_id表示园区id&#xff0c;joined_at表示用户的加入时间&#xff0c;created_at表示用户的创建时间。 需求&#xff1a;查出每个园区中&#xff0c;最早加入园区的第一位用户 select * from (select * from custome…

outlook手动配置保姆级别教学

outlook保姆级教学 hello&#xff0c;各位小伙伴&#xff0c;今天呢讲一下outlook的配置&#xff0c;相信啊再次之前也必然看到过其他博主写的&#xff0c;我呢也是前段时间有需求但是网上总是零零散散的。 我呢配置过qq 和126的邮箱这里呢开始教程. 第一步呢首先点击账户的设…