🧬

進化的アルゴリズムで自動プロンプトエンジニアリング

2024/07/21に公開

本記事の内容

プロンプトエンジニアリング×進化的アルゴリズム

ChatGPTなどのLLMから正確な回答を引き出すには、プロンプトエンジニアリングが重要です。
しかし、効果的なプロンプトを作成するには多くの試行錯誤が必要で、多くの時間と労力を費やす必要があります。

そこで近年注目されているのが、プロンプトエンジニアリングを自動化する技術です。

本記事では、進化的アルゴリズムを使った自動プロンプトエンジニアリング手法「EVOPROMPT」を紹介します。

出典は、ICLR2024にも採択されたこちらの論文です。

https://arxiv.org/abs/2309.08532

アルゴリズムの内容

進化的アルゴリズムの主な手法として、

  • 遺伝的アルゴリズム(GA; Genetic Algorithm)
  • 差分進化(DE; Differential Evolution)

が挙げられます。本論文では、この2つの手法それぞれを用いてプロンプトエンジニアリングを行っています。

遺伝的アルゴリズム(GA)の場合

1. 初期化

まず初期集団として、N個のプロンプト集合をP_0 = \{p_1, \cdots p_N\}とおきます。
また、それぞれのプロンプトp_iを使ったときのLLM出力に対する評価スコアs_iを割り当て、S_0 = \{s_1, s_2, \cdots, s_N\}としておきます。

2. 繰り返し処理

以下の操作を、T回だけ繰り返します。ただし、「t」は繰り返し回数(t=1,\cdots,T)。

  1. Selection

    • 現在のプロンプト集合P_{t-1}から、2個のプロンプトp_{r_1},p_{r_2}を親プロンプトとして選択します。
    • 選択の方法としては、ルーレット選択、トーナメント選択、ランダム選択が考えられますが、本論文ではルーレット選択を用いています。
      ルーレット選択とは

      ルーレット選択では、スコアs_iの分布に従ってプロンプトをランダムに選択します。
      つまり、プロンプトiが選ばれる確率を

      \displaystyle p_i = \frac{s_i}{\sum_{j=1}^{N}s_j}

      として、スコアが高いプロンプトほど選ばれやすくなるようにします。

  2. Evolution

    • 選ばれたプロンプトp_{r_1},p_{r_2}をもとに、遺伝計算を行って新プロンプトp_i'を生成します。
    • 遺伝計算では、LLMを使います。具体的には、下の画像のようなプロンプトをLLMに与えて交叉(cross over)と突然変異(mutation)を行います。
      • Cross Over:
        • 2つのプロンプトp_{r_1},p_{r_2}を与えて、「これらのプロンプトを交叉させなさい」と指示する。
      • Mutation:
        • 「上記で交叉させたプロンプトを突然変異させたものを<prompt>と</prompt>で囲って出力しなさい」と指示する。
  3. Evaluation:

    • 新プロンプトp_i'を評価して、そのスコアをs_i'とします。

以上のSelectionからEvaluationまでの操作をN回繰り返します(i=1,\cdots,N)。

  1. Update:
    上記N個の結果を、現在のプロンプト集合P_{t-1}とスコア集合S_{t-1}にガッチャンコし(要素の数は2N個になる)、スコアが上位N個のプロンプトのみを保持します。つまり
\begin{align*} S_t \leftarrow \text{Top-}N(S_{t-1}\cap\{s_1', s_2', \cdots, s_N'\})\\ P_t \leftarrow \underset{\text{using }S_t}{\text{Top-}N}(P_{t-1}\cap\{p_1', p_2', \cdots, p_N'\}) \end{align*}

3. 終了処理

上記の繰り返し処理が終わったら、プロンプト集合P_Tから最もスコアの高いプロンプトをベストプロンプトp^*として出力します。

差分進化法(DE)の場合

1. 初期化

初期集団として、N個のプロンプト集合をP_0 = \{p_1, \cdots p_N\}とおきます。
また、それぞれのプロンプトp_iに対してスコアs_iを割り当て、S_0 = \{s_1, s_2, \cdots, s_N\}としておきます。

2. 繰り返し処理

以下の操作を、T回だけ繰り返します。ただし、「t」は繰り返し回数(t=1,\cdots,T)。

