カテゴリ
LLM
ステータス
研究中技術スタック
モデル
良いプロンプトを書くことは、いまだに職人的な作業として残っている。この研究実験では、進化的アルゴリズムでプロンプトエンジニアリングを自動化した。基準となるプロンプトとスコア関数を起点に、突然変異、交叉、選択を繰り返して、自分の評価スイートに対する性能を最大化していく。遺伝的アルゴリズムを、自然言語の指示に適用する試みである。
20個のプロンプト候補からなる個体群で、1サイクルあたり15世代を回す遺伝的アルゴリズムを実装した。突然変異には言い換え、指示の並べ替え、例の入れ替え、制約の追加や削除、書式の変更を含む。交叉は2つの親プロンプトから高得点の部分を組み合わせる。選択はトーナメント方式で、上位2つは常に生き残るエリート保存を併用する。分類の精度、JSONスキーマへの準拠、コード生成の通過率、要約の質、抽出の適合率という5つの課題で検証した。各課題には汎化を測るためのテストセットを別に用意した。
Pythonが、突然変異の演算子を設定可能な形で持つ遺伝的アルゴリズムを実装する。DSPyが比較の基準と一部の突然変異の要素を提供する。DeepEvalが課題ごとの指標でプロンプト候補を採点する。Streamlitが世代ごとの適応度のグラフで進化の過程を可視化する。Redisが並列の評価ジョブをキューに入れる。
この実験から得られた、もっとも重要な知見です。
人が書いたプロンプトより平均15%高い精度
5つの課題を通じて、丁寧に手で書いたプロンプトに比べ平均15%の精度向上が得られた。最大の伸びはJSONスキーマへの準拠(+23%)で、否定的な例を加えると書式の誤りが劇的に減ることを最適化器が見つけ出した。
言い回しよりも構造が効く
最適化器が一貫して収束したのは、巧みな言い回しではなく構造のパターンだった。指示の順序、例の置き場所、制約の具体性である。プロンプトエンジニアリングは創作というより情報設計に近い。
過学習は現実の危険
テストセットを分けずに進めると、学習用の評価では28%改善したのに対し、未知の例では8%しか改善しなかった。テストセットの分離は不可欠で、プロンプトの過学習はモデルの過学習とよく似ている。
DSPyは手強い比較対象になる
DSPyの自動プロンプト最適化と比べると、単純な課題では同程度だったが、離散的な構造変更が絡む複雑な多段プロンプトでは、DSPyの勾配ベースの最適化を上回った。
最適化のループはこう進む。1つ目は初期化で、基準となるプロンプトから多様な突然変異によって20個の候補を作る。2つ目はDeepEvalを使ってスコア関数に対して各候補を評価する。3つ目はトーナメント選択で親を選ぶ。4つ目は交叉と突然変異で子を作る。5つ目は下位の候補を子で置き換える。これを15世代繰り返す。最良のプロンプトは別に取り分けたテストセットで検証する。Streamlitのダッシュボードでは、適応度の推移、突然変異の種類ごとの効き方、プロンプトの差分を確認できる。
5つの課題で平均15%の精度向上。単一の最大改善はJSONスキーマ準拠の+23%。汎化のギャップは平均7%で、学習側の28%の改善に対し、適切な正則化のもとでテスト側は21%の改善だった。1回の最適化は約45分で、API費用は約$12。5つの課題のうち3つでDSPyを上回った。
検証を進めるうえで解決が必要だった技術的な課題です。
評価のコストとレイテンシ
20候補 × 50件の評価例 × 15世代で、1回の最適化に15,000回のLLM呼び出しが必要になる。変わっていない部分のスコアを再利用する賢いキャッシュと、8並列の評価を導入し、実時間を6時間から45分へ短縮した。
突然変異の質のばらつき
無作為な突然変異は意味の通らないプロンプトを生み、評価の予算を無駄にすることが多い。高速なモデル(GPT-3.5)で突然変異の一貫性を採点し、高価な評価の前に約30%を弾く事前フィルタを実装した。