AIと対話するサービスをほぼ全部AIに作ってもらってリリースしました
きっかけ
最近ちょっと大きな出来事があったので、ChatGPTに壁役になってもらって自分の人生の振り返りをしていました。その際にとった対話の手法がなかなか良かったのでサービスとして提供してみようかな? と思ったのが今回の開発のきっかけです。
成果物はこちら。
自分年表を入力して対話をスタートすると、自分の人生目的 (SOURCE) と、それを支える原則(CODE) が作られます。 (ちょっと狙いすぎだろ!というネーミング...GPTがそれがいいっていうんで...笑)
実際の開発がどんな感じで進んでいったか、時系列で書き留めてみたいと思います。
(途中これは失敗だったなと思うところも敢えて残しています)
前提など
私はRailsで仕事するようになって8年ぐらい。一時期ReactでFE開発したこともあったが最近はあまり触ってないな〜という感じです。今回は サッと作って形にする のが目標だったため、構成は以下にすることだけ最初に決めました。
- Railsモノリスで開発
- DBはpostgres (PaaSなどで無料サポートされているケースが多いし好き)
最初はKiroでコンセプト決めと実装(失敗だった)
Kiroをインストールだけしてほとんど使ってなかったのですが、新規の開発であれば自分で設計して自走するところまでいけるかも?という期待があってスタートしてみました。
まず最初に作りたいものを会話しながら計画書が出来上がります。
それに従って進めていくんですが〜、詰まる詰まる笑
docker-composeで環境作って立ち上げ、最初の画面..ぐらいまでは順調だったんですが、その後は何度も「ここが違う」「あれのせいで動かない」を自分で探し回る頻度があまりに多くなったので途中で諦めました。
最初に大きな計画を出してくれるのは助かるな〜とも思ったんですが、よくよく考えたらこれKiroじゃなくたってできるんですよね。
Claudeで計画し直し
というわけで、ユーザーがログインできて最初の画面ぐらいまで行ったところで使い慣れているClaude Codeで進めるように方針変更。
Kiroが作ったドキュメントを読んでもらった上で、Claudeに
「計画書をプロジェクトルートに作成して」-> 出力したものを私が少し調整 -> これに沿って進めていきましょう
というやり方にしました。
「読んで自走して全部作ってね」だと、問題がやばくなってから気づくことになりそうという予感があったので、あくまでこの計画書は自分とClaudeにとってのタスクリストという感じです。
実際には、
「この機能を実装して」-> 動作確認 -> 修正を伝える
というVibe Codingな作業の流れを取っています。この時点では仕様も曖昧なのでspecも実装しません。触って動かしてOK/NGを確認しながら進めました。
結果的にこれは大変やりやすかったですね。
特に面白いなと思ったのは、 画面設計書がない状態で進めるとこうなるのか という感覚を得られたことです。
通常、仕事でやる開発ではFigmaか、最悪でもポンチ絵的なものがある状態で実装をスタートしていくと思います。今回はそれがないので、実装する->画面見る->あーここはこうじゃないなと気づく みたいなループになります。
画面が先にあった方が良かった、と思うこともあればロジックが出来上がってから画面をこう変えたいも出てくるんですよね。
もしこれが通常の開発フローに乗っていると、最初に仕様を決めて、デザイン決めて、着手してからデザイナにフィードバックして、、とかなり時間がかかっていただろうなと思います。
もちろん、自分がデザインの技術を細かく知らないし多少雑でもいいやという割り切りがあるからこそ今回のやり方ができるんだとは思いますが、既存の開発フローをどう変えていけばスピードが出るんだろう?という視点と実感をひとつ得られたのは自分的に大きかったです。
プロンプトのトライアンドエラーが大変だった
今回のプロダクトは、AIとユーザーがチャットでやり取りしながらユーザーの人生目的を探索するというものです。
この実装自体はかなりシンプルで、「あなたはベテランのメンタルコーチです。ユーザーはこれから人生の目的について問うてくるので、以下のステップに従って....」みたいなプロンプトを与えてから、OpenAIのAPIにユーザーからのメッセージを投げているだけです。
(メンタリングをある程度枠にはめたプロンプトを用意してChatGPTに投げる。このサービス自体はメッセージをやり取りさせるProxyとUIという感じが近い)
なので、このプロンプトがちゃんとしてないとユーザーが一通りの対話を得た後に出来上がる成果物が良いものにならないんですよね。
結果、これが出来上がるまで私は何十回も自分の人生目的を探索することになり大変でした笑
あと、どれだけ頑張ってみたところで、どこで完成かという明確な線引きはできないんですよね。
数学と違って明確な答えがある問題ではないものを扱うわけで。
「内部でAIが動くプロダクトの開発」では、出来上がったものの評価が難しいケースが出てくるというのも自分にとって大きな発見でした。
ドメインはCloudFlareが良かった
さて、完成したらデプロイですが、せっかくなのでちゃんとドメインを取ろうと思います。1500円/年ぐらいだし。
claudeにいくつか選択肢を出してもらって、CloudFlareにしました。結果これは大正解でしたね。
後のフローでデプロイ後のドメイン設定、メールの設定が出てくるんですが、claudeも海外サービスの方が詳しいので指示が明確ですし、各種PaaSでもCloudFlare前提の設定UXが整備されていることがあるため非常にスムーズです。
何か特別な理由がない限りはCloudFlareでドメインを取ることをお勧めします。
本番デプロイ
先に結論: Railwayはいまいち。Fly.ioが最高
無料で行けるPaaSということで最初Railwayを使ってみました。アカウント作ってGUIからポチポチっと設定して〜とやっていたんですが、なぜかアセットコンパイルが走らない、、、マイグレーションも、、
諸々やって進んでは後退を繰り返しますがなかなかうまくいかず・・・結局こちらは諦めて終了。
厳密な検証をしたわけではないんですが、docker-composeで定義されたものと自分でGUIから設定したものにどこか乖離があったりしたんじゃないかなと思います。
で、諦めてFly.ioを使ったらほぼ一発でいけました。
ローカルのclaudeに聞きながらCUIで設定していって、途中 $ fly logs などで状況が簡単に確認できるし体験が非常に良かったですね。
メールはResend
今回これが一番感動したかもしれない。こちらの記事 (https://zenn.dev/oratake/articles/freecompanymail-on-cloudflare) を参考に設定していったんですが、ドメイン入力しただけでCloudFlareのものだとResendが認知してくれて、ボタン一発で設定が全部完了しました。
メール使うのにかかった手間がリアルに3分ぐらいでしたね。
CloudFlare側でアカウント登録したときも同じように数分だったし、この辺の体験の良さは流石だなと思いました。
まとめ
振り返ってみて、本当に自分でコードを書かなかったなと思います。文言調整したぐらいです。記事中の通りプロンプトの調整は自分で頑張りましたが。(ここだけはAIに直してもらったものがあんまりハマらないことが多かった)
構成がシンプルなサービスなのはもちろん、Railsの制約(CoC) はAIがコードを書く上でプラスに作用しているのかなと思います。
開発に要した期間としては、おおよそ以下のような感じです。
- 大枠の決定: 30分 (ただ、これはきっかけ〜実際に着手までは含まず)
- 環境構築: 1h (デバッグ含む)
- 初期の実装: 1day (入力画面が大体動く)
- プロンプト検討: 4day
- 仕上げの実装: 1day
- デプロイ周りの整備: 1day
- 認証機構の実装: 0.5day
着手前の検討とか、そもそも「こういうのあったらいいかもな〜」と妄想してる時間もまあまああったので、本当にゼロからスタートするとしたらこの倍は見てもいいかもしれません。
今回は、(すでにあるような車輪の再発明ではない)一通りの体験が形になるサービスを、スタートから終わりまで自分で考え、作って、確認し、デプロイするという作業をAI伴走で完遂しました。
これを終えて一番良かったと思う点は
作業のどこでどういうボトルネックが発生するのか、考える部分や確認するところではどういう手間・やりづらさが発生するのか、みたいなのをちゃんと手を動かして経験できた
というところです。
私は普段バックエンドエンジニアというポジションなので、仕事ではどうしても開発するという行為が時間の多くを占めます。
が、今回のリリースまでの一連を終えてみて、普段自分が関わることの少ない部分でどういった苦労があるのかや、AIを使ってそれらをスムーズにする可能性がまだまだ眠っていそうだなと気づけたのは非常に大きかったです。
また同時に、純粋にプログラミングする部分のコストはAIによってものすごく小さくなったなと思いました。
作っていく段階での検証やちょっとした修正などは入るので、現時点ではエンジニアの作業が必要ですが、今後はこういう仕事はどんどんシュリンクしていくだろうなというのは想像に難くありません。
サービスを価値あるものにするために、どうやってデリバリーしていくのか。
開発者としてそこにどういう貢献ができるのか。
色々と考える良いきっかけになった個人開発でした。
Discussion