HUOXIU

自動プロンプトエンジニアリング

編集者注:著者は母親にLLMを使って仕事のタスクを完了する方法を教えようとした際に、プロンプトの最適化が想像していたほど簡単ではないことに気づきました。自動プロンプト最適化は、モデルに提供されるプロンプトを調整・改善する経験の浅いプロンプト作成者にとって有益であり、自動プロンプト最適化ツールのさらなる探求につながりました。

この記事では、プロンプトワードエンジニアリングの本質を、ハイパーパラメータ最適化の一部とみなすことも、継続的な試行と調整を必要とする探索、試行錯誤、修正のプロセスとみなすこともできるという 2 つの観点から分析します。

著者は、数学の問題の解答、感情分類、SQL文の生成など、モデルの入力と出力が比較的明確なタスクの場合、プロンプトワードエンジニアリングは、機械学習におけるハイパーパラメータのチューニングと同様に、「パラメータ」の最適化に近いと主張しています。自動化された手法を用いて、様々なプロンプトワードを継続的に試し、どれが最も効果的なのかを確かめることは可能です。しかし、メール、詩、記事の要約の作成など、比較的主観的で曖昧なタスクの場合、出力が「正しい」かどうかを判断するための明確な基準がないため、プロンプトワードの最適化を単純かつ機械的に行うことはできません。

元記事のリンク: https://towardsdatascience.com/automated-prompt-engineering-78678c6371b9

LinkedInプロフィールリンク: https://linkedin.com/in/ianhojy

購読用の Medium プロフィールリンク: https://ianhojy.medium.com/

著者 | イアン・ホー

編纂者:岳陽

ここ数ヶ月、LLMを使った様々なアプリの開発に取り組んできました。正直なところ、LLMから期待通りの出力を得るためにPromptの改良にかなりの時間を費やしてきました。

何度も空虚感と混乱に陥り、自分は単なる見せかけの即席エンジニアなのだろうかと自問します。LLM(大規模言語モデル)と人間のインタラクションの現状を考えると、やはり「まだだめだ」と結論づけてしまいがちですが、大抵の夜はなんとかインポスター症候群を克服しています。(訳注:これは、個人が自分の業績や能力に疑問を抱き、しばしば自分が詐欺師のように感じ、自分がその業績に値しない、あるいは達成していないと思い込み、それが暴露されることを恐れる心理現象です。)今のところ、この問題についてはこれ以上深く掘り下げません。

しかし、いつかプロンプト作成のプロセスが大部分自動化される日が来るのだろうかと、私は今でもよく考えます。この疑問に答える鍵は、プロンプトエンジニアリングの本質を理解することです。

インターネット上にはプロンプト エンジニアリングのプレイブックが大量に存在しますが、それでもプロンプト エンジニアリングが芸術なのか科学なのかは判断できません。

一方で、モデルの出力から得た観察に基づいて、自分が書いたプロンプトを繰り返し学習し、改良していく作業は、まるで芸術のように感じました。時が経つにつれ、細かい点も非常に重要であることに気づきました。例えば、「should(すべき)」ではなく「must(しなければならない)」を使うことや、ガイドラインをプロンプトの真ん中ではなく最後に置くことなどです。タスクによっては、一連の指示やガイドラインを表現する方法があまりにも多く、常に試行錯誤を繰り返しているように感じることもありました。

一方、手がかり語は単なるハイパーパラメータだと主張する人もいるかもしれません。結局のところ、LLM(大規模言語モデル)は、私たちが記述する手がかり語を、他のハイパーパラメータと同様に埋め込みとして扱います。機械学習モデルの訓練とテスト用に準備され承認されたデータセットがあれば、手がかり語を調整し、そのパフォーマンスを客観的に評価することができます。最近、HuggingFaceの機械学習エンジニアであるMoritz Laurer[1]の投稿を見ました。

