あらまし
ChatGPT4は小規模(70行以下程度)プログラムなら1分程度で書いてくれるし、それなりのものを仕上げてくる事が多い。
しかし、中規模(数百行とか複数ファイルにまたがる)プログラムだとなかなか手こずる。その対策、落としどころについて考える。
※3.5はそもそも対象外としています
想定
想定しているシチュエーション
- 既にそこそこ複雑な数百行のプログラムが存在している
- それを良い感じに修正する(リファクタリング、エラー修正)
中規模以上の修正は何が問題か?
前回の記事から抜粋する。
しかし修正は状況による。50行のコードで一部エラーが出たり、挙動の一部を変えるように指示してもコスパはそれほど良くない。
今まで動いてた部分を動かなくして返してくる(ポンコツ)
同じ箇所で何度も修正作業が発生して、しかも改善されない。例えばpolarsの修正で存在しないメソッドを使ってきて、修正するように言うと、また別の存在しないメソッドを出してくる。polarsの日付関連で多い印象。
全行書き直す時間を待つのがだるいし、途中で途切れることもある。つなぐ際にインデントズレが起きたりする。
部分的に書き直してくる場合、該当箇所を探すのがだるい。
以上から、最初から自分で修正した方が良いこともある。この見極めがまだ難しい。
をリストにすると、
- 改悪してくることがある
- 同じ箇所で修正のループ(何度やっても躓く)
- 全行出力は時間の無駄(1行修正しただけなのに50行吐いてくる)
- 修正コードがどこに当たるのか、探すのが手間(何行目を差し替えるのか)
わりとこうなる(辛い…)
関数を1つだけ取り出してリファクタリングさせる
→エラー吐く(改悪スタート)
→(エラー文を渡して)「修正して」
→修正前はこれです。修正後はこれです
→「え、そもそも修正前のコードが違うんだが?」
→失礼しました。修正前を修正して、書き直しました
→「またエラー吐いたんだが…」
→失礼しました。修正したコードはこちらです
→「え、いやいや、そもそもまた修正前のコードが違うんだが?」
→失礼しま(ry
※以下、無限ループ
どう使い分けるか
「一発でサクッと修正」というパターンもそこそこあるため、「修正に使えない」と断じるのは早い。
ただ、「いつまで経っても良くならない」も珍しくない。これを試すコストはわりと高くつく(精神的な疲労も含め)。
以下、シーン別での評価をしてみた。
初回の叩き台
超優秀(95/100点)
コードが何もないところから、「とりあえず何か用意して」というアバウトな指示に対しては超優秀で、現状このフェーズでは世界一役立つツールと言えるのではないだろうか。とにかく速い。「指示通りに動いてない」ということはあるけれどが、「叩き台として」は超優秀。何十行もの退屈なテンプレを用意しなくて良くなる。
「簡単で短め」のコードの修正
非常に優秀(90/100点)
コードレビューをしてもらうのはかなり良い使い方だと思う。
また、短いのであれば「全行書き直させて貼り付けるだけ」と修正も簡単。
長いと「どこを差し替えるか」読んでいく必要があり面倒。
「複雑で長め」のコードの修正
「わりとこうなる」で書いたようなパターン。
結構微妙(40/100点)
以下、経験則より。
・2回修正させて駄目だったら、3回目も駄目な可能性が高い
・長文で返してきた割にエラーを吐かれると辛い。待たされるわ、色々読まされるわと。
・「長いコードが扱いづらいなら関数を細かく分けたら良い」が、GPTは記憶力がお馬鹿。関数がたくさんあると名前を間違えてきたり、存在しない関数を呼び出したりする。
・「指示を正確にわかりやすく」はよく言われているが、1つの修正をするために何行にも渡って長文指示を書くのであれば、最初から自分で手直しした方が早いよね問題。
「複雑で長め」のコードの修正時にどう使うと良いか
「2回、短めの修正をさせて駄目なら自分で手直し」と割り切る
この辺りが現実的な気がしてきた。ここまでは試す価値があると言って良いライン。
それ以上はコスパがどんどん悪くなってくる、というのが現状の感想。
AI使って逆に効率が落ちていたら本末転倒。
まとめ
「あ、これGPTに任すとヤバいパターンだ」という嗅覚を鋭くして諦める判断をより早く正確に出来るようになるとハッピーになれる(と思う)。