プロンプトの推論能力を高めるための最適化方法

6,612 文字

How to OPTIMIZE your prompts for better Reasoning!
In this video, we look at Microsoft's Prompt Breeder framework and how you can use it to optimize prompts for better cha...

まず最初に、単なる数文の入力プロンプトから、今日のフレームワークを使ってこのような完全な思考の流れのトレースを生成できるように最適化する方法をお見せします。
私がチャンネルで何度も言及してきたことの1つは、LLMから得られる出力の品質は、入力するコンテキストと内容に完全に依存しているということです。これは当たり前のように聞こえますが、それでも何度も同じ間違いを目にします。プロンプトを最適化せず、どのようなコンテキストを入れるべきか考えず、インコンテキスト学習などについて考慮しないという間違いです。
そこで今日お話ししたいツールが、Microsoftの新しいフレームワーク「Prompt Wizard」です。このフレームワークの考え方は、特定のタスクに対してモデルに入力する指示、インコンテキスト学習の例、その数など、プロンプト全体を最適化するのを支援することです。
これは、MicrosoftやGoogleのような大企業にとって非常に重要です。新しいモデルを訓練したり、さらにはファインチューニングする際に、そのモデルから最高の結果を得るために必要なプロンプトが変化することがあるからです。多くの研究機関がこの標準化に取り組んできました。タスクごとに1つのシンプルなプロンプトで最高の結果を得られるようにすることを目指してきましたが、まだ誰もこれを完全には解決できていません。
一般的にモデルは大幅に改善されているので、プロンプトエンジニアリングは以前ほど魔法のようなものではなくなりました。また、プロンプトエンジニアリングに関する教育も向上し、コンテキストの設定や何らかのアイデンティティを与えることなどについて、人々は学んできています。
しかしPrompt Wizardは、この全体を最適化の問題として捉えています。正しい答えを生成するための最適なプロンプトを得ることだけでなく、モデルがより良い思考の連鎖を生成し、思考の連鎖を合成的に生成できるようにすることにも注目しています。これは、正しい思考の連鎖と誤った思考の連鎖の両方を訓練データとして使用し、Chain of Thoughtパターンを通じて推論を生成する能力を向上させたいと考える人々にとって、まさに必要なことでしょう。
Microsoftは、現在取り組んでいる課題の中でこれが大きな問題であることを明確に認識しています。人間の試行錯誤だけに頼らない最適化の方法が必要だと考えており、そこでPrompt Wizardを導入しています。このフレームワークは、プロンプトの最適化を自動化し、単純化するように設計されています。
ここでの考え方は、モデルを使ってLLMからフィードバックを得て、LLMを審判として出力を批評し、それらの出力を生成するための入力を更新することです。そして時間とともに、指示とインコンテキスト学習の例の両方を進化させることができます。
ここでは3つの重要な洞察について説明しています:
1つ目は、フィードバック駆動型の改良です。Prompt Wizardは、LLMが自身のプロンプトと例を批評し、改良する反復的なフィードバックループを活用します。これが最も基本的なレベルです。
2つ目のレベルは、基本的に共同最適化を行い、タスクに沿った多様な合成例を作成し始めることです。
3つ目は、おそらく最も興味深い、自己生成型Chain of Thoughtステップの考え方です。これは、モデルの問題解決能力を向上させるためにChain of Thought推論を組み込んでいます。
図を見ると、問題の説明を入力し、そのためのプロンプト指示を入力します。これは答えたい質問です。そして、その質問をどのように扱うかについての明確な指示があります。これはシステムプロンプトや開発者プロンプトのようなものと考えることができ、そしてインコンテキスト学習のための訓練例があります。
これがプロンプト指示を改良し、異なる修正されたプロンプト指示をテストできることがわかります。インコンテキスト学習のための訓練例から多様な例を選択し、合成例を生成することができます。最後に、Chain of Thoughtなどを通じて、自己生成の推論と検証を生成できます。
最終的に、最適化されたプロンプト、Chain of Thoughtなどを含む最適化された少数ショット例、そしてタスクの意図とエキスパートペルソナが得られます。
もう少し詳しく見てみましょう。第1段階はプロンプト指示の改良です。このプロンプト指示は、問題とともに入力されます。この場合、Prompt Wizardは思考スタイルも入力します。これはDeepMindのPrompt Breederのアイデアに少し似ています。プロンプトを突然変異させ、一連の変異した指示などが得られます。
これらはスコア付けされ、各突然変異がどうなったかを確認できます。そして、プロンプト指示を改善するために批評と統合を行うことができます。別々のパスを入力しているので、同じ問題の説明などを入力することを気にする必要はありません。
この時点で、思考スタイルに基づいて突然変異を行い、スコアリングと評価を行い、LLMからフィードバックを得ています。スコアを得たら、なぜこれが良かったのかを批評し、さらに良い新しいプロンプトを統合することができます。これはループを通じて行われ、プロンプト指示を改善するためにループを何回実行するかを選択できます。
第2段階では、インコンテキスト学習の例と組み合わせます。これらの例を入力し、批評と統合を行い、例を批評して新しい例を統合します。修正された指示と組み合わせ、再度批評と統合を行います。これによってさらに強化され、最後に推論のためのより良いChain of Thoughtを得ることができます。
ベンチマークについては詳しく説明しませんが、これはPrompt BreederやEvo Promptよりも優れた結果を示しています。Prompt Breederは前に話したDeepMindのものです。Evo Instructには、訓練などのための合成データと例を生成するという非常に興味深いアイデアがありました。実際、Evoチームは現在Microsoftで働いているようです。
コードを見て、これが実際にどのように機能するのか見てみましょう。Microsoftがフレームワークをリリースし、MITライセンスを持っています。ブログ投稿で説明した部分について、より詳しく説明した論文もあります。
ここには、これをどのように使用したいかについての異なるシナリオがあります。デフォルトではOpenAIとAzure用に設定されていますが、これはMicrosoftからすると驚くことではありません。おそらくOpenAIのエンドポイントを他のモデルに再配線することができ、カスタムモデル用のクラスもあります。
私が設定を説明するのは、GSM 8Kデータセットです。これは説明から始まり、システムプロンプトなどがあります。「あなたは数学の専門家で、解く必要のある数学の問題が与えられます」というものです。その後に質問があり、ステップバイステップで考えていきます。これが基本的な指示です。
最後には、答えの開始と終了の間に最終的なオプションだけを含めるようにしています。これは正しい答えを得たかどうかを確認するためです。
では実際に見ていきましょう。Microsoft Prompt Wizardをインポートして設定するコラボレーションノートブックを用意しました。環境変数を設定する必要があります。OpenAIキーの他に、このケースではGSM 8Kデータセットをダウンロードするためにhugging faceのキーも必要です。
このデータセットを見ると、自分の特定のユースケース用にカスタムデータセットを作成し、hugging faceにアップロードして後で使用することができます。
環境変数を設定したら、インポートを行います。環境ファイルがないので、その環境は使用せず、必要なものをここに入れました。これはGPT-4oの設定用です。4-miniを使用することもできますが、o1モデルでは、特に異なる種類のChain of Thoughtを生成するように指示すると、OpenAIはそれを好まないので、うまく機能しない可能性があります。
次に、GSM 8Kデータセットを処理するためのコードがあります。これを読み込んで使用できるようにします。設定を行う必要があります。デモフォルダの下にさまざまなデモがあり、configsフォルダがあり、基本的なyaml設定などが設定されています。
ここでは、それらをすべて定義し、実際の出力を見ています。GPT-4o以外のモデルを使用する場合は、yamlでそれを変更する必要があります。
次に、プロンプトオプティマイザーを設定します。異なる設定のコンフィグ、トレーニングファイル名、この場合はGSM 8Kのデータセットプロセッサーを渡します。
プロンプトオプティマイザーにはさまざまな設定があります。例えば、トレーニングセットから例を使用することができます。ここでは、トレーニングサンプルを混合しています。一部の例を使用し、他の例を合成的に作成します。トレーニング例がなく、すべてを合成的に生成したい場合は、これをtrueに設定します。最後に、トレーニングサンプルがなく、最終的なプロンプトでICLを気にしない場合に使用できます。
これは20-30分ほど実行され、3回の反復で例をバッチ処理し、プロンプトを実行し、突然変異を行います。基本的な指示は、以前見たように「ステップバイステップで考えましょう」から始まり、入力する少数ショット例の数は5つです。
これはかなりシンプルなChain of Thoughtです。多くを与えているわけではなく、基本的に「ステップバイステップで考えましょう」と言っているだけです。元のシステムプロンプトやアイデンティティは基本的に「あなたは数学の専門家で、解く必要のある数学の問題が与えられます」というものです。
そしてメタプロンプトがあります。これらは異なるものを突然変異させることを奨励する思考スタイルのようなものです。このメタプロンプトは「その問題を解くための実験をどのように考案できるか」というものです。
それから突然変異を始め、突然変異したプロンプトが出てき始めます。そのメタプロンプトから、問題を解決するためのアイデアのリストを作成し、それらを1つずつ問題に適用して進展があるかどうかを確認するようになります。
徐々にこれらを突然変異させていきます。「ステップバイステップで考えましょう」だけでなく、「問題をより小さな部分に分解し、それぞれを体系的に取り組みましょう」「問題をより管理しやすくするにはどのように単純化できるか」「解決するためにどのようなステップが必要か」「重要な仮定は何か」といった内容になっていきます。
これを繰り返し行い、より良い例を探していきます。そして、異なるGSM 8Kの質問でテストを始め、スコアを得て、これらを批評し始めます。
批評するプロンプトは「ゼロショット指示タスクのために、最も能力があり適切なエージェントがタスクを解決するのを助けるプロンプトを書こうとしています。現在のプロンプトは『あなたは数学の専門家で…』」というものです。
そして正しく得られた例を示し、「これらの例は使用できないので、例の特徴、複雑さ、多様性、推論の連鎖を分析し理解してください」と要求します。これがChain of Thoughtの出現につながります。
そして、プロンプトをさらに改善し、ゼロショット指示としてより良いものにするための提案を提供します。
LLMからの批評は、役割とアプローチを明確にし、詳細な説明を奨励し、目標を強調するというものです。これらはChain of Thingの要素であり、実際にo1や特に元のo1プレビューとo1-miniモデルから得られる要約に見られるような種類のものです。
最終的に改訂されたプロンプトは「あなたは数学の専門家ですが、各問題に遭遇したら以下のステップに従ってください」となり、単に「ステップバイステップで考えましょう」という1行ではなく、一連のステップを持つことになりました。
これを何度も繰り返し行い、最良の例を見つけ出していきます。結果を見てみましょう。「ステップバイステップで考えよう」と「あなたは数学の専門家です」という簡単な文から始まり、最終的にはより充実したプロンプトが得られました。
「あなたは様々な数学の問題を解く数学の専門家です。以下の構造化されたアプローチに従ってください」という内容から始まり、問題の理解、重要な情報の抽出、戦略的な計画、精密な実行、パーセンテージと比率の扱い(これはクリエイティブライティングのタスクとは異なる独自のもの)、論理的整合性の検証と確認、解答の提示といった内容が含まれています。
そして、インコンテキスト学習の例では、GSMデータセットからの元の質問と、思考の連鎖を含む答えが含まれています。「重要な情報の抽出:総支出額、ショーツ1着あたりの費用、ショーツの数」というように、質問を言い換え、「戦略的計画:ショーツの総費用を計算」と進み、論理的整合性の検証と確認を行い、解答を提示します。
そして、この形式で答えを提示し、各質問に対して推論を示し、正しい答えを示すガイドラインがあります。さらに、生成されたシステムプロンプトとして使用できるエキスパートプロファイルもあり、「あなたは代数、微積分、幾何学、統計学を含む様々な数学分野に深い理解を持つ数学の専門家です。強い分析力を持ち、複雑な問題を管理可能なステップに分解する能力に長けています」と続きます。
これはGSM 8Kデータセット用に調整された非常に長いシステムプロンプトです。特定の種類のデータセットを作成すれば、特定の問題に対して最適なプロンプトを構築することができます。
これは、エージェントに関して人々がよく犯す間違いの1つです。多くの場合、エージェントは必要ありません。エージェントを使用する理由は、エージェントが異なる種類のプロンプト作成を行うためです。ある時点でこれが入力で、これが期待される出力、次の時点で新しい入力と前の出力というような単純なものであれば、すべてを連鎖させることができます。プロンプトを連鎖させ、最高の出力を得るという考え方は、LLMのほとんどのユースケースで必要とされるものです。
最後に、これを保存し、テストすることができます。録画中もまだテストを続けています。
Prompt Wizardは、基本的なプロンプトと評価テストから、完全に最適化されたプロンプト、最適化されたシステム指示、または最後に得られる意図とエキスパートペルソナまでを包括的に提供します。
大規模なプロジェクトでチームと協力している場合、すでに評価を持っている場合は、これを試してみる価値があります。使用しているモデルに対して、生成されるプロンプトが現在使用しているものとどれほど異なるかを確認してください。
前述のように、他のAPIがOpenAI形式をサポートしている場合、エンドポイントを簡単に変更してカスタマイズすることができます。使用したい様々なタスク固有の目的のためにプロンプトを最適化できるものがあります。
これの価値がお分かりいただけたと思います。これをどのように使用したいか、皆さんからのフィードバックをお待ちしています。質問などがありましたら、下のコメント欄に書いてください。私も現在取り組んでいるプロジェクトのいくつかでこれを試し、最適なプロンプトを見つけ出すつもりです。
以前お話しした「Evol instruct」や「Prompt breeder」などの内容にこれが基づいているのも気に入っています。いつも通り、動画が良かったと思われた方は「いいね」と「購読」をお願いします。次の動画でまたお話しします。では、さようなら。

コメント

タイトルとURLをコピーしました