Vertex AI Prompt Optimizer でプロンプトを強化

9月 26, 2024
Ivan Nardini DevRel Engineer Cloud AI
George Lee Product Manager Cloud AI Research

プロンプト設計とプロンプト エンジニアリングは、大規模言語モデル(LLM)から有意義な出力を得られるようにするアプローチしやすい方法の 1 つとしてとりわけ有用です。しかし、大規模言語モデルにプロンプトを与えることは、複雑な迷路を歩くようなものです。

プロンプトの設計は比較的新しい分野であり、その手法には探求の余地があります。詳しくは、プロンプト エンジニアリング ガイドをご覧ください。また、LLM から最良の結果を得るには、指示と例のさまざまな組み合わせを試して、目的の出力を引き出す必要があります。さらに、理想的なプロンプト テンプレートが見つかっても、そのプロンプトがそのまま別の LLM のタスクを完了するという保証はありません。そのため、多くの時間を費やして、プロンプト テンプレートあるモデルから別のモデルに移行したり、変換したりすることが必要になります。

LLM ベースのアプリケーションを構築しているときに経験する可能性のある「プロンプト疲れ」を軽減するために、Vertex AI Prompt Optimizer の公開プレビュー版を発表します。このブログでは、Vertex AI SDK for Python を使用して、Vertex AI Prompt Optimizer を使い始める方法について説明します。この記事を最後まで読めば、Vertex AI Prompt Optimizer について深く理解し、このツールがプロンプ トエンジニアリングにかかる時間と労力をどのように節約して、生成 AI アプリケーションで高性能プロンプトを使用できるようにするかを把握できます。


Vertex AI Prompt Optimizer: リサーチから本番環境に

Vertex AI Prompt Optimizer は、Vertex AI 上の好みのモデルに最適なプロンプト(指示とデモンストレーション)を見つけるのに役立つプロンプト最適化サービスです。指示には、プロンプト テンプレートのシステム指示コンテキストタスクが含まれます。デモンストレーションは、モデルの応答から特定のスタイルやトーンを引き出すためにプロンプトで提供する数ショットの例です。Vertex AI Prompt Optimizer は、自動プロンプト最適化(APO)手法に関する Google Research の論文(NeurIPS 2024 で承認済み)に基づいています。

この数学の問題を以下のように解きたいとします。問題を解くには、明確な指示と例が必要です。指示には、問題を解くための規則(負数を処理する方法など)が記載されています。は、規則を適用する方法を示します。それが Vertex AI Prompt Optimizer の背後にあるアイデアです。

Vertex AI Prompt Optimizer は最適な指示と例を見つけるために、LLM ベースの反復性の高い最適化アルゴリズムを採用しています。このアルゴリズムでは、オプティマイザー モデルと評価モデルが連携して、候補プロンプトを生成してから評価します。その後、最適化の評価指標に基づいて、最適な指示とデモンストレーションを選択します。次のイラストは、Vertex AI Prompt Optimizer の仕組みを示しています。

Vertex AI Prompt Optimizer は少ないラベル付きの例(入力とグラウンド トゥルース出力のペア)と最適化の設定を使って、ターゲット モデルに最適なプロンプト(指示とデモンストレーション)を見つけ、ユーザーの時間と労力を大幅に節約します。最終的に、このプロダクトは、プロンプト設計とプロンプト エンジニアリングのプロセスを合理化し、LLM ベースのアプリケーションの全体的な品質を向上させます。ユーザーは、Vertex AI で特定のタスクの新しいプロンプトを作成したり、あるモデルから別のモデルにプロンプトを簡単に変換したりできるようになっています。

Vertex AI Prompt Optimizer の仕組みについての理解が深まったところで、Vertex AI の Google モデルで使用するためにプロンプトを強化する方法を見てみましょう。


Vertex AI Prompt Optimizer を使い始める

健康的な料理の作り方を提案するシンプルな AI クッキング アシスタントを作ったとします。たとえば、「添加糖類や不健康な油脂を最小限に抑えながら、おいしくて満足のいく健康的なデザートを作るにはどうすればよいですか?」と尋ねます。そうすると、AI クッキング アシスタントは、「レシピでこれを両立させ、添加糖類と不健康な油脂を最小限に抑える方法についてヒントをいくつかご紹介します」と答えます。生成された回答の例は次のとおりです。

Example of user question, context, prompt, answer

AI クッキング アシスタントの初期バージョンでは、次のシンプルなプロンプト テンプレートを備えた LLM を使用しています。

Given a question with some context, provide the correct answer to the question. \nQuestion: {{question}}\nContext:{{context}}\nAnswer: {{target}}

AI クッキング アシスタントの初期バージョンは、収集した Q&A 評価データセットと、Vertex AI GenAI Evaluation を使用して計算された Q&A 評価指標に基づいて、コンテキストに関連する高品質な回答を生成できます。評価指標レポートのサマリーは次のとおりです。