データに対して異なるプロンプトをテストするたびに、LLMが実際に未知のデータに一般化されるかどうかの確信は薄れていきます。LLMの主要なハイパーパラメータ(プロンプト)を調整するために、別の検証分割を使用することは、微調整のための訓練-検証-テスト分割と同じくらい重要です。唯一の違いは、トレーニングデータセットがなくなり、トレーニング/パラメータ更新がないため、なんとなく違った感じがすることです。LLMがタスクでうまく機能していると信じ込んでしまうのは簡単ですが、実際にはデータにプロンプ​​トを過剰適合させている可能性があります。優れた「ゼロショット」論文はすべて、最終テストの前にプロンプ​​トを見つけるために検証分割を使用したことを明確にする必要があります。

これらのデータセットで様々なプロンプトをテストしていくうちに、LLMが未知のデータに真に一般化できるかどうかはますます不確実になっていきます…データセットの別のサブセットを検証セットとして用いてLLMの主要なハイパーパラメータ(プロンプト)を調整することは、訓練・評価・テストの分割アプローチを用いた微調整と同じくらい重要です。唯一の違いは、このプロセスではモデルの学習やパラメータの更新は行われず、検証セットにおける様々なプロンプトのパフォーマンスを評価するだけであるということです。LLMがターゲットタスクで優れたパフォーマンスを発揮すると信じ込んでしまうのは簡単ですが、実際には、このデータセットで非常に優れたパフォーマンスを発揮する調整済みプロンプトが、より広範なデータセットや未知のデータセットには適さない可能性があります。優れた「ゼロショット」論文はすべて、最終テストの前に最適なプロンプトを見つけるために検証セットを使用したことを明記する必要があります。

少し考えた結果、答えはその中間にあると思います。プロンプトエンジニアリングが科学か芸術かは、LLMに何を達成させたいかによって決まります。この1年間、LLMは多くの素晴らしい成果を上げてきましたが、私は大規模モデルを使用する意図を、問題解決と創造という2つのカテゴリーに大きく分けています。

問題解決という観点から見ると、LLMは数学の問題を解いたり、感情を分類したり、SQL文を生成したり、テキストを翻訳したりします。一般的に、これらのタスクは比較的明確な入出力ペア(入力データとそれに対応するモデル出力データの関係)を持つことができるため、まとめて分類できると思います。(そのため、少数のプロンプトのみを使用して対象タスクをうまく達成できるケースが多く見られます。)明確に定義されたトレーニングデータを持つこれらのタスクでは、プロンプトエンジニアリングは私にとってより科学に近いように思えます。そのため、本稿の前半では、プロンプトをハイパーパラメータとして扱うという観点から、自動プロンプトエンジニアリングの研究の進展を探ります

創造的なタスクという点では、LLMに求められるタスクはより主観的で曖昧です。これには、メール、レポート、詩、要約の作成が含まれます。まさにこの領域において、私たちはより曖昧な問題に遭遇します。ChatGPTの文章は非個人的なのでしょうか?(私がこれまでにChatGPTに書かせた何千もの記事に基づくと、私の現在の意見は「はい」です。)さらに、 LLMがどのように反応するかについてのより客観的な基準が欠如していることが多いため、創造的なタスクの性質と要件は、手がかりとなる単語をハイパーパラメータのように調整および最適化できるパラメータとして扱うことに一般的に適していません。

ここまで読んで、クリエイティブなタスクには常識だけで十分だと言う人もいるかもしれません。正直なところ、私も以前はそう思っていました。母にChatGPTを使って仕事用のメール作成を手伝ってもらうまで。このような状況では、プロンプトエンジニアリングは単発のイベントではなく、継続的な試行錯誤を通じて改善していくことが主な目的であるため、(前述の通り)汎用性を維持しながら、自分のアイデアを適用してプロンプトを改善するのは必ずしも簡単ではありません。

簡単に言うと、大規模なモデルから生成されたサンプルに対するユーザーフィードバックに基づいてプロンプトを自動的に改善できるツールを徹底的に探しましたが、見つかりませんでした。そこで、そのようなツールのプロトタイプを作成し、実行可能な解決策が存在するかどうかを検討しました。この記事の後半では、リアルタイムのユーザーフィードバックに基づいてプロンプトを自動的に改善できるツールをテストしましたので、ご紹介します。

