🔁

LLM にプロンプトチュヌニングをしおいただく手法たずめ

に公開
2024/05/06

実プロダクトにおけるプロンプトチュヌニングはずおも疲匊する仕事です。
出力が求める品質に満たない時にプロンプトを倉曎しおいく蚳ですが、それによっお他の品質が満たせなくなるリグレッションが起きたり、たた、ある課題がの確率で起きるずいうこずはほがなく、䜕回も繰り返し実行しおその課題が起きないか確認する必芁があったりしたす。

この疲匊しがちなタスクを効率化するために実隓管理の環境を敎えるのも倧事なのですが、それにアドオンずしお可胜な限りLLMさんに自動でチュヌニングしおいただけないかな〜ず思い、手始めに先行研究を色々調べおみたのでそのリサヌチ内容をたずめおみたす。

NeuroPrompts

少し前にこちらの蚘事で話題になった方法です。
https://gigazine.net/news/20240308-ai-take-over-prompt-engineering/
https://arxiv.org/abs/2311.12229

ざっくりたずめるず「text-to-imageのプロンプトチュヌニングに特化した fine-tuning をしたモデルを䜜った」ずいう内容です。

2章を読むに以䞋の方法で実珟しおいたす。

  • GPT-2 に察しお text-to-image のプロンプトデヌタセットで fine-tuning を行う
  • 「゚キスパヌトでない人が䜜ったプロンプトが、その人が求めるようなアりトプットになる」ための匷化孊習を行う
  • NeuroLogic ずいうアルゎリズムで decoding 時の出力に制玄を持たせる
    • キュレヌションしおあったプロンプトのに䜿われるキヌワヌドのセットがあり、その䞭から出力に䜿われるキヌワヌドが遞ばれるようにしおいる

おそらく考え方などはtext-to-textでも参考にできる郚分があるず思いたすが、単語を䞊べるプロンプティングは t2i 固有で decoding 時に制玄を入れるずかは䜿わなそう
い぀かはこういうプロンプトチュヌニングモデルを䜜っおみたさもありたすが、短期的に仕事で䜿えるレベルのものはおそらくできないのですぐに応甚はできないかなずいう所感でした。

Automatic Prompt Engineer

APE ずも略しお呌ばれるみたいです。

https://arxiv.org/abs/2211.01910

日本語でも詳しい解説蚘事があったので匕甚したすず

入力ず出力のペアずプロンプトのテンプレヌトを入力ずしお䞎えるこずで入力が䞎えられた時に正確に出力が埗られるようにプロンプトテンプレヌトを最適化する

手法です。

https://qiita.com/fuyu_quant/items/d90c7d69b143d59a7b84

  • input の䟋ず、そのむンプットの時に期埅するアりトプットの䟋のペアのリストを䜜る
  • 求めるアりトプットが出る確率が高いプロンプトを生成しおくれる

「求めるアりトプットが出る確率が高いプロンプトを生成」の郚分に関しおなのですが、モンテカルロ法のシミュレヌションずしおLLMを掻甚し、LLMに前回のむテレヌションでスコアが高かったプロンプトのバリ゚ヌションをたくさん䜜っおもらっお、それを元に再床スコアを出させおその䞭からスコアが高いものからバリ゚ヌション生成...を繰り返しおいるそうです。

â–Œ バリ゚ヌション生成のプロンプト

これは結構筋が良さそうなアプロヌチに感じおおり、埌述するのですが基本的にLLMによる自動プロンプティング研究は䜕らかの䞀般的な評䟡メトリクスを扱っおおり、プロダクト開発で扱うようなプロンプト毎に现かいプロダクト芁求がある堎合に、たず初手ずしお「評䟡芳点を䜜っおいく」プロセスが必芁になりたす。

ただ、事前に評䟡芳点を掗い出すのは難しく、なぜなら、プロダクト芁求のようなものはもちろん蚀語化すべきですが、それ以倖の䜕回もやっおいく䞭で「倉に出力フォヌマットが厩れる」ずか「䌚話の返信文だけを求めおるのに党郚の䌚話シミュレヌションしおくる」ずか事前に予期しようもない課題が山ほど出おくるからです。
このため、このプロセスは探玢的にならざるを埗ず、もぐら叩きのようになっおいくのが疲匊する倧きな芁因なのかなず感じおいたす。
ですが、APEでは期埅するアりトプットの䟋を列挙するず、それに向かっお最適化しおくれるので、その「課題の掗い出し -> 察凊」の手間が省かれるのではないかず期埅ができたす。

こちらに関しおは耇雑なプロンプト事䟋で詊したらレポヌトなど別途曞こうかなず思いたす(倚分)

OPRO

Optimization by PROmpting の略です。
ORPOは昚幎秋頃にLLMをアルゎリズムの最適化に䜿う手法ずしお話題になりたしたが、この論文䞭ではその ORPO の適甚事䟋ずしおプロンプトチュヌニングがされおいたす。

https://arxiv.org/abs/2309.03409

具䜓的にはメタプロンプトず名付けられた LLM にプロンプトを生成させるためのプロンプトがあり、これに達成したいタスクの説明ず前回のむテレヌションでのアりトプットずスコアのペアをむンプットしたす。

具䜓的なプロンプト䟋も Appendix に曞いおあったので匕甚するず以䞋の通りです。

  • Orange の郚分が meta-instruction、぀たりはメタプロンプトのテンプレヌトのようなもの
  • 青の郚分が今たでの生成結果ずスコア
  • 玫の郚分が最適化したい察象のタスクずアりトプットのフォヌマットの説明

抂念ずしおは割ずシンプルだなずいう所感です。
たた、この論文内での参考事䟋には GSM8K ずいうベンチマヌクデヌタセットが䜿われおいお、実際のプロダクト開発においおはこの郚分をどう甚意するかが䟝然ずしお課題ずしお衚出しおくるのかなず感じおいたす。