Graph of evaluation metrics, showing question_answering_quality/mean is 4 times as high in mean value as groundedness/mean

まあまあ良い評価です。しかし、関連する質問に関して、生成された回答の品質には改善の余地があります。アシスタント用の効率的な LLM として Gemini 1.5 Flash を使用したいが、これまで、Gemini モデル ファミリーを使用して、よりパフォーマンスの高いプロンプト テンプレートを見つけ、Gemini 1.5 Flash でタスクを完了したことがないとします。ここで、Vertex AI Prompt Optimizer が役立ちます。

Vertex AI Prompt Optimizer を使用してプロンプト テンプレートを強化するには、次の手順に従います。

  1. プロンプト テンプレートを用意する
  2. ラベル付けされたサンプルを Cloud Storage バケットにアップロードする
  3. 最適化設定を構成する
  4. 最適化ジョブを実行する
  5. 最適化されたプロンプトを取得し、最適化を評価する


1. プロンプトテンプレートを用意する

まず、最適化するプロンプト テンプレートを用意します。Vertex AI Prompt Optimizer では、特定のタスクのすべてのクエリで共有されるプロンプト テンプレートの固定部分である指示テンプレートと、タスクに応じて変更されるプロンプト テンプレートの動的部分であるコンテキストおよびタスク テンプレートの両方を備えたプロンプトが想定されます。Q&A タスクで Vertex AI Prompt Optimizer と一緒に使用するために用意した元のテンプレートは次のとおりです。

INSTRUCTION_TEMPLATE = """
Given a question with some context, provide the correct answer to the question.
"""
 
CONTEXT_TASK_TEMPLATE = """
Question: {{question}}
Answer: {{target}}
"""

2. ラベル付けされたサンプルを Cloud Storage バケットにアップロードする

次に、Vertex AI Prompt Optimizer は、最適化プロセス中に使用するラベル付けされたサンプル(入力とグラウンド トゥルース出力のペア)が含まれた CSV または JSONL ファイルを必要とします。このユースケースでは、ソースモデルを使用して、ターゲット モデルが取り組んでいる例にラベルを付けることをお勧めします。これにより、改善すべき領域を特定しやすくなります。以下に、Google Cloud バケットにアップロードしたラベル付きサンプルの例を示します。

{"target":"Here\'s how to tackle those delicious red meats and pork while keeping things healthy:\\n\\n**Prioritize Low and Slow:**\\n\\n* **Braising and Stewing:** These techniques involve gently simmering meat in liquid over low heat for an extended period. This breaks down tough collagen, resulting in incredibly tender and flavorful meat. Plus, since the cooking temperature is lower, it minimizes the formation of potentially harmful compounds associated with high-heat cooking. \\n\\n* **Sous Vide:** This method involves sealing meat in a vacuum bag and immersing it in a precisely temperature-controlled water bath...","question":"What are some techniques for cooking red meat and pork that maximize flavor and tenderness while minimizing the formation of unhealthy compounds? \\n\\nnContext:\\nRed meat and pork should be cooked to an internal temperature of 145\\u00b0F (63\\u00b0C) to ensure safety. \\nMarinating meat in acidic ingredients like lemon juice or vinegar can help tenderize it by breaking down tough muscle fibers. \\nHigh-heat cooking methods like grilling and pan-searing can create delicious browning and caramelization, but it\'s important to avoid charring, which can produce harmful compounds. \\n"}

3. 最適化設定を構成する

プロンプト最適化ジョブを実行するには、Vertex AI Prompt Optimizer も最適化設定を構成する必要があります。Vertex AI Prompt Optimizer ジョブは、Vertex AI トレーニング カスタム ジョブとして実行されます。Vertex AI Prompt Optimizer は、Vertex LLM API とさまざまな評価指標でサポートされているすべての Google モデル、計算ベースまたは LLM ベースのモデル、場合によっては、ユーザーが定義したモデルに対応しています。これは、Vertex AI Prompt Optimizer が Vertex Rapid Evaluation Service と統合されているためです。これらの構成を渡すために、Vertex AI Prompt Optimizer は引数のリストまたは JSON 構成ファイルの Google Cloud バケット ファイル パスを受け入れます。Vertex AI Prompt Optimizer の基本構成のいくつかの例を以下に示します。

params = {
    'num_steps': OPTIMIZATION_STEPS,
    'system_instruction': SYSTEM_INSTRUCTION,
    'prompt_template': PROMPT_TEMPLATE,
    'target_model': TARGET_MODEL,
    'eval_metrics_types': EVALUATION_METRICS,
    'optimization_mode': OPTIMIZATION_MODE,
    'num_template_eval_per_step': OPTIMIZATION_PROMPT_PER_STEPS,
    'num_demo_set_candidates': DEMO_OPTIMIZATION_STEPS,
    'demo_set_size': DEMO_OPTIMIZATION_PROMPT_PER_STEPS,
    'input_data_path': INPUT_DATA_FILE_URI,
    'output_data_path': OUTPUT_DATA_FILE_URI,
 
}