01 パート1 – LLMをソルバーとして:ハイパーパラメータ最適化の一部としてのプロンプトエンジニアリングの扱い

業界の多くの人は、論文「大規模言語モデルはゼロショット推論器である」[2]で登場する有名な「ゼロショットCOT」という用語をよく知っています(訳注:このモデルは、特定のタスクのための明示的な訓練データを学習することなく、既存の知識を組み合わせることで新しい問題を解決します)。周ら(2022)は、論文「大規模言語モデルは人間レベルのプロンプトエンジニアである」[3]で、その改良版をさらに探求することにしました。「正しい答えが得られるように、段階的に解いていきましょう」。以下は、彼らが提案した自動プロンプトエンジニア手法の概要です。

出典:大規模言語モデルは人間レベルのプロンプトエンジニアである[3]

この論文を要約すると次のようになります。

  1. LLM は、与えられた入力と出力のペアに基づいて候補となるガイダンス単語を生成するために使用されます。
  2. LLM を使用して各命令にスコアを付ける場合、その命令を使用して生成された回答が予想される回答と一致する度合いに基づいて評価するか、その命令を通じて取得されたモデル応答の対数確率に基づいて評価できます。
  3. 高得点の候補ガイダンス語に基づいて、新しい候補ガイダンス語が反復的に生成されます。

いくつかの興味深い結論が見つかりました。

  • 人間の即席エンジニアと、これまで提案されてきたアルゴリズムが互いの性能を凌駕していることを実証することに加えて、著者らは次のように指摘している。 「直感に反して、コンテキストに例を追加するとモデルのパフォーマンスが低下します。選択された指示がゼロショット学習のシナリオに過剰適合し、その結果、少数ショットの場合にはパフォーマンスが低下するためです。」
  • 反復モンテカルロ検索アルゴリズムは時間の経過とともに有効性を失う傾向がありますが、元の提案空間が適切でない、または十分に効率的でない場合には、良好なパフォーマンスを発揮します。

そして2023年、Google DeepMindの研究者たちは「プロンプティングによる最適化(OPRO)」と呼ばれる手法を発表しました。前例と同様に、メタプロンプト(ユーザー向けのプロンプトの構築または生成を支援するために使用されるプロンプト)には、一連の入力/出力ペア(特定のタスクまたは問題に対する入力と期待される出力の組み合わせを記述したもの)が含まれています。ここでの主な違いは、メタプロンプトには、以前にトレーニングされたプロンプトサンプルとその正解または解決策、これらのプロンプトへの回答におけるモデルの精度、そしてメタプロンプトの様々な部分間の関係を詳述するガイドプロンプトも含まれていることです。

著者らが説明しているように、研究における各キューワード最適化ステップでは、以前の学習軌跡を参照することを目的として新しいキューワードが生成され、モデルが現在のタスクをよりよく理解して、より正確な出力結果を生成できるようになります。

出典:大規模言語モデルを最適化装置として利用する[4]

Zero-Shot-COT シナリオでは、「深呼吸をして、この問題に段階的に取り組んでください」というキューワード最適化手法を提案し、優れた成果を達成しました。

これについてはいくつか考えがあります:

  • 「言語モデルの種類によって、生成される指示プロンプトのスタイルは大きく異なります。PaLM 2-L-ITやtext-bisonなどのモデルは非常に簡潔で明確なプロンプトを生成する一方、GPTなどのモデルは長くて非常に詳細な指示を生成します。」この点は注目に値します。現在、多くのプロンプトエンジニアリングのアプローチはOpenAIの言語モデルを参考にして書かれていますが、様々なソースからのモデルがますます使用されるようになるにつれて、これらの一般的なプロンプトエンジニアリングのガイドラインはそれほど効果的ではない可能性があることに注意する必要があります。論文のセクション5.2.3では、プロンプトの小さな変更に対するモデルのパフォーマンスの大きな敏感性を示す例が示されています。この点にはより注意を払う必要があります。

