ChatGPTのようなLLM(大規模言語モデル)アプリケーションから、プロンプト(LLMに対する命令文)を通じて、満足のいく結果を得るのはそう簡単ではありません。そんなLLMに対してプロンプトをあれこれ工夫することで狙った通りに動かそうとすることを「プロンプトエンジニアリング」と呼んでいます。
今回は、この最適なプロンプトを自動的に入力しようとする技術的ムーブメントを、主に研究の観点からご紹介いたします。
(Source: ChatGPTで"自動的なプロンプトチューニングのイメージを出力して"というプロンプトで出力)
プロンプトエンジニアリング
プロンプトエンジニアリングが広く知られるようになったのはChatGPTが登場してからですが、アカデミアの世界で知られるきっかけとなったのは、2020年にOpenAIがGPT-3を紹介した “Language Models are Few-Shot Learners (Brown et at., 2020)” という論文でした。
LLMは、我々がコンピュータに期待するような「正確な計算」が苦手です。例えば、以下のような複利計算のタスクを与えると、間違ってしまうことがあります(GPT-4oで実験すると正解を出すことができましたが、GPT-3やGPT-3.5の時代にはこれくらいのタスクで間違ってしまっていた気がします)。
Q:ビルは、月曜日に$200を銀行口座に預けました。火曜日にはその金額の10%の利息を得ました。水曜日にはさらに$100を預けました。木曜日にも同じ%の利息を得ました。ビルの口座には合計でいくらありますか?
A: ビルの口座には合計で$330あります。(正しくは$352)
一般的に、上記のようなケースでは、CoT(Chain-of-Thought)という手法が有効です。CoTは、2022年に発表された論文 “Chain-of-Thought Prompting Elicits Reasoning in Large Language Models (Wei et al., 2022)” で紹介され、現在のプロンプトエンジニアリングに大きな影響を与えています。
CoTを発生させるために「ステップバイステップで考えてください。」という有名なフレーズがあります。上の例では少々複雑な文章問題に対して一発で回答を出そうとしたために間違ってしまいましたが、「ステップバイステップで考えてください。」というフレーズを加えるだけで、LLMが順を追って段階的に思考し、最終的に正しい答えに辿り着く確率が格段に高まります。
Q:ビルは、月曜日に$200を銀行口座に預けました。火曜日にはその金額の10%の利息を得ました。水曜日にはさらに$100を預けました。木曜日にも同じ%の利息を得ました。ビルの口座には合計でいくらありますか?ステップバイステップで考えてください。
A:
月曜日:ビルは$200を銀行口座に預けました。
火曜日:ビルの口座の金額の10%の利息を得ました。$200の10%は$20です。したがって、火曜日の終わりにはビルの口座には$220があります。
水曜日:ビルはさらに$100を預けました。これにより、口座の合計は$220 + $100 = $320になります。
木曜日:木曜日には、水曜日の終わりの合計額$320の10%の利息を得ました。$320の10%は$32です。したがって、木曜日の終わりにはビルの口座には$320 + $32 = $352があります。
結論:ビルの口座には合計で$352があります。
ChatGPTが普及した2023年初頭からプロンプトエンジニアリングの研究が爆発的に増えています。プロンプトエンジニアリングの手法を知ることは効果的なLLMの活用に重要ですが、私たちが手作業で最適なプロンプトを作成するのは、何度も何度もプロンプトを実験したり、研究レベルまで踏み込んでLLMの特性を把握したり、そう簡単ではありません。そこで、面倒なプロンプトエンジニアリングすらLLMにやらせてしまう、プロンプトエンジニアリング自動化に対する期待が集まっています。
BERT時代のプロンプト自動生成
BERTというのは、Googleが2018年に公開した言語モデルです。Transformerという、GPTシリーズでも用いられているアーキテクチャが採用されており、それまでの言語モデルに比べて文脈把握能力が高い点で画期的でした。
そのBERTの仕組みを参考に、効果的なプロンプトを自動生成する方法を提示したのが、"AutoPrompt: Eliciting Knowledge from Language Models with Automatically Generated Prompts"という論文です。
AutoPromptは、LLMを利用したプロンプト生成ではなく、あくまでいくつかのキーワードを機械的に組み合わせてプロンプトを生成するという手法です。
前提として、この研究ではマスク言語モデル(Masked Language Model、MLM)が用いられています。マスク言語モデルは、一部がマスクされた文章の穴埋めを得意とします。事前学習中にテキストの一部を隠し(マスクし)、その隠された部分を予測するタスクで学習するため、このような構造になっています。(私たちが慣れ親しんだChatGPTのような「会話の続きを補完するようなモデル」ではないため、例に違和感があるかもしれません。)
(マスク言語モデルの入出力例)
お昼に食べるなら ████ がいいです。
“ハンバーガー”: 35%
“ラーメン”: 30%
“サンドイッチ”: 20%
“うどん”: 13%
“サラダチキン”: 2%
マスク言語モデルを利用して、任意の文章がpositiveであるかnegativeであるかを分類させるタスクを考えてみます。
(positive / negative 分類タスク)
Prompt:"a real joy."という文章の表す感情はpositiveかnegativeかでいうと、████ です。
████ = positive
AutoPromptは、トリガートークンを用いたマスクされた言語モデル(MLM)のプロンプトエンジニアリングの手法です。ここでいう「トリガートークン」とは、モデルの予測を導くために選ばれる特定の単語やフレーズのことです。トリガートークンをランダムに選択し、stimulating, tranquil, bustling のように組み合わせることで 感情分類タスクをこなすためのプロンプトにします。
感情ラベル付与済みの分類対象文
"a real joy." = positive
"The concert was absolutely amazing." = positive
"The meal was disappointing." = negative
"I felt utterly bored during the lecture." = negative
トリガートークンの候補
delighted, comfortable, joyful, satisfied, elated, peaceful, vibrant, lively, serene, welcoming, relaxing, festive, energetic, harmonious, cozy, stimulating, tranquil, bustling, soothing, cheerful
テンプレート
{分類対象文} [トークンA], [トークンB], [トークンC] ████
例1
"a real joy." extremely, feeling, atmosphere ████
████ = positive
例2
"The concert was absolutely amazing." peaceful, vibrant, lively ████
████ = positive
例3
"The meal was disappointing." relaxing, festive, energetic ████
████ = negative
例4
"The meal was disappointing." bustling, feeling, soothing, ████
████ = negative
AutoPromptにおける「トリガートークン」は、実際にはモデルが予測する際に使用される単語やフレーズの集まりです。モダンなプロンプトエンジニアリングでいうところのプロンプトは完全な文章をイメージしますが、AutoPromptの場合は単語やフレーズの集合をプロンプトの主要な部分に挿入しています。
(Source: https://arxiv.org/abs/2010.15980)
感情ラベル付与済みの分類対象文を作成する部分だけ人手で行えば、事前にラベリングされた感情ラベルと同じように分類されるトリガートークンの組み合わせを見つけ出すプロセス自体は自動で行うことができます。これがAutoPromptが"AutoPrompt"と言われる理由です。
GPT時代のプロンプト自動生成
GPT登場以降、LLMによる自動的なプロンプトエンジニアリングを総称してAPE(Automatic Prompt Engineer)と呼ばれるようになってきました。APEは “Large Language Models Are Human-Level Prompt Engineers (Zhou et al., 2022)” という論文で紹介されました。
APEのおおまかな流れは以下のようになっています。
あるタスクについてのプロンプトをLLMにより複数個生成
生成したプロンプトをそれぞれ実行
実行結果を評価
評価が高かったプロンプトをもとに、それを少し書き換えたプロンプトを生成
再度評価し、その中で最も評価の高いものを採用
"Large Language Models Are Human-Level Prompt Engineers (Zhou et al., 2022)”に端を発するAPEのなかで代表的なものをピックアップしてみます。
既出ですが、CoT (Chain-of-Thought) は、問題の回答をすぐに求めるのではなく、中間推論のステップを経て、連鎖的な思考で解答に導く手法です。CoTは、一般的なプロンプト手法である、Few-shotプロンプト(いくつかQ&Aの例を含めることで推論精度を高める)が基本ですが、例を用いないZero-shotプロンプトにおいても高い精度を出すことが可能です。一方、CoTは中間推論のプロンプトを示す必要があり、そのプロンプト生成に時間がかかるという問題がありました。Auto-CoTは、中間推論のプロンプトを自動的に見つけることで、CoTの推論精度の高さと運用コストの低さを実現することができるアプローチです。
OPRO (Optimization by PROmpting) は、Google DeepMindから2023年9月に発表された、LLMを用いて最適化問題に取り組むアプローチです。最適化問題とは、特定の条件下で目的関数を最大化または最小化する解を見つける問題です。この研究では、ユーザーが最適化問題を自然言語で記述すると、Optimizer LLMがその問題に対する解を生成し、LLMがその解をスコアリングし、その解とスコアを基にさらに優秀なプロンプト(自然言語)を生成するプロセスを構築しています。OPROの中心となるのは「meta-prompt」と呼ばれる機構で、過去のプロンプトが特定のタスクを解決するのにどれくらい有効だったのかを評価します。これに基づいてLLMがより改善されたプロンプトを生成し、得られた回答をさらにスコアをつけて評価し、さらにmeta-promptで改善する、といった自動改善プロセスをが繰り返されます。
Promptbreederは、OPROのような自己改善プロセスと似ています。OPROとの大きな違いは、タスクプロンプト(回答生成のためのプロンプト)を進化させるためのプロンプトである「自己改善プロンプト(タスクプロンプトを改善するためのメタプロンプト)」の生成方法です。OPROはタスクプロンプトだけをアップデートする一方で、Promptbreederはタスクプロンプトだけでなく、自己改善プロンプトもアップデートします。
LEAPはPromptbreederと似ています。LLMの誤った出力と正解をLLM自身に比較させ、その誤った原因やそのタスクにおいて重要な法則を説明させることでプロンプトを改善する手法です。なぜ失敗したのかをLLMに考えさせてプロンプトを改善する手法となっています。これにより効率的により良いプロンプトを得ることができ、前述のAPEと比べ少ないサンプルデータでチューニングが可能となっています。
エージェントによるAPE
APEの各手法は概して優れた結果を残しており、APEによって最適化されたプロンプトを業務に活用できる日はそう遠くないかもしれません。そうなると、APEにかかる時間とコストを削減することが重要になります。
前述のOPRO、Promptbreeder、LEAPはいずれも最終的な回答を得るまでに時間がかかります。原因はいくつかありますが、主要な原因の1つは、最終的な回答を得るまでの探索過程が長くなっていることです。処理の時間を短縮するために、「いかに効率的に探索できるか」が鍵になってきます。
そこで登場したのがPromptAgentです。PromptAgentは、"PromptAgent: Strategic Planning with Language Models Enables Expert-level Prompt Optimization"という論文で示されました。
PromptAgentでは、モンテカルロ探索木(途中で不要な探索をやめ、ある程度の高確率で良い手を導ける探索アルゴリズム)を使用した効率的な探索により、より少ない試行回数で良いプロンプトを得ることができると言われています。
(Source: https://arxiv.org/abs/2310.16427)
プロンプトを変化させるアクション(a)について、それによりスコアがどう変化するかの報酬(r)を設定することによって、現在のプロンプト(St)から、次の変化(St+1)について、どのような方向性で変化させるべきか調整します。これにより、タスクに必要な内容(ドメイン知識、考える順序など)をより少ない試行で獲得できる、というアルゴリズムになっています。
(Source: https://arxiv.org/abs/2310.16427)
PromptAgentは複数の指標で、人が作ったプロンプトやAPEよりも良い成績を収めています。(下記の比較表で"Ours"という列)
(Source: https://arxiv.org/abs/2310.16427)
ちなみに、IEEE(Institute of Electrical and Electronics Engineers)が運営する雑誌メディアのIEEE Spectrumに、 “AI Prompt Engineering Is Dead” という記事が投稿されました。
少し勘違いを生みやすいタイトルになっていますが、“AI Prompt Engineering” は「手動プロンプトチューニング」のことを指しています。
つまり人間が頭を捻ってプロンプトチューニングをするよりも、APEの手法を用いて自動で作ったプロンプトの方が良い成績を納める場合がある時代になってきたということです。まだAPEは万能ではありませんが、今後さまざまなサービスに組み込まれていく概念であると思います。
IDATEN Ventures(イダテンベンチャーズ)について
フィジカル世界とデジタル世界の融合が進む昨今、フィジカル世界を実現させている「ものづくり」あるいは「ものはこび」の進化・変革・サステナビリティを支える技術やサービスに特化したスタートアップ投資を展開しているVCファンドです。
お問い合わせは、こちらからお願いします。
今回の記事のようなIDATENブログの更新をタイムリーにお知りになりたい場合は、下記フォームからぜひ IDATEN Letters に登録をいただければ幸いです。
Comments