Vertex AI Prompt Optimizer を使用すると、指示のみ、デモンストレーションのみ、またはその両方(optimization_mode)を最適化することでプロンプトを最適化できます。システム指示と最適化されるプロンプト テンプレート(system_instructionprompt_template)、そして、プロンプトを最適化する対象のモデル(target_model)を設定した後、評価指標や、プロンプトの改善に使用される反復の回数などを設定して、最適化プロセスを調整できます。サポートされている最適化パラメータの詳細については、ドキュメントをご覧ください。

サンプルと構成の両方を取得したら、次のように Google Cloud バケットにアップロードします。

from etils import epath
 
# upload configuration
with epath.Path(CONFIG_FILE_URI).open('w') as config_file:
      json.dump(args, config_file)
config_file.close()
 
# upload prompt opt dataset
prepared_prompt_df.to_json(INPUT_DATA_FILE_URI, orient="records", lines=True)

4. 最適化ジョブを実行する

この時点で、Vertex AI SDK for Python を使用して、最初の Vertex AI Prompt Optimizer ジョブを実行するためのすべての準備が整いました。

WORKER_POOL_SPECS = [{
    'machine_spec': {
        'machine_type': 'n1-standard-4',
    },
    'replica_count': 1,
    'container_spec': {
        'image_uri' : APD_CONTAINER_URI,
        'args': ["--config=" + CONFIG_FILE_URI]
}}]
 
custom_job = aiplatform.CustomJob(
      display_name=PROMPT_OPTIMIZATION_JOB,
      worker_pool_specs=WORKER_POOL_SPECS,
  )
 
custom_job.run()

Vertex AI Prompt Optimizer が、Vertex AI Prompt Optimizer コンテナを使用して Vertex AI トレーニング カスタム ジョブとしてどのように実行されるかに注目してください。このサービスが Vertex AI トレーニングと Vertex AI GenAI Evaluation の両方を活用しているという事実は、この場合のように、リサーチからから直接持ち込まれた場合でも、Vertex AI が生成 AI を実行するためのプラットフォームをどのように提供しているかの証明となっています。

Vertex AI Prompt Optimizer ジョブを送信した後、次に示すように、Vertex AI トレーニング カスタム ジョブ ビューから監視できます。

Training custom jobs view in Vertex AI

5. 最適化されたプロンプトを取得し、最適化を評価する

最適化ジョブが正常に実行された後、Cloud Storage 出力バケットで、json ファイルとして最適化された指示またはデモンストレーション、あるいはその両方を見つけることができます。いくつかのヘルパー関数のおかげで、次の出力を取得することができます。この出力は、定義した指標に従って最適なインストラクションを取得したときの最適化ステップを示してします。

Optimized instruction report in Vertex AI

最適化されたデモンストレーションと同じ結果が得られます。

最後に、最適化された出力で新しい応答を生成できます。以下に、最適化されたシステム指示テンプレートを使用して生成された応答の例を示します。

Gemini_answer_with_apd example

これらのシステム指示を使用して、Vertex AI GenAI Evaluation で新しい評価ラウンドを実行すると、次のような出力が得られるでしょう。この場合、最適化されたプロンプトのパフォーマンスは、選択した評価指標に対応した以前のプロンプト テンプレートを利用している以前のモデルを上回っています。

Graph showing increased question_answering_quality/mean

まとめ

プロンプト エンジニアリングは、LLM ベースのアプリケーションを実行できるようにするプロセスの中で最も重要かつ困難なステップの 1 つです。Vertex AI Prompt Optimizer は、プロンプト テンプレートの作成をサポートするために、Vertex AI の好みのモデル向けに最適なプロンプト(指示とデモンストレーション)を見つけます。

この記事では、Vertex AI Prompt Optimizer と Vertex AI SDK for Python を使用して、Gemini モデルのプロンプト テンプレートを強化する方法の例を示しました。こちらの UI ノートブックから、Vertex AI Prompt Optimizer を使用することもできます。

要約すると、Vertex AI Prompt Optimizer は、プロンプ トエンジニアリングにかかる時間と労力を節約しながら、生成 AI アプリケーションで高性能プロンプトを実行できるようにします。

お読みいただき、ありがとうございました!


次のステップ

Vertex AI Prompt Optimizer とその使用方法について詳しく知りた方は、以下のリソースをご覧ください。

ドキュメント

GitHub のサンプル

Google Cloud ブログ