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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实例分割算法BlendMask

实例分割算法BlendMask 论文地址&#xff1a;https://arxiv.org/abs/2001.00309 github代码&#xff1a;https://github.com/aim-uofa/AdelaiDet 我的个人空间&#xff1a;我的个人空间 密集实例分割 ​ 密集实例分割主要分为自上而下top-down与自下而上bottom-up两类方法…

一种用于地灾边坡大坝安全深度位移监测测斜仪

1用途 固定测斜仪广泛适用于测量土石坝、面板坝、岩土边坡、路堤、基坑、岩石边坡等结构物的水平位移、垂直沉降及滑坡&#xff0c;固定测斜仪配合测斜管可反复使用&#xff0c;并方便实现测量数据的自动采集。 固定测斜仪采用的是耐冲击型倾斜传感器&#xff0c;可靠性好&am…

15天学习MySQL计划-锁(进阶篇)-第十天

15天学习MySQL计划-锁&#xff08;进阶篇&#xff09;-第十天 锁 1.概述 1.介绍 ​ 锁是计算机协调多个进程或线程并发访问某个资源的机制。数据库中&#xff0c;除传统的计算资源&#xff08;cpu&#xff0c;ram&#xff0c;i/o&#xff09;的争用以外&#xff0c;数据也是…

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…

使用 vscode 安装配置 clang-format(代码格式化)

目前&#xff0c;网上能找到的配置教程都是乱教的。他们以C为语言讲配置&#xff0c;其实clang-format默认就是C.所以他们在配置时&#xff0c;即是错了。也会以默认C格式化&#xff0c;也不会提示配置错误。结果他们还不知道他们错在哪&#xff1f;如果让他们配置.CS, .json&a…

23种设计模式之观察者模式(黑马程序员)

观察者模式 一、概述二、结构三、实现四、总结在最后 一、概述 观察者模式又被称为发布-订阅模式(Publish/Subscribe)模式&#xff0c;它定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xff0c;会通知所有…

中级软件设计师备考---操作系统和计算机网络

【因为我自己是软件工程专业毕业的学生&#xff0c;所以408里的这两门课都比较熟悉&#xff0c;因此这一部分只放一些我印象不是完全深刻的知识。】 目录 操作系统前驱图与PV操作死锁的预防与避免绝对路径和相对路径缺页中断的某种练习题 计算机网络网络规划与设计特殊含义的I…

【FFTW库】编译生成 x86、arm 环境下的FFTW库

FFTW是一个快速计算离散傅里叶变换的标准C语言程序集&#xff0c;可计算一维或多维实和复数据以及任意规模的DFT。下面主要介绍的是 x86 环境下 FFTW库的编译过程&#xff0c;arm环境下的编译过程和FFTW类似&#xff0c;不同之处在于需要手动指定 编译环境 和 编译器。 FFTW有…

2023年五月份图形化一级打卡试题

活动时间 从2023年5月1日至5月21日&#xff0c;每天一道编程题。 本次打卡的规则如下&#xff1a; 小朋友每天利用10~15分钟做一道编程题&#xff0c;遇到问题就来群内讨论&#xff0c;我来给大家答疑。 小朋友做完题目后&#xff0c;截图到朋友圈打卡并把打卡的截图发到活动群…

OkHttp3源码解析 - 连接机制和缓存机制

系列文章目录 第一章 OkHttp3源码解析 - 请求流程 第二章 OkHttp3源码解析 - 拦截器 第三章 OkHttp3源码解析 - 连接机制和缓存机制 文章目录 系列文章目录前言一、连接机制1.1 创建连接1.2 连接池 二、缓存机制2.1 缓存策略2.2 缓存管理 彩蛋致谢 前言 本文基于okhttp3.12.1…

三大本土化战略支点,大陆集团扩大中国市场生态合作「朋友圈」