例えば、GSM8KテストセットでPaLM 2-L評価モデルを使用した場合、「段階的に考えましょう。」の精度は71.8%に達し、「一緒に問題を解決しましょう。」の精度は60.5%でしたが、最初の2つの指示語の意味の組み合わせである「一緒にこの問題を段階的に解決しましょう。」の精度はわずか49.4%でした。

この動作により、シングルステップ命令間の差異が増大し、最適化プロセス中に発生する変動も増大するため、最適化プロセスの安定性を向上させるために、各ステップで複数のシングルステップ命令を生成する必要が生じます。

論文の結論では、もう一つの重要な点についても言及されています。「このアルゴリズムを現実世界の問題に適用する際の現在の限界の一つは、プロンプトの最適化に使用されている大規模言語モデルが、トレーニングセット内のエラー事例を効果的に活用してプロンプトの改善に向けた有望な方向性を推論できていないことです。実験では、各最適化ステップでトレーニングセットからランダムにサンプリングするのではなく、トレーニングまたはテスト中に発生したエラー事例をメタプロンプトに組み込むようにしましたが、結果はほぼ同じでした。これは、これらのエラー事例から得られる情報だけでは、最適化LLM(プロンプトの最適化に使用される大規模言語モデル)が誤った予測の理由を理解するには不十分であることを示しています。」この点は確かに強調する価値があります。なぜなら、これらの手法は、プロンプトの最適化プロセスが従来のML/AIにおけるハイパーパラメータ最適化プロセスに類似していることを強く示しているものの、LLMにどのようなコンテンツ入力を提供するか、あるいはLLMにプロンプ​​トを改善するようどのように導くかなど、肯定的で積極的な事例を優先する傾向があるからです。しかし、従来のML/AIでは、この傾向は通常それほど顕著ではありません。エラー自体の方向や種類にあまり注意を払うのではなく、エラー情報を活用してモデルを最適化する方法に重点を置いています (つまり、-5 と +5 のエラーをほとんど同じように扱います)。

APE(Automated Prompt Engineering)にご興味がございましたら、https://github.com/keirp/automatic_prompt_engineer からダウンロードしてご利用いただけます。

出典: APEのサンプルノートブックのスクリーンショット[5]

APE と OPRO の両方のメソッドには重要な要件があります。最適化を支援するためのトレーニング データが必要であり、最適化されたプロンプトの一般性を保証するためにデータセットが十分に大きい必要があります。

ここで、すぐに利用できるデータがない可能性がある別の種類の LLM タスクについてお話ししたいと思います。

02 パート 2 – クリエイターとしての LLM: プロンプトエンジニアリングを継続的な実験と調整のプロセスとして捉える。

では、これから短編小説をいくつか考えてみましょう。

モデルを学習させるための小説テキスト例が不足しており、適切な小説テキスト例の作成には時間がかかりすぎます。さらに、モデルの出力は多様で許容範囲も広いため、大規模なモデルに「いわゆる正解」を出力させることに意味があるのか​​どうかも疑問です。したがって、APEのような手法を用いてプロンプト語のエンジニアリングを自動化することは、この種のタスクでは実質的に非現実的です。

しかし、なぜプロンプト作成のプロセスを自動化する必要があるのか​​疑問に思う読者もいるかもしれません。「 {{country}}{{issue}}に関する短編小説のアイデアを3つ提供してください」といった簡単なプロンプトを調整することから始めましょう。{{issue}}を「不平等」に、{{country}}を「シンガポール」に置き換えます。モデルの応答を観察し、問題点を特定し、プロンプトを調整し、調整が効果的かどうかを観察します。このプロセスを繰り返します。

しかし、このような状況で、キューワードエンジニアリングから最も恩恵を受けるのは誰でしょうか?まさに、モデルに提供されるキューワードを微調整し、改善する経験が不足している、経験の浅いキューワード作成者です。私は、母に仕事のタスクでChatGPTの使い方を教えているときに、このことを直接体験しました。

母はChatGPTの出力結果に対する不満をプロンプトの改善に結びつけるのがあまり得意ではないかもしれませんが、プロンプトエンジニアリングのスキルとは関係なく、私たちが本当に得意とするのは、目にした問題(つまり不満)を表現することだと気づきました。そこで、ユーザーが不満を表明し、LLMにプロンプ​​トを改善させるツールを開発しようと試みました。これは私にとってより自然なインタラクション方法に思え、LLMをクリエイティブなタスクに使用しようとしている私たちにとっても、より使いやすくなるように思えました。

