HUOXIU

私は分散キャッシュ システムの設計に GPT-4 を頼みましたが、実際に試してみると、夢中になりました。

著者: Naman_Bhalla

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


ChatGPTの基盤となるGPT-3.5よりもさらに強力なモデル、GPT-4が正式にリリースされました。OpenAIが公開したGPT-4開発者ライブストリーム動画(https://www.youtube.com/watch?v=outcGtbnMuQ)では、OpenAI CTOのGreg Brockman氏が、GPT-4を使って手描きのアーキテクチャ図のスケッチをリアルでスクロール可能なウェブサイトに変換する様子を実演しました。また、直接コードを生成することも可能で、エラーメッセージのスクリーンショットをGPT-4に送信すると、対応する解決策を提案してくれます。

日常的な開発シナリオにおいて、プログラマーの生活を直接的にターゲットとするツールによって生成されたコードは、本当に使えるものなのでしょうか?ChatGPTがGoogle L3エンジニアと同等で、年収18万3000ドルだとしたら、GPT-4のコーディング状況はどうなっているのでしょうか?

最近、元Googleのソフトウェア開発エンジニアで、現在はITオンライン学習プラットフォームScalerの教育システムデザイナーを務めるNaman Bhalla氏が、Uberのような企業の面接でGPT-4が受けるであろう質問をシミュレーションしました。彼の議論は「分散キャッシュシステムの設計」に焦点を当て、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 は、たった 1 つの文で、タイトル、問題の説明、具体的な要件をすぐに提供します。

タイトル: Uberの分散キャッシュシステム
問題の説明:
Uberサービスのデータを効率的に保存・管理できる分散キャッシュシステムを設計・実装します。Uberの増大する高速かつ効率的なデータ取得ニーズに対応するため、キャッシュは高可用性とスケーラビリティを備えたアーキテクチャをサポートする必要があります。
必要とする:
1. 次の操作をサポートする分散キャッシュ システムを設計します。
a. Put(key, value): キーと値のペアをキャッシュに保存します。
b.Get(key): キャッシュ内に存在する場合は、指定されたキーに関連付けられた値を取得します。
c.Delete(key): 指定されたキーに関連付けられたキーと値のペアをキャッシュから削除します。
2. キャッシュのサイズ(キーと値のペアの数)と有効期間(TTL)は設定可能です。キャッシュが最大容量に達すると、システムは最も最近使用されていない(LRU)アイテムを削除し、新しいアイテムのためのスペースを確保します。
3. スケーラビリティと可用性を向上させるため、キャッシュを複数のノードに分散させます。ノード障害やネットワーク分断を効果的に処理できるようにシステムを設計します。
4. 一貫性のあるハッシュ メカニズムを実装して、キーと値のペアをキャッシュのすべてのノードに均等に分散します。
5. システムは水平スケーリングをサポートする必要があります。大幅なダウンタイムやデータ損失なしに、キャッシュにノードを追加または削除することが容易である必要があります。
6. データの一貫性とフォールトトレランスを確保するために、読み取りと書き込みにクォーラムを実装します。システムは、データの不整合を引き起こすことなく、同時読み取りと書き込みを処理できる必要があります。
7. キャッシュ システムの健全性とパフォーマンスを追跡するための監視およびログ機能が含まれます。
8. キャッシュ システムと対話するためのシンプルなユーザー インターフェイスまたはコマンド ライン インターフェイスを設計し、ユーザーが配置、取得、削除などの操作を実行できるようにします。
9. キャッシュ システムの正確性と信頼性を検証するためのテスト ケースを作成します。


GPT-4は基本的な要件を記述でき、その精度も非常に良好です。最初のハードルをクリアしたと言えるでしょう。

これに続いて、Naman Bhalla 氏は、「自分の書き込みを読み取るのと同じように、コードの一貫性をどのように確保するのですか?」、「キャッシュはどのような機能をサポートできますか? 最適化、スケーラビリティ、クライアントへの可用性の保証は含まれていますか?」など、分散キャッシュに関する典型的な質問をいくつかしました。

GPT-4 は、テキストによる説明で包括的な回答を提供し、また、回答が正しいか間違っているかを誰でも簡単に確認できるように、いくつかのポイントをリストします。

最初の質問に答えて、彼はこう答えました。

自身の書き込みの読み取りにおける一貫性は、クライアントが一度書き込み操作を実行すると、同じクライアントからのそれ以降のすべての読み取り操作で更新されたデータが返されることを保証します。分散キャッシュシステムでこのレベルの一貫性を保証するには、以下の戦略を実装できます。
1. セッションベースの方法。
2. クライアント側のキャッシュ。
3. スティッキールーティング。
4. 読み書きの一貫性。
5. バージョン管理またはタイムスタンプ。
6. 因果関係の一貫性。


2 番目の質問への回答は GPT-4 によって次のように示されました。「キャッシュは、パフォーマンス、スケーラビリティ、顧客への可用性を向上させるために、さまざまな機能、最適化、保証をサポートできます。これらの機能には、エビクション ポリシー、有効期限 (TTL)、データの一貫性、キャッシュのパーティション分割、キャッシュのレプリケーション、キャッシュの永続性などがあります。」




面接プロセスの 2 番目のステップは、コードの作成です。





問題が満足のいく結果で解決されたら、次のステップはそれをテストすることです。これは、プログラマーの仕事の最も重要な実践的な部分、つまりコードの作成につながります。

Naman Bhalla の要件は、以下をサポートする分散キャッシュを作成するために、GPT-4 を Java で記述する必要があるというものでした。


上記の説明は、GPT-4 が Naman Bhalla が提示した 5 つの要件を理解するのに十分であったことは注目に値します。

しかし、最新のコーディング要件に直面したGPT-4は当初、やや戸惑いを見せ、「問題の複雑さとレスポンス形式の制限のため、分散キャッシュシステムの完全なコードを提供することはできません。ただし、システムコンポーネントの概要といくつかのコードスニペットを提供することはできます。これらはシステムの実装を開始するのに役立ちます。これらのコードスニペットは、要件に応じて変更および拡張できます。」と述べました。

したがって、次の 4 つのコード スニペットが提供されます。

1. キャッシュノード
2. 分散キャッシュ
3. 一貫性のあるハッシュ
4. キャッシュクライアント

もちろん、これは「種を蒔かずに利益を得る」ことを望むプログラマーにとっては良いニュースではないかもしれません。誰もがすぐに使えるコードを求めており、コードスニペットだけを提供する回答を聞きたいとは思っていません。


そのため、Naman Bhalla 氏が GPT-4 に CacheNode の完全なコードを実装するよう要求し続けたとき、GPT-4 は依然として彼の要求を満たし、完全なアルゴリズムとコードを提供しました。


Naman Bhalla はその後、CacheNode コードに加えて、GPT-4 によって提供される DistributedCache、ConsistentHashing、および EvictionStrategy (インターフェースと LRU および LFU 実装) のコードも入手しました。


何らかの理由で、GPT-4はリクエストコラプシング、非同期処理、プリフェッチに関連するコードの提供を停止しました。しかし、これらの機能のサポートをさらにリクエストすると、GPT-4は依然として熱心にコードを生成します。


もちろん、プログラマーの観点から言えば、GPT-4によって生成されたコードを使えるようにするには、まずコードを理解し、分散キャッシュシステムの具体的なロジックを知る必要があります。そうでなければ、どの部分が欠けているのかさえ分からず、ましてやコードを実行することさえできません。


テストケース




完全なコードが完成したら、テストケースの作成に取り掛かりました。Naman Bhalla氏は、GPT-4に各パーツのJUnitテスト例を直接コーディングするよう依頼しました。

GPT-4 の応答は次のとおりです。
DistributedCache の実装をテストするために、「DistributedCacheTest」という名前の JUnit テストクラスを作成します。このテストクラスは、以下のシナリオをカバーします。
1. 基本的な put 関数と get 関数をテストします。
2. 削除機能をテストします。
3. キャッシュ ノードの追加と削除をテストします。
4. リクエストのマージをテストします。
5. プリフェッチをテストします。

明らかに、GPT-4 はどのテストケースをテストするかを知っており、正しいテストケースを記述しています。


しかし、プリフェッチのロジックが定義されていなかったため、最終的なテストケースは含まれていませんでした。GPT-4は、「`DistributedCache`クラスに`prefetchKeys`メソッドを実装する必要があります。このメソッドは、指定されたキーに基づいてプリフェッチキーのリストを生成します。このメソッドを実装したら、プリフェッチが期待どおりに機能することを検証するためのテストケースを追加できます。」など、いくつかの提案を提供しています。

前の指摘に続き、Naman Bhalla氏はGPT-4が独自のカスタムプリフェッチサンプルを提供すべきだと提案しました。予想通り、GPT-4はまさにそれを実行し、実装とテストを行いました。


Naman Bhalla氏は、面接ではプログラマーにコード内でXXXをどのようにサポートするかをよく尋ねられると説明しました。好奇心から、彼はGPT-4の実装において、自身の書き込みの読み取りをどのようにサポートしているかを尋ねました。


Naman Bhalla氏は、GPT-4によって作成されたテストケースの1つが非決定的な出力を生成するため不安定であることに気づきました。この非決定的な出力は並行性に起因していました。Naman Bhalla氏がこの問題についてGPT-4にさらに質問したところ、GPT-4はすぐにエラーを修正しました。


ただし、GPT-4 では、一貫性の問題が発生しないように、特定のスレッドのキー要求にスティッキー性を実装する必要があります。

GPT-4 は次のように回答しました。「各キーへのリクエストが同じスレッドに送信されるよう、CacheNode クラスの `ExecutorService` を使用してスレッドプールを作成できます。各キーはハッシュコードに基づいて特定のスレッドにハッシュされ、特定のキーに対するすべての操作が同じスレッドで実行されるようになります。」

実際、最適ではない ExecutorService を提案しましたが、最善の解決策は何かを Naman Bhalla に伝え、それをコード化しました。


何らかの理由で、GPT-4はここで動作不良を起こし始めました。コードを完成させる代わりに、独自のコードを繰り返し記述し始めました。さらに、ExecutorServiceの実装に欠陥があります。スーパークラスを拡張しておらず、そのメソッドをすべて実装していません。


ナマン・バラ氏が GPT-4 に問題の解決を依頼したとき、「どうやら気が狂ってしまったようだ」とナマン・バラ氏はなすすべもなく語った。

GPT-4は前述の問題を解決できなかっただけでなく、CacheNodeと本質的に同じ機能を果たす新しいCacheクラスも作成しました。Naman Bhalla氏は、当初GPT-4はコード品質を向上させるためにこれを実行したと考えられていたと述べています。しかし、GPT-4は前述の点を忘れ始め、以前に定義された多くのクラスを再定義しているようです。


GPT-4 を軌道に戻すために、Naman Bhalla は以前に記述した CacheNode のコードをコピーして貼り付け、新しい ExecutorService 用に変更するように依頼しました。


最終的に、GPT-4はいくつかのエラーを抱えていたものの、フィードバックのおかげで修正されました。修正後、Naman Bhalla氏はGPT-4に対し、特に同時リクエストに関する包括的なテストのために、より多くのテストケースを作成するよう依頼しました。しかし、GPT-4はコンテキストを失い始めていたため、必然的に再びエラーが発生し、Naman Bhalla氏は以前作成したコードについてGPT-4に伝える必要がありました。


多くの試行錯誤を経て、GPT-4 は最終的に正しいテストケースを実装しました。


結論は

全体として、GPT-4は完全な分散キャッシュシステムコードを提供しており、その機能は良好なレベルにあります。しかし、ワンクリックで使用可能なコードを生成するという理想には程遠く、プログラマーは継続的に「ヒント」を提供し、最適化とエラー修正を行う必要があります。

では、GPT-4 がエンジニアとして採用された場合、あなたはそれを支持しますか、それとも拒否しますか?



著者: Naman_Bhalla

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

著作権に関する声明:このコンテンツはインターネットから取得したもので、学習および研究目的のみに使用してください。著作権は元の作成者に帰属します。著作権侵害が見つかった場合はお知らせください。直ちに削除し、お詫び申し上げます。ありがとうございます!