現在のプロンプト集合P_{t-1}からプロンプトp_iを順に取り出し、以下の操作を行います。

  1. Sample donors

    • 2個のプロンプトp_{r_1},p_{r_2}(r_1\ne r_2 \ne i)を親プロンプトとしてP_{t-1}からランダムに選択します。
    • 選択の方法としては、GA同様にルーレット選択を用いています。
  2. Evolution

    • プロンプトp_i,p_{r_1},p_{r_2}と現時点でのベストプロンプトp_\text{best}をもとに、差分進化を用いて新プロンプトp_i'を生成します。
    • 差分進化では、親プロンプトp_{r_1},p_{r_2}から差分を取り、それを突然変異させたものをプロンプトp_iに足します。最後に、現時点でのベストプロンプトp_{\text{best}}と交叉させて新プロンプトp_i'を生成します。
    • 具体的には以下の画像のようになります(p_{r_1}:Prompt 1p_{r_2}:Prompt 2p_i:Prompt 3p_{\text{best}}:Basic Prompt)。
  3. Selection

    • 元プロンプトp_iと新プロンプトp_i'のスコアを比較して、p_i'の方が良ければp_ip_i'に置き換えます。

3. 終了処理

上記の繰り返し処理が終わったら、プロンプト集合P_Tから最もスコアの高いプロンプトをベストプロンプトp^*として出力します。

実験結果

他のプロンプトと比べて精度はどうか?

手動プロンプト(MI, NI, PromptSource)や、自動プロンプト最適化手法(APE, APO)を様々なベンチマークデータセットに適用した結果が示されています。

  • 手動によるプロンプトや、従来の自動最適化手法よりも有意に精度が向上している。
  • 主観性分類タスク(Subj)では、精度がDEの方がGAよりも5ポイントも高い。GAよりもDEは局所最適に陥りづらく、初期プロンプトが高品質でない場合に有効

集団サイズを増やすと精度はどうか?

横軸が集団サイズ、縦軸が精度を示しています。左のグラフがSST-5(感情分類タスク)、中央がSubj(主観性分類タスク)、右がASSET(テキスト単純化タスク)の結果です。

概ね、集団サイズが大きくなるにつれて精度が向上していることがわかります。

また、グラフの縦軸のスケールを見てみると、Subj(主観性分類タスク)の場合は他の2つのタスクに比べて精度の上昇幅が大きいことがわかります。

論文では、比較的単純なタスクでは集団サイズを大きくしてもあまり効果は得られないが、複雑なタスクでは集団サイズを大きくすることで精度が向上するのではないかという考察がなされています。

もちろん、集団サイズを大きくすると計算コストが増えるので、その辺りのトレードオフも考慮する必要があります。

繰り返し回数を増やすと精度はどうか?

横軸が繰り返し回数、縦軸が集団全体のベストスコア(実線)と平均スコア(点線)を示しています。

いずれのデータセットでも進化が進むにつれてスコアがきちんと向上していることがわかります。

繰り返し数に伴ってプロンプトはどのように変化するか?

左のグラフがプロンプト長の平均値、中央がプロンプト長の分散、右が変異した新しい単語の個数を示しています。

特徴としては、DEの方がGAよりも長いプロンプトを生成しており、長さのばらつきも大きいことがわかります。

また、右のグラフの終盤を見ると、DEはGAよりも多くの新しい単語を変異させていることがわかります。これはDEは局所最適から脱出できる可能性がGAよりも高いことを示唆しています。

最適化後のプロンプト具体例

上記は、論文のTable 14で示されているプロンプトの具体例の抜粋です。

日本語に翻訳するとこんな感じです。

  • Manual Prompt:

    主観性分類タスクを実行してください。文が与えられたら、['主観的', '客観的']からラベルを割り当ててください。他のテキストを入れずに、ラベルだけを返してください。

  • Natural Instruction:

    このタスクでは、レビューの文章が与えられます。その文の意見が主観的であれば「主観的」、客観的であれば「客観的」と分類するタスクです。

  • EVOPROMPT:

    レビューや意見の主観性を示すための入力と出力のペアを作成し、客観的な入力と主観的な入力を区別しながら、個人的な意見の例や主観的な見解のイラストを作成して、判断や視点の主観性を示すことができるようにしてください。

最適化後はちょっと小難しい指示になっていますが、精度は49.75から77.60まで向上しています。なかなかすごいですね。

最後に

本記事では、進化的アルゴリズムを用いた自動プロンプトエンジニアリング手法「EVOPROMPT」を紹介しました。EVOPROMPTは、手動プロンプトと比較して精度が向上し、試行錯誤の時間削減にもなります。

また、開発フェーズだけではなく運用フェーズでも自動最適化は有用かもしれません。
新しいモデルを適用する前に、EVOPROMPTでプロンプトを自動で最適化してLLMの能力を最大限に引き出すことができそうです。

参考文献

[1] Guo, Qingyan, et al. "Connecting large language models with evolutionary algorithms yields powerful prompt optimizers." arXiv preprint arXiv:2309.08532 (2023).

https://arxiv.org/abs/2309.08532

GitHubで編集を提案
株式会社Deepcraft

Discussion