让 GPT-4 帮我设计一个分布式缓存系统,从尝试到被我逼疯!

点击关注公众号,Java干货及时送达19635554be2b5cdf92088b0d65050eb2.png

0494e83466023f01e24ec03ed384236a.png 学习 Spring Cloud 微服务的正确姿势!

118d1cdf684307f3c537306b73496110.png 用上 ChatGPT 啦,强的离谱!

f2559b7db7cdcf05a934efaa2826de4c.png 博客园在绝境求生。。


整理 | 屠敏

出品 | CSDN(ID:CSDNnews)

比 ChatGPT 背后 GPT-3.5 更为强大的模型 GPT-4,已正式对外发布。在 OpenAI 官方发布的 GPT-4 Developer Livestream(https://www.youtube.com/watch?v=outcGtbnMuQ)视频中,我们亲眼见证了 OpenAI CTO Greg Brockman 演示了 GPT-4 将一张手绘草稿架构图变成一个现实可滑动的网站;同时,它也能帮助我们直接生成代码,甚至当我们把代码运行报错的界面截一个图发给 GPT-4 时,它就能给出相应的解决方案提示。

这种直接对标程序员饭碗的工具,在日常开发场景下,生成的代码是否真的可用?如果说 ChatGPT 达到了 Google L3 级别工程师,能拿到 18.3 万美元的薪资,那么 GPT-4 处于一个什么样的编码地位?

近日,前 Google 软件开发工程师、现任 IT 在线学习平台 Scaler 的教学系统设计师 Naman Bhalla 模拟了 GPT-4 去参加 Uber 这类公司面试会遇到的问题,其以“设计一个分布式缓存系统”为主题,探讨 GPT-4 在面试环节中的表现情况。

4fff8ef8e269d4491a2b738c0ca408d8.png

目前,他还把包含所有测试用例的完整代码放到 GitHub 上公开了出来:https://github.com/Naman-Bhalla/lldassignments/tree/master/src/main/java/dev/naman/lldassignments/casestudies/distributedcache/solution

整体而言,在写需求、回答问题、写代码环节中,GPT-4 能力达到普通工程师级别。不过,在测试用例环境,GPT-4 似乎失去上下文的逻辑性,甚至一度把自己搞懵。

接下来,我们将分享 Naman Bhalla 测试的全过程。

如果你还没有 ChatGPT 账号,可以加入我们的知识星球,免费赠送一个官方独享账号:

8d3b1ae5ceb8f6c3ea375f068bb07d72.png

面试环节第一步——回答问题,写软件需求

软件项目开发过程中,对于程序员而言,实施软件开发的基础就是要先写一份软件需求说明。

因此,在开始时,Naman Bhalla 提出要求 GPT-4 ——“为 Uber 构建一个分布式缓存,给我写一份问题需求。”

一句话之后,GPT-4 快速地给出了标题、问题描述、具体的要求:

标题:Uber 的分布式缓存系统

问题描述:

设计并实现一个分布式缓存系统,可以有效地存储和管理 Uber 服务的数据。该缓存应支持高可用和可扩展的架构,以满足 Uber 不断增长的对快速和高效数据检索的需求。

要求:

1.设计一款分布式缓存系统,可以支持以下操作:

a. Put(key, value): 将键值对存储在缓存中。

b.Get(key):如果它存在于缓存中,检索与给定键相关的值。

c.Delete(key):从缓存中删除与给定键相关的键值对。

2.缓存应该有一个可配置的大小(键值对的数量)和一个可配置的生存时间(TTL,Time to live)。当缓存达到最大容量时,系统应该删除最近使用最少的项目(LRU)来为新的项目腾出空间。

3.确保缓存分布在多个节点上,以提高可扩展性和可用性。设计系统能够良好地处理节点故障和网络分区。

4.实施一致性散列的机制,将键值对均匀地分布在缓存的各个节点上。

5.系统应该支持水平扩展。它应该很容易地从缓存中增加或删除节点,而不会有明显的停机时间或数据损失。

6.为数据的一致性和容错性实施读和写的法定人数。该系统应该能够处理并发的读和写,而不会造成数据的不一致。

7.包括监控和记录功能,可以跟踪高速缓存系统的健康和性能。

8.设计一个简单的用户界面或命令行界面来与缓存系统进行交互,允许用户执行诸如放、取和删除等操作

9.编写测试案例来验证缓存系统的正确性和可靠性

0c8457f691df6b111365f5999b031ee8.jpeg

GPT-4 能够说出基本要求,准确度也不错。可以说,过了第一关。

紧接着,Naman Bhalla 针对分布式缓存中一些经典的问题进行了提问,比如:“如何确保代码中支持类似于读取自己的写入数据(Reading your own writes)的一致性问题?”、“缓存可以支持哪些功能?是不是包括一些优化、可扩展性和对客户可用性的保证?”

对于提供一些文字解答方面,GPT-4 给出的答案都很充分,还列出了多个小点,便于大家很直观地看出回答的错与对。

针对第一问时,其答复道:

读取自己的写入数据(Reading your own writes)的一致性保证了一旦客户端进行了写操作,所有来自同一客户端的后续读操作都会返回更新的数据。为了保证分布式缓存系统的这种一致性水平,你可以实施以下策略:

1. 基于 Session 的方法。

2. 客户端缓存。

3. 粘性路由。

4. 读后写的一致性。

5.版本管理或时间戳。

6. 因果一致性。

642d15a015899a3825eab62cc20dc658.jpeg

第二个问题,GPT-4 回答,“缓存可以支持各种功能、优化和保证,以提高它的性能、可扩展性和对客户的可用性。其中一些功能包括驱逐策略、生存时间(TTL)、数据一致性、缓存分区、缓存复制、缓存的持久性等等”。

c53d0f687287cb8bf6ff6560d41afe03.jpeg

另外,这些分布式面试题全部整理好了,如果你近期准备面试跳槽,建议在Java面试库小程序在线刷题,涵盖 2000+ 道 Java 面试题,几乎覆盖了所有主流技术面试题。

面试环节第二步——上手写代码

当问题以不错的结果完成之后,接下来,所谓是骡子是马,拿出来溜溜,由此也进入了程序员岗位最为重要的实操环节——写代码。

Naman Bhalla 给出的要求是,让 GPT-4 用 Java 编写一个分布式缓存的代码,支持以下要求:

f6d68e0acd39d11bc51806f49f741564.png

值得注意的是,上文解答过程中,足以让 GPT-4 能够把 Naman Bhalla 提出的 5 项要求弄懂。

不过,当拿到最新写代码需求时,GPT-4 首先还是有些懵,其表示,“由于问题的复杂性和和响应格式的限制,我不能提供分布式缓存系统的完整代码。但是,我可以给你一个系统组件的大纲和一些代码片段,由此可以帮助你开始实施这个系统。你可以根据你的要求修改和扩展这些代码片段。”

于是它提供了四个部分的代码片段:

1. CacheNode

2.DistributedCache

3. ConsistentHashing

4. CacheClient

当然,这对于想要“坐享其成”的程序员而言,未必是一个好消息,大家都想要拿来就能用的代码,必然不想听到只给代码片段的回复。

750dce7d1806f7dbc01b205b9f17f912.jpeg

因此,当 Naman Bhalla 继续要求 GPT-4 实现 CacheNode 的完整代码时,GPT-4 还是满足了他的小心思,提供了完整的算法和代码:

fab7e641cbb8c1bcc99eb726158a6b83.jpeg

除了 CacheNode 这部分的代码之外,Naman Bhalla 相继得到了 GPT-4 提供的 DistributedCache、ConsistentHashing、EvictionStrategy(接口以及LRU 和 LFU 实现)的代码。

35dfaa2ec7bdddcb488053f2c634a45e.jpeg

6b24e9ed7c095eb1b5d876a47ea902b7.jpeg

不知道什么原因,GPT-4 决定不再提供关于 Request Collapsing、Async Processing、Prefetching 的代码。不过,如果进一步跟它提要求,支持这些功能时,它还是嗒嗒嗒地敲下了这些代码。

7fb8d6fd29962b332a7e7e7c244ff3b6.jpeg

当然,在这过程中,站在程序员的角度来看,想要 GPT-4 生成的代码即可用,首先要看得懂这些代码,知道分布式缓存系统实现的具体逻辑,否则,缺失哪一块都不知道,更别论拿着代码去运行了。

测试用例

完整的代码有了之后,便进入了写测试用例的时候了。Naman Bhalla 直接要求 GPT-4 编码每个部分的 junit 测试示例。

GPT-4 的回复是:

为了测试 DistributedCache 的实现,我们将创建一个名为"DistributedCacheTest "的 JUnit 测试类。这个测试类将涵盖以下情况:

1. 测试基本的 put 和 get 功能。

2. 测试删除功能。

3. 测试添加和删除一个缓存节点。

4. 测试请求合并。

5. 测试 prefetching。

很显然,GPT-4 知道要测试哪些用例,也写了正确的测试用例。

19df46ece78fbfdaaaac66e2902362bb.jpeg

不过,它并没有写最后一个关于 prefetching 的测试用例。因为它的逻辑没有被定义。为此,GPT-4 提供了一些建议,如「你需要在 DistributedCache 类中实现 prefetchKeys 方法,该方法根据给定的键生成一个 prefetch 的键列表。一旦你实现了这个方法,你就可以添加一个测试案例来验证 prefetch 是否按预期工作。」

承接上文,Naman Bhalla 建议 GPT-4 还是自己直接给出一个自定义 prefetch 的示例。不出意料,GPT-4 照做了,然后实现了测试。

c90d0b5126578da8245235b4fafbf604.jpeg

Naman Bhalla 表示,由于在面试过程中,面试官经常问程序员如何在代码中支持 XXX。于是,他本着好奇的性子,就问 GPT-4 在实现中如何支持读取自己的写入数据(Read your own writes)。

8bc74e302171850cc235db40e3a766c0.jpeg

Naman Bhalla 注意到,GPT-4 所写的一个测试用例是不稳定的,因为它产生了非确定性的输出。由于并发性,它产生了非确定性的输出。当 Naman Bhalla 进一步向 GPT-4 问了这个问题,它很快就纠正了错误。

fc85a63f22f4c4363beec060b134592c.jpeg

然而,当要求 GPT-4 实现对给定线程的密钥请求的粘性,以确保没有一致性问题。

GPT-4 答复道:“为了确保每个键的请求都进入同一个线程,你可以在 CacheNode 类中使用`ExecutorService`创建一个线程池。每个键将根据其散列代码被散列到一个特定的线程,以确保对一个特定键的所有操作都由同一个线程执行。”

事实上,它提出了一个非最佳的 ExecutorService,但告诉 Naman Bhalla 最佳的解决方案是什么,并且也进行了编码。

fabc7c64134a2fee524ad14afac82aa0.jpeg

519109b95e72db051c51818d2f4a4d83.jpeg

不知何故,GPT-4 在这里开始发狂了。开始不断重复自己的代码,而不是完成代码。另外,ExecutorService 的实现是错误的。它没有扩展超类,也没有实现它的所有方法。

075434e64d18b451ebd3b45c046ed86e.jpeg

当 Naman Bhalla 要求 GPT-4 修复这个问题时,“它似乎已经疯了”,Naman Bhalla 无奈地说道。

因为,GPT-4 不仅没有修复上面的问题,反而又创建了一个新的 Cache 类,它基本上在做与 CacheNode 相同的工作。Naman Bhalla 称,最初认为 GPT-4 这样做可能是为了提高代码质量。但似乎它已经开始忘记上文了,再次定义了许多先前已经定义的类。

1fbdd8cc57d504a84574ac5a263514f4.jpeg

0356afdff8dddc676cd7d2e3e18633e2.jpeg

为了让 GPT-4 回归正轨,Naman Bhalla 复制粘贴了它之前写的 CacheNode 的代码,并要求它为新的 ExecutorService 修改它。

4398190fd6f56310b7f8e65f0038aa64.jpeg

71babab3ac158e71f6ef800ebfd44544.jpeg

3464687b90c0e0da8b3d7abaead600a1.jpeg

最终,GPT-4 虽然犯了一些错误,但在提示下得到了修复。修复完成之后,Naman Bhalla 又要求 GPT-4 再写一些测试用例来全面测试。特别是针对并发请求。但由于 GPT-4 已经开始失去上文背景,所以它不可避免地又犯了错误,Naman Bhalla 不得不告诉它之前写的代码。

ac3df8ae60636d893cb32ac7dfa9c53a.jpega8a46f1e735bd96096b57915123c89bc.jpeg

几经折腾,GPT-4 终于实现了正确的测试用例:

1ee65e9802353649a8f229644bc63399.jpeg

写在最后

整体而言,GPT-4 提供了完整的分布式缓存系统代码,其能力处于一个不错的水平。不过,距离理想中的一键就能生成可用的代码,还有很长的距离,仍然需要程序员从中不断提供“提示语”,并优化纠错。

那么,如果让 GPT-4 作为工程师入职,你会支持还是拒绝?

参考:https://twitter.com/Naman_Bhalla/status/1637578030536093697

ChatGPT 太火爆啦,有人靠它提高工作效率,有人靠它赚了第一桶金,但也有很多人对 ChatGPT 还一无所知。。

如果你属于后者,我创建了一个《ChatGPT小密圈》知识星球,加入学习,我可以帮你从 ChatGPT 小白到高手进阶。

加入星球福利:

1、加入即送一个超难注册的 ChatGPT 账号,个人独享,一人一号,官方纯手动注册,安全可靠。

2、星球分享了大量 ChatGPT 学习资料, ChatGPT 专栏目前还输出了 40+ 篇保姆级教程,持续更新中。

光一个账号就值几十块,早已值回票价:

0fd5b92f35b7bbcfbcd78bd0f53e0506.jpeg

目前还是优惠价,快扫码加入吧:

98f0755b2d106ed26896d9140172998b.png

1000 人后正式涨价啦,早就是优势!

ChatGPT 不会替代你,但掌握它的人会!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android模仿微信浮窗功能的效果实现

转载请注明出处,谢谢:https://blog.csdn.net/HarryWeasley/article/details/82591320 源码地址:https://github.com/HarryWeasley/weChatFloatDemo 最近研究了微信悬浮窗的效果实现,写此文章记录一下,后面有我的GitH…

Qt 停靠悬浮窗口 使用实例

工程中我们常用到悬浮窗口,Qt 实现停靠和悬浮使用类QDockWidget, 效果: 悬浮窗口 这里主要介绍怎么使用; Part1.使用流程: 1. 创建QDockWidget对像的停靠窗体; QDockWidget *dw new QDockWidget(&quo…

android悬浮窗口的实现

当我们在手机上使用360安全卫士时,手机屏幕上时刻都会出现一个小浮动窗口,点击该浮动窗口可跳转到安全卫士的操作界面,而且该浮动窗口不受其他activity的覆盖影响仍然可见(多米音乐也有相关的和主界面交互的悬浮小窗口)。那么这种不受Activit…

ChatGPT提示词工程(六):Expanding扩展

目录 一、说明二、安装环境三、扩展(Expanding)1. 自定义自动回复客户电子邮件2. 提醒模型使用客户电子邮件中的详细信息3. 参数 temperature 一、说明 这是吴恩达 《ChatGPT Prompt Engineering for Developers》 的课程笔记系列。 本文是第七讲的内容…

通达信自动包络线指标公式以及ATR通道指标

根据亚历山大埃尔德在其著作《以交易为生》中的描述,自动包络线的设计思路是将通道看作试穿衬衫一样,寻找那些穿起来既不过松也不过紧的衬衫,只让手腕和脖子露在外面。自动包络线能够适应最近的行情波动,只有在极端情况下&#xf…

微信支付费率0.38还是0.6,0.2费率怎么开,3分钟申请教程

目前微信支付官方给到商家的费率统一为0.6%,部分线下实体店商家由服务商推广开户一般是用的0.38%的费率。 其实很多商户都不知道,其实还可以开通更低的费率,0.2~0.35%的费率。 现在就分享一个如何在几分钟申请提交开通0.2费率的…

微信支付申请费率0.2%的方法,百分百通过不求人

微信支付通用的费率都是0.6%,那么如何申请0.2%呢。方法很简单。

openai.error.RateLimitError: You exceeded your current quota, please check your plan and billing det

报错: 此错误消息表明您已达到API的最大月支出(硬限制)。这意味着您已经消耗了分配给计划的所有积分或单位,并且已经达到计费周期的限制。这种情况可能有几个原因,例如: 您使用的是高容量或复杂的服务&…

关于0.2%费率的微信支付,你需要了解一下。

经营流水大,支付手续费高,想要减少手续费?不了解微信支付申请流程,步骤太多太繁琐,想要快捷开户?不用担心,这些都可以用微信支付特约商户解决! 为助力商家享受到更快捷的微信商户申…

定时任务原理方案综述

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 导读 本文主要介绍目前存在的定时任务处理解决方案。业务系统中存在众多的任务需要定时或定期执行,并且针对不同的系…

巴比特 | 元宇宙每日必读:AI搜索大战打响!微软官宣ChatGPT引入Bing,“文心一言”传首站将接入百度搜索,接下来是谁?...

摘要:据财联社报道,北京时间8日凌晨,微软宣布推出由ChatGPT支持的最新版Bing搜索引擎和Edge浏览器,新版Bing于今日上线,不过预览人数有限。微软计划近期推出移动版本,预览人数有望扩展至数百万人。那么&…

Docker 十周年 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2023 年 3 月 20 日,在 1999 年的今天,人类首次成功乘热气球环球飞行。在 24 年的今天,瑞士人皮尔卡、英国人琼斯经过近 20 天的飞行…

macOS 下载汇总(系统、应用和教程) 2023 持续更新中

macOS Ventura 13, macOS Monterey 12, macOS Big Sur 11, macOS Catalina 10.15, macOS Mojave 10.14, macOS High Sierra 10.13, macOS Sierra 10.12 请访问原文链接:https://sysin.org/blog/macOS/,查看最新版。原创作品,转载请保留出处。…

网景浏览器正式发布 | 历史上的今天

整理 | 王启隆 透过「历史上的今天」,从过去看未来,从现在亦可以改变未来。 今天是 2022 年 12 月 15 日,在 56 年前的今天,美国动画制作家迪士尼逝世。他创造的米老鼠形象曾经给世界上的每一个孩子带来了欢乐;他是一位…

马化腾微信转发文章称要“收紧队形”,腾讯公关回应;微软宣布终止支持 Cortana;TypeScript 5.1发布|极客头条...

「极客头条」—— 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews) 一分钟速览新闻点&#…

苹果电脑惊现比特币白皮书,乔布斯会是中本聪吗?

原创:刘教链 * * * 隔夜比特币继续在28k附近横盘,静静等待30日线向上靠近。 市场总在百无聊赖之际找些乐子。昨天,圈子里热议最多的话题就是在苹果电脑系统中发现了比特币的白皮书[1]。 话题的源头是4月5号一个叫Andy Baio的网友在waxy.org发…

本地推理,单机运行,MacM1芯片系统基于大语言模型C++版本LLaMA部署“本地版”的ChatGPT

OpenAI公司基于GPT模型的ChatGPT风光无两,眼看它起朱楼,眼看它宴宾客,FaceBook终于坐不住了,发布了同样基于LLM的人工智能大语言模型LLaMA,号称包含70亿、130亿、330亿和650亿这4种参数规模的模型,参数是指…

安装Windows和MacOS双系统 (UEFI + GPT) 和常用软件及配置,一篇文章解决所有

调节显示器自带扬声器音量用Loopback 镜像下载地址:https://mirrors.dtops.cc/iso/MacOS/daliansky_macos/ 黑苹果AppleALC声卡驱动: 通过windows系统查看,右键我的电脑——管理——设备管理器——右键设备属性——详细信息——属性中选择硬件id,查看第一行“值”,注意dev后…

Win11系统更新后网络速度变的很慢怎么办?

Win11系统更新后网络速度变的很慢怎么办?有用户将自己的电脑系统升级到了Win11之后,出现了一些问题。电脑在使用中出现了网络速度变慢的情况。而且其它的设备在连接网络后速度是正常的,那么这个问题要怎么解决?来看看以下的方法分…