> 自媒体 > (AI)人工智能 > 让 GPT-4 设计一个分布式缓存系统,它从尝试到被“逼疯”!
让 GPT-4 设计一个分布式缓存系统,它从尝试到被“逼疯”!
来源:CSDN
2023-05-01 18:18:51
440
管理

整理 | 屠敏

出品 | 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 在面试环节中的表现情况。

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

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

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

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

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

因此,在开始时,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.编写测试案例来验证缓存系统的正确性和可靠性

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

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

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

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

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

1. 基于 Session 的方法。

2. 客户端缓存。

3. 粘性路由。

4. 读后写的一致性。

5.版本管理或时间戳。

6. 因果一致性。

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

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

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

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

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

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

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

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

写在最后

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

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

参考:

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

1
点赞
赏礼
赏钱
0
收藏
免责声明:本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本网证实,对本文以及其中全部或者 部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。 凡本网注明 “来源:XXX(非本站)”的作品,均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对 其真实性负责。 如因作品内容、版权和其它问题需要同本网联系的,请在一周内进行,以便我们及时处理。 QQ:617470285 邮箱:617470285@qq.com
关于作者
吴月(普通会员)
文章
374
关注
0
粉丝
0
点击领取今天的签到奖励!
签到排行

成员 网址收录40329 企业收录2981 印章生成186850 电子证书796 电子名片49 自媒体20954

@2022 All Rights Reserved 浙ICP备19035174号-7
1
0
分享
请选择要切换的马甲:

个人中心

每日签到

我的消息

内容搜索