“在中国&#xff0c;大陆集团已经走过30余年的发展与耕耘历程&#xff0c;并在过去10年间投资了超过30亿欧元。中国市场也成为了我们重要的‘增长引擎’与‘定海神针’。未来&#xff0c;我们将继续深耕中国这个技术导向的市场。”4月19日上海车展上&#xff0c;大陆集团首席执…

ospf综合实验

目录标题 第一步&#xff1a;网段划分第二步&#xff1a;配置区域0路由器接口和环回第三步&#xff1a;配置区域0缺省第四步&#xff1a;配置MGRE环境第五步&#xff1a;配置区域0用户网段第六步&#xff1a;配置区域1路由器及环回第七步&#xff1a;配置区域2的路由器及环回第…

低代码开发重要工具:jvs-logic(逻辑引擎)基础原理与功能架构

逻辑引擎介绍 逻辑引擎是一种能够处理逻辑表达式的程序&#xff0c;它能够根据用户输入的表达式计算出表达式的值。在实际应用中&#xff0c;逻辑引擎通常被用于处理规则引擎、决策系统、业务规则配置等领域&#xff0c;具有广泛的应用前景。 原理与核心功能描述 基础原理 …

走进社区客户端测试 | 得物技术

0.引言 社区 C 端质量体系建设思考&#xff1f; 询问一下 ChatGPT 1、关于社区客户端 1.1 社区端上功能 得物首页 搜索、发布、关注流、推荐流、沉浸式单列流、活动 tab、其他二级频道 tab 动态详情页 图文、视频、专栏、点评 私域 个人/他人主页、通讯录好友、微博好友…

如何实现电脑通过手机上网?1分钟搞定!

案例&#xff1a;电脑没网时&#xff0c;如何通过手机上网&#xff1f; 【想用电脑看电影&#xff0c;但是附近没有Wi-Fi。朋友说可以说电脑可以通过手机上网&#xff0c;但我们都不知道具体如何操作&#xff0c;有没有小伙伴可以教教我们。】 在没有Wi-Fi或有线网络接入时&a…

服务(第十二篇)LVS-DR模式

数据包流向分析&#xff1a; &#xff08;1&#xff09;客户端发送请求到 Director Server&#xff08;负载均衡器&#xff09;&#xff0c;请求的数据报文&#xff08;源 IP 是 CIP,目标 IP 是 VIP&#xff09;到达内核空间。 &#xff08;2&#xff09;Director Server 和 Re…

无良公司把我从上家挖过来,白嫖了六个月,临近试用期结束才说不合适,催我赶紧找下家!...

职场套路多&#xff0c;一不小心就会掉坑&#xff0c;一位网友讲述了自己的遭遇&#xff1a; 今天被领导催促离职了&#xff0c;当时就是这个领导把他从别的公司挖过来。这家公司催得太急&#xff0c;为了投奔这里&#xff0c;他和上家的HR都闹翻了&#xff0c;上家总监挽留他&…

时隔两个多月,一起来看ChatGPT现况如何?

ChatGPT这股风吹了两个多月&#xff0c;时至今日&#xff0c;各平台上与ChatGPT相关的文章&#xff0c;到现在依旧拥有着不小的流量。三月中旬上线了ChatGPT-4&#xff0c;与我们的文心一言前后脚发布&#xff0c;而后阿里的“通义千问”也展现了不俗的实力&#xff0c;那到现在…

图形界面GUI相关概念GLX/Wayland/X11/DRM/DRI

1. GUI图形界面是什么 GUI是graphical user interface的缩写&#xff0c;图形用户接口&#xff0c;实现了基本的WIMP&#xff08;windows&#xff0c;icons&#xff0c;menus&#xff0c;pointer&#xff09;。一个GUI的基本组成&#xff1a;display server实现windowing syst…

03_线程间通信

面试题&#xff1a;两个线程打印 两个线程&#xff0c;一个线程打印1-52&#xff0c;另一个打印字母A-Z打印顺序为12A34B...5152Z&#xff0c;要求用线程间通信 public class Demo01 {public static void main(String[] args) {ShareData05 shareData05 new ShareData05();new…