Rust初心者がChatGPT-4を使ってRustを勉強してみた

Rustはパフォーマンスが良いことやメモリ安全でなんとなく知っており「Rust勉強したいなー」と思っていたところ、ここ最近ではChatGPTなどLLM(大規模言語モデル)も盛り上がってきてジェネレーティブAIも試してみたいとなっていました。

そんな中、「あれ、もしかしたらRustをChatGPTを使って勉強してみたら一石二鳥では!?」と思い立ったので、Chat GTP-4を使ってRustを勉強できるか試してみました。

 

 

早速、結論です。

試してみて感じたことは「学習のいい相棒になってくれ、自動生成技術は期待ができるが、内容を咀嚼する理解力か技術力が必要」という感想です。

  • ✅ 知りたいことをわかりやすく教えてくれる:Rustの特徴はもちろん、Rustのわからないコードやエラーメッセージの解決方法を教えてくれる
  • ✅ 簡単なコードの自動生成はお手のもの:コードやテーブルスキーマを自動生成してくれるだけでなく、リファクタリングもしてくれるし、テストも書いてくれる
  • ❌ 一部情報が古い:現状のGPT-4では2021年9月の情報のようで、テック分野は動きが速いので内容を実際に確認しにいく必要がある

一応、筆者のスペックは以下のような感じです。

  • Rustほぼ初心者:hello worldをして簡単な言語仕様はなんとなく知っている
  • 10年程度のプログラミング実務経験
  • 半年ぐらいScalaの実務経験あり※Optional、Result、matchの意味を雰囲気理解している
  • ChatGPT 利用歴:2023年3月〜

✅ 知りたいことをわかりやすく教えてくれる

Rustの特徴はもちろん、`await.unwrap()`などRustの言語的なわからない部分を教えてくれました。エラーメッセージの解決方法も教えてくれました。

Rustの特徴

Rustの特徴を聞くと、メモリ安全性、パフォーマンス、並行性ということが特徴です。よくRustの特徴として巷で聞く話と合致します。

Rustの主要な特徴 - Chat GPT-4

わからないメソッドの説明

次に、Chat GPT-4にRustのコードを出力してもらうなかで、以下のように`await.unwrap()`がちょくちょく書かれていました。

// connect to SQLite DB
let database_url = "todo.db";
let pool = SqlitePool::connect(&database_url).await.unwrap();

いまいち意味がわからなかったので聞いてみました。
`await`は非同期処理を待ち、`unwrap()`は`Result`型や`Option`型の値をとりだし、エラー時にはパニックを起こすというものがわかりました。

`unwrap()`はサンプルコード用の記述であり、理解しないで使うといきなりシステムがパニックを起こして止まることになりえるので、自動生成コードも内容を理解することが大切だと感じました。

`await.unwrap()`の意味 - Chat GPT-4

エラーメッセージの解決方法

コンソールにでているエラーメッセージをコピペして聞いてみました。一般的なエラーメッセージということもあり、回答内容で解決できました。
※`Cargo.toml`の`actix-rtの記載方法が若干間違っていたり、バージョンが少し古かったですが...

エラーメッセージの解決方法 - Chat GPT-4

✅ 簡単なコードの自動生成はお手のもの

簡単なコードの場合、コードやテーブルスキーマを自動生成してくれるだけでなく、リファクタリングもしてくれるし、テストも書いてくれました。
複雑なコードでは試してないので、おいおい試してみたいと思います。

テーブル設計とスキーマの自動生成

まず、Todoアプリのテーブル設計をしてもらい、また、`CREATE TABLE`のSQLを作ってもらいました。作成されたSQLはそのまま流しこめました。

Todoアプリのテーブル設計 - Chat GPT-4

また、検証用にサンプルレコードを追加したかったので、INSERT文を用意してもらいました。ここらへんはかなり便利ですね!

todosレコードのINSERT文 - Chat GPT-4

APIコードの自動生成

次に、テーブルからデータを読み込む`GET /todos`のコードを出力してもらいました。
世の中ではAPIでの実装が多いからか勝手にJSON形式になりましたw

こちらは、コピペしてもエラーがでてきて、Chat GPT-4やググりならがエラーの解決が必要でした。AI時代のプログラミングとしては、自動生成コードをコンパイル時に検証できるのは強みかもしれません。

GET /todos のコード自動生成(一部抜粋)- Chat GTP-4

また、次のようにプロンプトを書くことで`get_todos`と同じような形式で`post_todos`を自動生成できました。

POST /todos のコード自動生成プロンプト - Chat GTP-4

出力結果はこちらです。同じようなスタイルで出力してくれてます。
コピペしつつ、一部気になった命名などは手直ししました。

POST /todosのコード自動生成結果 - Chat GPT-4

自動生成したコードを自動でリファクタリング

`post_todos`をみると、HTTPのリクエスト・レスポンスとデータベースとのやりとりが1つにまとまってしまっているので、切り分けるように依頼しました。

感覚的に「そうだよね!」という感じで、わりと理想的な状態にリファクタリングしてくれました。

`create_todo`にSQLの実行や結果を`Todo`構造体に詰め込む部分を集約してくれました。

`post_todos`の自動でリファクタリング結果 - Chat GPT-4

そして、`post_todos`関数ではHTTPのやりとりのコードが中心になり、かなり可読性がよくなりました。

`post_todos`の自動でリファクタリング結果続き - Chat GPT-4

 

テストコードの自動生成

それでは、テストコードの自動生成をしてみます。以下のようにテスト対象のコードをプロンプトにいれました。

テストコードの自動生成プロンプト - Chat GPT-4

自動生成されたテストコードです。ほぼそのままコピペして動きました。
検証している内容は適切そうですが、`CREATE TABLE`のテーブル設計が微妙に違うのでここらへんは別途、修正が必要そうです。

テストコードの自動生成結果 - Chat GPT-4



❌ 一部情報が古い

現状のGPT-4では2021年9月の情報のようで、テック分野は動きが速いので内容を実際に確認しにいく必要がありました。

具体例として、Rustでのデータベースライブラリに何を使えばよいか聞いてみましたが、2021年9月と内容が古く、また、「GitHubを確認してください」とChat GPT自体も言っています。

ここは、Rustのライブラリカタログの https://lib.rs/GitHubリポジトリをみて、機能性を比較検討する必要がありそうです。
また、最新のライブラリの基本的な情報を学ぶにはChat GPTに聞くよりもGitHubのREADMEを読んだほうが安心感があります。Chat GPTだと`Cargo.toml`に記載するバージョンも少し低かったりと若干内容が古く感じました。

Rustの主要なデータベースライブラリ - Chat GPT-4

 

おまけ:Rustクイズチャットボット

おまけで、「習うより慣れろ」ということでRustのクイズをだしてもらいました。プロンプト力が低いのもあり、Rustの場合は質問内容のレパートリーが少ないですが勉強になりそうでしたー

Rustクイズチャットボット - Chat GPT-3.5

ちなみに、選択形式でわりと正解できたので、少し難易度をあげてもらったら自由入力形式になりなかなか頭を使いました(身につきそう)

Rustクイズチャットボット難易度UP - Chat GPT-3.5

 

以上、Chat GPTを使ってRustを勉強してみました。
今回はネットにも情報が多い簡単な内容でしたので、よりどこまで複雑なことができるか、応用力があるかを実験していきたいと思います。

Chat GPT-4面白いですねー!