あらかじめ述べておきますが、これはあくまで概念実証に過ぎません。読者の皆様は、ぜひ著者と良いアイデアを共有してください。

まず、{{}}変数を使ってプロンプトを記述します。ツールはこれらのプレースホルダーを検出し、後で入力できるようにします。上記の例を使って、大規模モデルにシンガポールの不平等に関する独創的なストーリーを出力させましょう。

次に、ツールは入力プロンプトに基づいてモデル応答を生成します。

次に、フィードバックを提供します(モデルの出力に関する苦情を表明します)。

その後、モデルはストーリーアイデアの例の生成を停止し、最初の反復で改善されたプロンプトを出力するように指示されました。以下に示すプロンプトは改善され、一般化されており、ユーザーに「これらの課題を克服または取り組むための戦略を説明してください」と求めていることに注意してください。最初のモデル出力に対する私のフィードバックは、「物語の主人公が不平等にどのように対処しているかを説明してください」でした。

次に、改善されたプロンプトを使用して、大きなモデルに短編小説を再考するよう依頼しました。

「次の例を生成」をクリックすると、他の入力変数に基づいて新しいモデル応答を生成することもできます。以下は、中国におけるレイオフに関するクリエイティブなストーリーの例です。

次に、上記のモデルの出力に関するフィードバックが提供されます。

その後、プロンプト語はさらに最適化されました。

最適化の結果はかなり良さそうです。元々は単なるシンプルなプロンプトでしたが、2分足らず(とはいえ、ややざっくりとした)フィードバックと3回の反復を経て、この最適化されたプロンプトにたどり着きました。これで、LLMの出力に不満があれば、あとはただ座ってプロンプトの最適化を続けるだけです。

