7  PE:Prompt Engineering

ここで紹介する PE(Prompt Engineering)とは、LLM(大規模言語モデル)に対して適切な指示(プロンプト)を作成し、GAI(生成AI)の出力を最適化する技術のことです.プロンプトの指示は自然言語(英語や日本語)で行い,GAI に対してコード生成やレビューを行うことができます.

プロンプトは GAI に対する「仕様」のようなものであり,GAI を効果的に利用するために書き方のナレッジが必要です.どんな技術もその練度が必要であり,GAI についても例外ではありません.

ここでは,PE を実際に使用して得られた結果を報告した論文をもとに紹介します.その論文は “Benchmarking ChatGPT, Codeium, and GitHub Copilot: A Comparative Study of AI-Driven Programming and Debugging Assistants”(Ovi et al. 2024) で 2024 年 9 月末に発表されました.

7.1 論文の概要

3 種の GAI(ChatGPT, Codeium, and GitHub Copilot)を使って,仕様からコードを自動生成し,その評価を各 GAI および人間と比較した結果を報告しています.対象とした仕様は,様々な難易度と言語に対応し,公開されている LeetCode から,300 件を無作為に選択して行われました.

難易度は 3 種類:Easy, Medium, Hard です.どんな仕様なのかは,LeetCode サイト (ここをクリック) を開いて,View Questions > Expand で任意の分野や難易度ののを選択し確認できます.

7.2 結果はどうだったか

正解が得られた率(それぞれの難易度で 100 問の平均)と人間の平均(LeetCode サイトが公開している受講生の平均解答率)

解答率

7.3 実行効率(速度)やメモリ使用率は

実行時間 - 実行時間の比較 ヒトが作成したものの実行時間を 100 とし,どれだけ速いかを比較.

メモリ使用量 - メモリ使用比率 ヒトが作成したものの使用量を 100 とした比較.

7.4 どうやってコードを生成するか

flowchart LR

in1[1.コード<br>生成指示]
in2[3.仕様詳細]
in3[2.デバッグ<br>指示]
out1[コード]
out2[完成]
out0[エラー情報]
p0([コンパイル<br>実行])
p1([コード<br>生成])
p2([デバッグ<br>生成])

in1 --> p1 --> out1 --> p0 --> out0 --> p2 --> out2
in2 --> p1
p2 --> |ループ| p0
in3 --> p2
p1 -.-> |引継ぎ| p2
Figure 7.1: GAI を使ったコード生成のプロセス.

Figure 7.1 「GAI を使ったコード生成のプロセス.」に示す2段階の処理で生成している. 1. 仕様と生成に関する指示を書いたプロンプト 2. 生じたエラーメッセージとデバッグを指示するプロンプト

最大10回のループで解答が得られたものが正解としている.人間の場合,制限は設けていない.

7.5 論文で使われたプロンプト

2段階の処理のプロンプトは,以下の簡単なものが使われた.

  1. コード生成指示
    “You are an AI model specializing in generating C solutions for algorithmic problems. You will receive a problem description, input-output examples, code structure, and any constraints. Your task is to provide an efficient C solution based on the given problem.”
  2. デバッグ指示
    “You are an AI model designed for debugging C code. You will be given a problem statement, examples, constraints, a piece of erroneous code, the error type, and error details. Your goal is to fix the code and generate a correct solution in C.”

7.6 生成先のプログラミング言語を変えても生成

自然言語で書かれたプロンプトを操作すると,例えば次のような使い方ができる.

  1. 生成言語の変更
    プロンプトの「generating C solutions」を「generating CPP solutions」または「generating Java solutions」に変えるだけ.
  2. ECU のチップ変更
    用いるコンパイラーが異なるので,そのコンパイラーに変更し,エラーが出たらエラーコードをデバッグ指示に与える.
  3. 派生開発
    追加する機能や変更する機能を記述して生成する.

7.7 発展途上

この研究論文が公開されたのは2024年9月末で,実験は2023年末です.約1年間の進歩があるので,現在では,さらに性能が向上し,利用分野が拡大している.