下記のreddit
を日本語にしたものです。
はじめに
私は個人プロジェクトでコードを書く際、特に自動化のためのものを書く際には、AI を活用しています。この点について、人によって意見が分かれるようです。同じように AI を使っている人もいれば、AI が良いコードを書くことは不可能だと考える人もいます。私の分野の専門家の間でも同様の考え方に遭遇し、AI の使い方が人によって異なるのかもしれないと気づきました。
私自身のバックグラウンドですが、私は開発マネージャーであり、業界で長年の経験を積み、大学院でもソフトウェア開発を学んできました。ですので、このガイドは素人ではなく、大規模システムの構築と運用に関するかなりの経験を持つ者の視点から書かれていることをご理解ください。
また、「なぜこんなことをするのか、AI にコードを求めればそれで十分だ」と思われるかもしれません。このガイドは、クリーンで保守性が高く、あなたが書けるベストなコードを使った大規模システムを構築するためのものです。確かに冗長な作業もありますし、まだまだ多くの作業が残っています。しかし、私の経験では、これによって個人的な開発のスピードが上がっただけでなく、開発が本当に楽しくなり、疲れることなく何時間もの間、機能を作り出すことができるようになりました。
AI を使った開発のルール
まず、AI を使ってコーディングする際に最大の効果を得るために従うべきルールを紹介します。
-
コンテキストは低く保つ。ほとんどの AI はコンテキストが大きくなると品質が低下するため。新しい会話をこまめに行い、既存のメッセージを編集して、コンテキストを再利用するようにする。例えば、AI がコードの塊を生成し、それについて質問がある場合、フォローアップしてその質問をする。そして、2つ目の無関係な質問がある場合は、最初の質問を編集して2つ目の質問に置き換え、その後で AI の回答を再生成する、といった具合です。
-
AI にコードをレビューさせる際は、新しいチャットで行い、そのコードを書いたのは別の AI だと伝える。あなたでも、そのAIでもなく、別の AI だと。私のプロンプトは通常、次のようなものです。「私は別の AI に以下の要件を提示しました [要件をここに書く] このコードを批判的にレビューし、必要に応じてリファクタリングしてください」。私が書いたと言うと、LLM はあまりにも優しくなりすぎるし、彼らが書いたと言うと二重に主張してしまうことがわかっています。
-
これは単に時間の節約だけでなく、精神的なエネルギーの節約にもなります。つまり、開発者が特定のタイミングでのみ関与するように、開発者の努力をできるだけ節約するワークフローを作成するのです。「なぜ見直す前にこの余分なステップを踏むのか」と思うかもしれませんが、AI は2分以内に回答を出せるのに対し、人間のレビューには5~10分かかることがあり、そのエネルギーを使うことになります。疲れてしまうでしょう。開発者が取り組む前に、AI の時間を使って正しく仕上げておきたいと思います。
-
AI に全面的に頼らないこと。AI をジュニアデベロッパーのように考えてください。大規模なアプリケーションをジュニアデベロッパーに任せて、レビューもしないでいいでしょうか?もちろんそんなことはありません。AI を使えば、小さな箱の中にジュニアデベロッパーがいて、あなたの求めるコードを何でも書いてくれるのです。そのジュニアデベロッパーを適切に使えば、大きな利益を得ることができるでしょう。
重要な注意事項
私は常に2つの AI を使います。常にです。ローカルの AI がない場合は、Mistral が無料で le chat を提供していますし、無料の chatgpt 3.5 を使うこともできます。Claude Opus や ChatGPT 4 Turbo のような高機能のサブスクリプションを持っているなら、なお良いでしょう。
私はいくつかの理由からローカルの AI モデルを好んでいますが、WizardLM-2 8x22bのようないくつかのモデルの品質は ChatGPT 4 に匹敵します。ただ、手持ちのもので最も使い慣れているものを使ってください。
1つだけ使うこともできますが、モデルによってトレーニングが異なるため、気づかないこともあるかもしれません。
フェーズ1: アーキテクチャ
AIはアーキテクチャが苦手なので、ほとんどがあなた次第です。内部メソッドやヘルパーメソッドのレベルまで深く掘り下げる必要はありませんが、少なくとも以下のことは文書化しておきましょう。
1. プロジェクトは何についてのものか?
プロジェクトの要件は何か、AIに質問するたびに繰り返し伝えられるような簡潔な形式で。
2. 「完了」とはどのような状態か?
これは本当にあなたのためのものです。スコープクリープは惨めなものですし、ステークホルダーとしてあなたを抑える人はいません。信じてください。私の現在のプロジェクトは数週間前に終わっているはずだったのに、機能を追加するのを辞められないでいます...。
3. どのようなクラス/モジュール/パッケージが存在すべきか?
プログラムの概要を頭の中で整理してください。それぞれが何を担当するのか?どのように流れるのか?
4. 大まかに、それぞれにどのようなメソッドを持たせるべきか?
LoggingService を持っている場合、"Log(message)"メソッドが必要でしょうか?FileManagerService を持っている場合、"ReadFile(fileName)"や"ReadFile(filePath)"、あるいは他の何かが必要でしょうか?
このフェーズでは、#1と#2の答えをAIに提示し、アーキテクチャの内訳を尋ねることができますが、その答えをそのまま使わないでください。これは単にメンタルブロックを乗り越え、考えるべきことを与えるためのものです。自分でアーキテクチャを書きましょう。大きな理由は、何よりもあなた自身がこのプロジェクトの構造を隅々まで知る必要があるからです。自分でアーキテクチャを書かなければ、プロジェクトを把握するのが難しくなるでしょう。
フェーズ2: コーディング
以下は私が使っているワークフローです。多くの人にとって、これは不必要に多くのステップのように感じられるかもしれませんが、私にとっては今のところ最高の品質をもたらしてくれており、開発のスピードを大幅に上げてくれています...特に、私がそれほど詳しくない言語(私はC#開発者なので、Pythonなど)で作業をする際には。
確かに、AIにコードを求めてそのまま進めば、これから言うことよりもはるかに早くコードを得ることができますが、私の目標はここでは品質、開発者のコードに対する理解、開発者のコーディングスタイルへの適合なのです。私はクリーンで保守性が高く、スケーラブルで、他の開発者が見てもせめて燃やしたくならないようなコードを書きたいと思っています(笑)
注意: AIとの会話で最初のコーディングプロンプトを作る際、ほとんどの場合、上記のアーキテクチャの#1の答え、つまりプロジェクト全体の要件の内訳を含めます。そのコンテキストがあると、あなたが達成しようとしていることをAIがよりよく理解するのに役立つことがあります。
ステップ1:
アーキテクチャを見直し、機能を選ぶ。
ステップ2:
最初のAI(どちらを先に使ってもかまいません)に要件を提示し、クラスの概要と作成したい主要なメソッドを提示する。私は通常、次のようなプロンプトを作ります。「ファイルから読み込んでユーザーにその内容を提示するPythonコードを書いてください。'file_utilities'というモジュールの中に、'FileManager'というクラスを作り、ファイル名を受け取る'read_file'というメソッドを作ってください。そして、'display_utilities'というモジュールから呼び出して、'display_contents_of_file'というメソッドを作ってください。これはそのファイルの内容をコンソールに出力します。これらの要件を考慮して、批評や批判をし、解決策を書き出してください。他の方法の方が良いと思われる場合は、そう言ってください」。
ステップ3:
要件と回答をコピーする。新しいチャットを始める。両方を貼り付けて、別のAIにその解決策を書くように頼んだところ、その回答が返ってきたと伝える。批評してリファクタリングしてくれるよう頼む。
ステップ4:
要件と新しい回答をコピーする。AI #2(該当する場合)に行き、上記と同じ質問をする。
ステップ5:
最終的な回答を受け取り、自分でコードレビューをする。どう見えるか?明らかな欠陥は見当たらないか?変更したいことは?必要に応じてヘルパーメソッドの名前を変更する。不必要、込み入っている、冗長、あるいは単にコードの臭いがするように見えるかどうかを検討する。
最後のステップ:
コード、要件、そしてあなたのフィードバックをすべて持って、ステップ2から始めて、必要であればフローを最初からやり直す。
これは非常に時間がかかるように思えるかもしれませんが、このワークフローは時間と労力の両方を節約するのに驚くほど効果があると言えます。私は通常、一日の仕事が終わると疲れ果てていて、さらに4~5時間もコードを書く精神的エネルギーが単純にありません。そのため、個人的なプロジェクトを何年も先延ばしにしてきました。しかし、このようにすることで、労働部分をAIに任せながら、新鮮な状態で自分の仕事と大体同じ品質のものを得ることができるのです。
私が考えて、AIが努力する。
ステップ2、3、4は合計で5分程度、ステップ5はコードの量によって10~20分程度かかると思われます。もう一度ループすると、さらに15~25分かかります。つまり、1つの機能を作るのに20~60分程度かかるでしょう。しかし、ここで重要なのは、開発者であるあなたがコードをしっかりとコントロールしながら、どれだけ精神的エネルギーを節約できたかということです。
また、このワークフローがすべてに対して機能するわけではないことに注意してください。コンテキストの限界により、一部のタスクでAIを活用するのは単純に不可能な場合があります。例えば、6つのクラスが1つの機能のために協調動作していて、そのワークフローのどこかに奇妙なバグがあるが、どこにあるのかわからないと気づいたとします。おそらく、品質低下を伴わずにその量のコンテキストを扱えるAIは見つからないでしょう。そのような場合は、あなた自身の力が必要です。
とにかく、長くなってしまいましたが、これを提示したかったのです。このワークフローは私にとって驚くほどうまくいっており、今後も時間をかけて改良していくつもりです。
プロンプトの例
上記を参考にプロンプトを組んでみました。
コメント