はじめに
2024年5月13日に「GPT-4o」が発表され、プログラミングのコード出力もGPT4の精度のまま、GPT3.5と同じくらいの体感速度になった。
個人的にも、今まではGPT4を使っていた場合は、出力結果を待っているアイドル時間が、若干手持ち無沙汰で、その間他のことやることがあったのだが(思考がぶつ切りになってよくない)、GPT-4oになってそのようなことがなくなり、プログラミング速度も1.5倍程度早くなったように感じる。ありがたい。
今回は、自戒も込めて、ChatGPTをプログラミングで活用する際に注意すべきことをまとめておく。なお、プログラミングに限らず、全てに当てはまると思う。
急いては事を仕損じる:最初が肝心
「【ChatGPT】に与える良いプロンプトとは。良い結果を得るための6つの戦術」の記事でも記載したが、やはり最初が肝心で「明確で具体的な指示を書く」ことが最重要と感じる。
GPT-4oになり、さらなる全能感が出てきたものの、抽象的な指示を投げると、プログラミングの出力の結果が明後日の方向を向いているか、冗長になる。そして、その結果に、エンジニア側が振り回されて、結果を元に修正を繰り返すということになり、泥沼にハマることがある。
なので、いきなり、GPT-4oにコード貼り付けて「これをこうしたい」というふわっとしたプロンプトを書きたくなるものの、一旦そこは立ち止まって、どのようなアウトプットを期待したいのか、作成する機能・必要となる条件を細かく頭の中で整理する必要がある(意識・注意力の問題)。
従来のプログラミングの仕様を書く点と同じである。仕様ほどしっかりしたものである必要はなく、箇条書きレベルで全然良いが、本質である「条件と期待するアウトプットの明確化」は重要である。これはプログラミングに限らないが。どこをどう変更するかの全体像は事前に頭の中で思い描いておく必要がある。
最初に明確で具体的な指示を与えることで、最終アウトプットにまでかかる時間は、1/2にも1/3にもなると言っても過言ではない。
下記プロンプトが明確な指示という点で最適例ではないとは思うが、例えば下記のような感じで指示する。
ALTER TABLE users ADD COLUMN sleep_transition_time INT DEFAULT 10 COMMENT ‘おしゃべり設定:スリープモード移行時間’;
こちらで以前に、default10としてカラム追加したのですが、nullを許可して、default nullにしたいです。どのようなマイグレーションファイル生成コマンドを実行すれば良いですか
マイグレーションファイルを作成する際は、以下のようなコマンドを実行します。
$ cd migrations $ migrate create -ext sql -format 2006010215 <filename>
下記のような感じで回答してくれる。内容を確認して問題なさそうであれば、指示された通りに実行するのみ。
指示を明確化するためのプロンプトを、実際に指示する前に噛ませるのも良いと思う。
特に内容が複数ファイルにまたがる場合には、整理してから、該当部分のコードを貼り付けながらGPTに伝えるのが重要。まぁ、これも時間の問題で、GPT4搭載のCursorエディタでは(自分は使っていないが)、複数ファイルにまたがってコード提案をしてくれるとのことなので、具体的ではないプロンプト指示でもGPTが汲み取って、良い感じにコードを仕上げてくれる未来もそう遠くはないかもしれないが。
GPTが賢くなりすぎると、人間が考えることがなくなってどんどん脳みそが退化しそうだが(それでも別に結果出力できれば良いかもしれない)、まだ最初の指示のみは人間が考えて明確化したほうが最終アウトプットまでの時間は早そうである。
あとは、細かい文法規則を覚えたり参照したりして、書く必要は無くなったが、GPTが生成したコードが間違いがないかしっかり読んでチェックする能力は依然として必要。書けなくても読める必要はある。この時も、曖昧な理解のまま次に進むのではなく、生成したコードで少しでも不明な点や理解できない点があれば、都度gptに質問して疑問点を解消し、一歩一歩正確なコードを積み上げていく必要がある。
あやふやなまま次々に進めてしまって、最後に全部確認だと非効率だし、忘れしまうし、良いことがない。
API関連は公式ドキュメントを参照する
例えば、下記のようにプロンプト指示してみる。
ユーザーが入力したテキストに対して 「医療用語の誤りがあれば修正して、結果を出力してください」というプロンプトを使って、open ai apiを呼び出したpythonスクリプトを作成して
実際にGPT-4oが出力したコードは下記。
OpenAiの呼び出し方や、responseの取得の仕方が古いメソッド(openai.Completion.create())のままになっており、最新に対応していない。ちなみに最新は(OpenAI().chat.completions.create())で呼び出す。
https://platform.openai.com/docs/guides/text-generation
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "Who won the world series in 2020?"},
{"role": "assistant", "content": "The Los Angeles Dodgers won the World Series in 2020."},
{"role": "user", "content": "Where was it played?"}
]
)
ちなみに、最新のopen ai apiに対応するように、GPT4oに指示しても変更されていない。
仮に盲目的に出力コードの結果を信じて、実行すると当然エラーが出て「あれ、なんでだろう?」と振り回されることになる。
というわけで、API関連は、GPTが最新情報に対応していない場合があるので、公式ドキュメントを見て、usageを確認した方が早い。
おまじない
あとは、これは正直どれほどの効果があるのかA/Bテストをしたことがないので不明だが、プロンプトの最初と最後に下記指示を付け加える。
(冒頭)あなたはプロのエンジニアです。
(本文)プロンプト本文
(末尾)段階的に考えて、明確で正しい答えを出してください。
使い方によっては超優秀なアシスタント
明確な指示さえ与えることができれば、あとは自動でプログラミングコード書いてくれるので、各言語の細かい文法規則や関数宣言を覚えておく必要がなくなった点で、GPTは秀逸だと思う。
本当にうまくいけば、出力結果をそのまま貼り付けるだけで、うまく動作して終了となる。
あと、これは本件と関係ない些細なことだが、毎回gpt4は全コード出力しようとするので「修正部分のみ出力して」と伝えた方が、どこを変えたのか分かるのと、出力を待つ時間が減るので良い。