この機能の内部実装はメタプロンプトから始まり、動的なユーザーフィードバックに基づいて継続的に最適化され、新しいプロンプトを生成します。特別なことは何もありませんし、確かに改善の余地はありますが、すでに良いスタートを切っています。

 prompt_improvement_prompt = """# コンテキスト # オリジナルのプロンプトが提供されます。
元のプロンプトを使用して、いくつかの回答例を生成しました。それぞれの回答に対して、望ましい回答を改善するためのフィードバックが提供されました。
あなたの仕事は、すべてのフィードバックを確認し、フィードバックに対応した改善されたプロンプトを返すことです。これにより、GPT言語モデルに対するプロンプトに対して、より適切な応答を生成できるようになります。# ガイドライン # - 元のプロンプトには、二重中括弧で囲まれたプレースホルダーが含まれます。これらは、例で表示される入力値です。
- 改善されたプロンプトは200語を超えてはならない
- 改善されたプロンプトのみを返し、その前後に何も記述しないでください。二重中括弧で囲んだ同じプレースホルダーを含めることを忘れないでください。
- 改善されたプロンプトを作成する際は、プロンプト全体を1つの段落で記述することは避けてください。代わりに、タスクの説明、ガイドライン(ポイント形式)、その他のセクションを適宜組み合わせてプロンプトを作成してください。
- ガイドラインはポイント形式で、タスクの繰り返しではなく、それぞれ明確に区別できる必要があります。
- 改善されたプロンプトは、言語モデルが最もよく理解できる通常の英語で記述する必要があります。
- 提供されたフィードバックに基づいて、応答の望ましい動作を、「すべき」という示唆的な文ではなく、「しなければならない」という命令形の文に言い換える必要があります。
- プロンプトに加えられた改善は、1つの例に過度に特化すべきではありません。# 詳細 # 元のプロンプトは次のとおりです:```
{元のプロンプト}
```提供された例とそれぞれのフィードバックは次のとおりです:```
{例}
改善されたプロンプトは次のとおりです。
「」 

このツールの使用中に観察されたいくつかの点:

  • GPT4はテキスト生成時に多数の単語を使用する傾向があります(「おしゃべり」特性)。これには2つの影響があります。まず、この「おしゃべり」特性は、特定の例への過剰適合を促進する可能性があります。**LLMに与えられた単語が多すぎると、LLMはそれらの単語を特定のユーザー応答を修正するために使用します。** 2つ目に、この「おしゃべり」特性は、特に重要なガイダンスが不明瞭になる可能性のある長いプロンプトにおいて、プロンプトの有効性を損なう可能性があります。最初の問題は、ユーザーからのフィードバックに基づいてモデルが一般化するように促す適切なメタプロンプトを作成することで解決できると考えています。しかし、2つ目の問題はより困難です。他のユースケースでは、プロンプトが長すぎるとガイダンスプロンプトが無視されることがよくあります。メタプロンプトに制約を追加することもできます(上記のプロンプト例のように単語数を制限するなど) 。しかし、これはかなり恣意的であり、プロンプト内の一部の制約やルールは、基盤となる大規模モデルの特定の特性や動作の影響を受ける可能性があります。
  • 改善された提案語は、以前に行われた最適化を忘れてしまうことがあります。この問題を解決する方法の一つは、システムに改善の履歴をより長く提供することですが、そうすると改善された提案語が長くなりすぎる可能性があります。
  • 初期イテレーションにおけるこのアプローチの利点の一つは、 LLMがユーザーフィードバックに含まれない改善ガイドラインを提供できることです。例えば、上記の最初の単語を最適化する際、私のフィードバックは信頼できる情報源からの関連統計情報を提供するというだけのものだったにもかかわらず、ツールは「議論されている問題について、より広い視点を提供する…」という追加情報を追加しました。

このツールはまだデプロイしていません。メタプロンプトでどのアプローチが最適かを確認したり、Streamlitフレームワークの問題を解決したり、プログラムで発生する可能性のあるその他のエラーや例外を処理したりするために作業を進めているからです。しかし、ツールはまもなく利用可能になる予定です。

03 結論

プロンプトエンジニアリングの分野全体は、タスク解決に最適なプロンプトを提供することに焦点を当てています。APEとOPROはこの分野における最も重要かつ優れた例ですが、全体像を代表するものではありません。今後、この分野でどれだけの進歩を遂げられるか、非常に楽しみです。これらの手法を様々なモデルで有効性を評価することで、それらのモデルの動作傾向や特性を明らかにすることができ、また、どのメタプロンプト手法が効果的かを理解するのにも役立ちます。したがって、これは非常に重要な研究であり、LLMを日常業務や生産的な実践に活用する上で役立つと考えています。

しかし、これらのアプローチは、LLMを創造的なタスクに活用したいと考えている人には適さないかもしれません。現在、多くの既存の学習マニュアルが初期段階のガイドとして役立ちますが、試行錯誤を繰り返すことに勝るものはありません。したがって、短期的には、人間の強み(フィードバックの提供)を活かしながら、この実験プロセスをいかに効率的に実施し、LLMに残りの作業(プロンプトの改良)を任せることができるかが最も重要だと考えています。

概念実証(POC)にも力を入れていきますので、ご興味がありましたらお気軽にご連絡ください(https://www.linkedin.com/in/ianhojy/)。

読んでくれてありがとう!

終わり

参考文献

[1] https://www.linkedin.com/in/moritz-laurer/?originalSubdomain=de

[2] https://arxiv.org/pdf/2205.11916.pdf

[3] https://arxiv.org/pdf/2211.01910.pdf

[4] https://arxiv.org/pdf/2309.03409.pdf

[5] https://github.com/keirp/automatic_prompt_engineer

[6] https://arxiv.org/abs/2104.08691

[7] https://medium.com/mantisnlp/automatic-prompt-engineering-part-i-main-concepts-73f94846cacb

[8] https://www.promptingguide.ai/techniques/ape

この記事は、原著者の許可を得てBaihai IDPによって翻訳されました。翻訳の転載をご希望の場合は、お問い合わせください。

オリジナルリンク:

https://towardsdatascience.com/automated-prompt-engineering-78678c6371b9