目次
目的
昨今、AIによるコード生成の話題が非常に活発になってきており、その実力がどれほどのものなのか、実際に試してみたいという思いが強くなりました。本記事では、AI駆動開発の一端を体験した結果を共有します。
経緯
「AIがコードを書いてくれるらしい」という話を耳にする機会が増え、実際に開発現場でどの程度活用できるのか、また、どのような点に注意すれば上手く付き合えるのかを探るため、簡単なWebAPI開発をAIに依頼してみることにしました。
利用ツール一覧
今回の検証で利用したツールは以下の通りです。
項目 | 内容 |
---|---|
IDE | Cursor Pro |
利用モデル | Claude 3.7 Sonnet |
利用言語 | Python |
作成ツール | WebAPI |
やってみた結果
① 大雑把な指示での挑戦
最初に試したのは、「こんな感じのWebAPIを作って欲しい」といった、かなり大雑把な指示でAIにコード生成を依頼する方法です。
結果:
- 生成コードの不安定さ(ガチャ要素): 実行するたびに全く異なるコードが生成されました。まるでガチャを引いているような感覚で、期待する出力が得られるかは運次第でした。
- 参照テーブル項目名の変動: 生成されるコード内で参照しているデータベースのテーブル項目名なども、実行のたびに変わってしまうことがありました。
これでは実用は難しいと感じ、次の手を試すことにしました。
② ProjectRuleの導入と課題
次に、Cursorの機能であるProjectRule
(プロジェクト固有のルールやコーディング規約をAIに認識させる機能)を設定して、コード生成を試みました。
結果:
- ルールの読み飛ばし: ルールの記述量が多くなるほど(特に数百行を超えるような場合)、AIがルールの一部を読み飛ばしてしまう現象が発生しました。指示したはずの規約が守られていないコードが生成されることがありました。
- ルールのバランスの難しさ: 逆にルールが少なすぎると、結局①の「大雑把な指示」と変わらず、生成されるコードの品質が安定しませんでした。
ProjectRule
は有効な機能だと感じましたが、ルールの量や記述方法には工夫が必要そうです。
③ ProjectRuleの分割
ProjectRule
の読み飛ばし対策として、ルールを複数のファイルに分割し、必要なものだけを都度読み込ませる方法を試しました。
結果:
- コンテキスト数の限界?: 読み込ませるルールファイルが複数になったとしても、AIが一度に処理できるコンテキストの総量には限りがあるようで、結局ルール全体の量が多ければ読み飛ばしは依然として発生しました。分割自体が直接的な解決策にはなりませんでした。
④ 指示の分割による品質向上(成功例)
これまでの試行錯誤を踏まえ、AIへの指示の出し方を変えてみることにしました。一度に全ての機能を作らせようとするのではなく、タスクを細分化し、複数回の命令に分けて実行する方法です。
具体的な指示の例:
- 最初の指示: 「指定のテーブル構成に基づいて、Value ObjectとEntityクラスをPythonで作成してください。」
- 次の指示: 「先ほど作成したEntityを使用して、データベースからデータを取得・永続化するためのRepository層のコードを記述してください。」
結果:
- 安定した品質のコード生成: この方法を試したところ、生成されるコードの品質が格段に安定しました。
- 再現性の向上: 同じ指示を複数回実行しても、ほぼ同様のコードが生成されるようになり、予測可能性が高まりました。
まとめ
今回のAI駆動開発の試行錯誤を通じて、以下の点が重要だと感じました。
- 一発で完璧を求めない: AIに一度の指示で完璧なコードを生成させようとするのではなく、タスクを細かく分割し、段階的に指示を出す方が、結果的に品質の高いコードを安定して得られます。
- プロンプト内でもステップバイステップで: 1回のプロンプト(指示)の中でも、処理のステップを明確に区切って指示することで、AIが意図を理解しやすくなり、生成結果が安定する傾向にありました。
- 曖昧な指示は避ける: 大雑把なプロンプトでは、意図しないコードや品質の低いコードが生成されやすく、結果として手戻りが多くなります。具体的な指示を心がけることが重要です。
-
ProjectRuleの量に注意:
ProjectRule
は非常に有効な機能ですが、記述量が多すぎると(筆者の感覚では200行程度でも)AIがルールを読み飛ばしてしまうことがあります。本当に必要なルールに絞り込むか、指示の中で都度重要な点を強調するなどの工夫が必要かもしれません。
AI駆動開発は、まだ発展途上の技術ではありますが、上手く特性を理解し、付き合い方を工夫することで、開発の生産性を向上させる大きな可能性を秘めていると感じました。今後も引き続き、より効果的な活用方法を模索していきたいと思います。