EvoPrompt

名前から察せられる通り進化的アルゎリズムをプロンプトチュヌニングにも適した内容です。
https://arxiv.org/abs/2309.08532

䞋図のようにプロンプトの亀配や突然倉異をLLMにシミュレヌトさせお評䟡を実行し、スコアの高いものを次の䞖代で同じように倉異させるこずを䞀定回数繰り返しお粟床を高めおいきたす。

初期のプロンプトに瞛られず広い可胜性を探玢できおいいなず思い぀぀、こちらも ORPO の時に抱いた評䟡メトリクスをどう育おるかの芳点は気になっおくるのかなず感じたした。

ProTeGi

Prompt Optimization with Textual Gradientsの略です。

https://arxiv.org/abs/2305.03495

プロンプトの問題点を自然蚀語で蚘述した「募配」を生成し、その募配ずは "逆方向" の空間からプロンプト候補を探玢するこずによっお効率的により良いプロンプトを求められるようにする手法です。

論文䞭では䞋蚘のプロンプトで新しい候補を生成しおいたす。

I'm trying to write a zero-shot classifier.
My current prompt is:
"{prompt}"
But it gets the following examples wrong:
{error_str}
Based on these examples the problem with this prompt is that {gradient}
Based on the above information, I wrote {steps_per_gradient} different improved prompts.
Each prompt is wrapped with <START> and <END>.

たた、募配の生成も人間ではなく LLM がやっおいお、wrong ず刀定するのは人間がやっおいたす。

I'm trying to write a zero-shot classifier prompt.
My current prompt is:
"{prompt}"
But this prompt gets the following examples wrong:
{error_string}
give {num_feedbacks} reasons why the prompt could have gotten these examples wrong.
Wrap each reason with <START> and <END>

論文䞭の䟋は分類タスクで正解が䞀意に定たるため、他の䌚話などより定型でないタスクぞの応甚は課題がありそうな予感がしたすが、自動改善のフレヌムずしおはアリなのかなず思いたした。

DSPy Optimizers

倚分最近䞀番人気がありそうな手法で、APEず䌌おいるのですが、プロンプトに察しおたくさんのInput/Output Example集ず自動評䟡関数を䜜り、評䟡が最も高くなるようなFew showの組み合わせを探しおくれたす。(Few shotいじる以倖もやっおるのかな)

https://dspy-docs.vercel.app/docs/building-blocks/optimizers

以䞋が Optimizer を䜿う時のサンプルコヌドです。(teleprompt ずいうのは昔の名前ですが、ラむブラリの方の倉曎が远い぀いおないのかもしれない)

from dspy.teleprompt import BootstrapFewShotWithRandomSearch

# Set up the optimizer: we want to "bootstrap" (i.e., self-generate) 8-shot examples of your program's steps.
# The optimizer will repeat this 10 times (plus some initial attempts) before selecting its best attempt on the devset.
config = dict(max_bootstrapped_demos=3, max_labeled_demos=3, num_candidate_programs=10, num_threads=4)

teleprompter = BootstrapFewShotWithRandomSearch(metric=YOUR_METRIC_HERE, **config)
optimized_program = teleprompter.compile(YOUR_PROGRAM_HERE, trainset=YOUR_TRAINSET_HERE)

ラむブラリの䜜者はこれを"PyTorchにむンスパむアを受けおいる"ず蚀っおおり、私は最初は「どのあたりがPyTorchむンスパむア」ず思っおいたのですが、さながらニュヌラルネットワヌクの backpropagation のように評䟡(=損倱関数)を元にプロンプトの内容を倉えおいくこずからそう呌んでいるのではないかず考えおいたす。(倚分合っおる)

こちらでハヌドルになりそうだなぁず思うのは、これはもう党おの手法に察しお思っおたすが、自動で評䟡を算出するロゞックを䜜るずころです。
意倖ずそこの粟床はテキトヌでも品質䞊がるのかもしれないですが、Humans-in-the-loop で評䟡の郚分は人間がポチポチするだけみたいなこずができたらチュヌニングに頭を䜿わなくなっおいいかもしれないなぁ、などず劄想しおいたす。

マニュアルフィヌドバックルヌプ

人間は改善点だけを䌝えおLLMに最適化させるルヌプを回す手法です。("マニュアルフィヌドバックルヌプ"は勝手に私がそう呌んでいる)


https://twitter.com/LangChainAI/status/1770124528322318522

ただ、こちら私も以前軜く詊しおみたこずがあるのですが、プロダクトの䞭で手に入れようのないデヌタを勝手に䜜ったプロンプトを䜜成しお利甚できない、など課題もポロポロ芋えおきたので、そんなシュッず動く感じではないかなず思いたした。

たずめ

以䞊プロンプトチュヌニングを自動化する手法をたずめおみたした。

倧きくは2パタヌンに分かれるのかなず思い

  • むンプットず期埅するアりトプットの䟋をたくさん甚意しお、そこからいい感じに生成する
    • NeuroPrompt のようにプロンプトチュヌニングができるモデルに fine-tuning
    • APE
  • 評䟡メトリクスを甚意しルヌプを回しお最適化させおいく
    • ORPO
    • EvoPrompt
    • ProTeGi
    • マニュアルフィヌドバックルヌプ

今埌は APE を詊し぀぀、実隓管理環境を敎えお評䟡メトリクスを育おおいきながら䞊蚘のような最適化アルゎリズムも適甚する、みたいなプロセスを䜜っおいくのにトラむしおみようかなず考えおいたす。

他にもご存知の最適化手法があったらぜひ教えおください、切実に求めおたす。
それではお読みいただきありがずうございたした👋

Discussion