🤖

GPT-4を使って既存のRailsアプリケーションにヘルスチェック機能追加をしてみる

2023/03/25に公開

概要

  • GPT-4の性能が良いので既存のRuby on Railsで動いているアプリケーションに機能を追加して本番へリリースできるクオリティを目指します。
  • GPTに指示出しをしてPoCを作らせるのは簡単なので、今回はプロダクションレベルに出して良いレベルのコードを出力させて本番にデプロイします。

機能要求

最近、個人開発しているサービスのコンテンツをCDNに乗せました。originの外形監視のためにヘルスチェック用のエンドポイントが必要になったのでその機能を実装してもらいましょう。

実装の難易度はかなり低いですが、細かいところの評価ポイントがあります。

  • 作る人によってControllerの名称が微妙ではないか?
  • 返却されるjsonデータのキーの名前が微妙ではないか?
  • rspecを書いてくれるか?

実装

一発目は、とりあえずエンドポイント名だけを指定してコードを書いてもらいました。

なかなか良いです!しかしながら文字列で時間を返されてもちょっと扱いづらいのでunix timestampで返してもらおうと思います。

期待通りのコードができました。しかし、実装だけなら誰でもできる!
殆どのエンジニアが面倒だなと思うテストコードも書いてもらいましょう。

まぁ、90点ぐらいのできです。

ちょっとこのコードでは100%テストが通るとは限らないので修正してもらいます。

ヒントを与えすぎてしまったかもしれませんが、理想のコードになりました。

なぜ今年の元旦の日付に固定したのかは不明です。べつに Time.zone.now と書いたほうが良いです。コード量が削減できますし、マジックナンバーも減ります。まぁ、細かいことは気にしないで良いです。

しかしながら惜しいです。細かいですが、rubocopで指摘されるような細かい指摘をしてみました。

GPTに書かせて、rubocop -a を使って自動に校正できるような内容なので全く問題無いです。

テスト

上記のコードをコピペして、rspecを実行してみます。

% docker compose run --rm app bundle exec rspec spec/controllers/healthcheck_controller_spec.rb
[+] Running 2/0
 ⠿ Container train-chrome-1  Running                                                                                                    0.0s
 ⠿ Container train-db-1      Running                                                                                                    0.0s

Randomized with seed 11651

HealthcheckController
  GET #index
    returns http success
    returns current time in unix timestamp format

Top 2 slowest examples (0.05121 seconds, 94.6% of total time):
  HealthcheckController GET #index returns http success
    0.0462 seconds ./spec/controllers/healthcheck_controller_spec.rb:13
  HealthcheckController GET #index returns current time in unix timestamp format
    0.005 seconds ./spec/controllers/healthcheck_controller_spec.rb:18

Finished in 0.05413 seconds (files took 2.79 seconds to load)
2 examples, 0 failures

Randomized with seed 11651

素晴らしいです。1発で成功しました。

つぎに、実際にHTTP経由で叩いてみましょう。

% docker compose up
% curl -s http://localhost:3001/healthcheck.json | jq
{
  "time": 1679753425
}

成功しました!完璧です。

こうして作られた機能が以下のURLになります。
https://train.teraren.com/healthcheck.json

成果物

今回作ったコードをdiff形式で以下のURLにおいておきました。

そのまま取り込めば同じ機能を自分のプロジェクトにそのまま使えると思います。

https://gist.github.com/matsubo/ba0db8ba1386119ff0ffff1142a038ba

% cd <root of rails project>
% curl https://gist.githubusercontent.com/matsubo/ba0db8ba1386119ff0ffff1142a038ba/raw/1c5b63a98a366fb566aad998dba636f0d3900ba8/healthcheck.diff | patch -p1

そもそも

1つ上位の視点で考えると、なんでChat-GPTの結果を自分でコピペして、他のプロジェクトに利用できるようにdiffを貼り付けているのだろう。
ここまでの流れをやらせれば良いのでは?と思いました。

試しに、Chat-GPT4にdiffを出させてみました。

ちゃんと出力されています。

ここまで、長々とGPT4と対話して成果物を作製しましたが、以下のように司令を書けば1発で終わります。

ここで言えることは、issueに書くようなフォーマットで実装を見越して要求定義をしっかり書けばコードを生成してくれます。
プロジェクトで共通の事項であるrspecがインストール済みといったことは1回覚えさせてしまえば良いので省略できます。

まとめ

  • 簡単な実装ならばコードを生成できそうです。
  • 当初、懸念していたキーワード選定の正しさや、テストコードの正しさはほぼほぼ私のコーディングスタイルと一致しているので違和感は無いコードが出てきました。
  • 単純に要求を書いて、出されるようなコードは100点のコードは出てきません。事前条件の設定や、要件の設定でチューニングするのが良いです。
株式会社マインディア テックブログ

Discussion