👀

【生成 AI 時代の LLMOps】モデル マイグレーション編

に公開

はじめに

次の記事では、LLOMps の第一歩となる、プロンプトの管理について、Google Cloud で提供されているツールを交えながら説明しました。

今回の記事は、モデル マイグレーション編です。今日のモデルのアップデートに追従するために必要な考え方、ツールについてご紹介します。

モデルのライフサイクル

皆様は今使っている生成 AI モデルがいつまで使えるかご存知でしょうか。
アプリケーションとしての生成 AI とは異なり、生成 AI モデルのアップデートはそれを使うエンジニア、組織にとって非常に重要なニュースです。なぜなら、モデルアップデートによって一般的な性能が高まっていることが期待できる一方、自分たちのユースケースにおいて精度が改善しているかは未知数だからです。

例えばプログラムのライブラリやモジュールがアップデートした際、古いバージョンはメンテナンスがされないというイメージだと思います。無理に最新版を使わず、一連のテストを終えて初めてアップデートするでしょう。より身近な例だと、一世代前の OS のパソコンを使っていても「気が向いたらアップグレードしよう」と考える方も多いと思います。

しかし、生成 AI のモデルアップデートは少し性質が異なります。それは、モデルが API として提供されており、あなたが使っていない時も計算に必要なインフラは確保され動き続けていますという点が異なります。つまり新しいモデルがリリースされるというのは、古いモデルの提供が終わることとセットで考えなければなりません。もちろん新しいモデルのサービス開始と古いモデルのサービス終了が同じ日に行われることはまずないと思いますが、「新しいモデルに移行する」ということを頭の片隅に置いておく必要があります。今使っているモデルがいつまで使えるのか、是非ご確認ください。

モデル マイグレーションの必要性

「巨人の肩の上に立つ」という表現がありますが、生成 AI もそれを体現したようなサービス形態になってきました。モデルやサービスのプロバイダが大量のデータ、演算に投資して、その成果や恩恵を共有するという仕組みです。モデルがアップデートされるということは、より高品質なものが提供されるということを期待されると思いますが、生成 AI において「高品質」というのは一般化しづらいです。なぜならより広範囲なタスクに高精度で対応できるモデルを作っているので、個別の全てのタスク、ユースケースに対して精度が向上していることを保証できるわけではありません。そして生成 AI という性質上、新しいモデルに適したプロンプトは改めて探す必要もあります。

Prompt Optimizer

前述のように、モデルのバージョンを上げるためにはいくつかの注意点があります。例えばプロンプトエンジニアリングの必要性、個別タスクの評価などですが、ここではプロンプト エンジニアリングにフォーカスします。個別タスクの評価はデータの準備が重要なので、まずは手軽に「以前と同等の生成結果を得たい」という最低ラインの目標を達成したいと思います。

以下の図のように、プロンプトをアップデータしたいモデルに入力した際、期待通りの出力を返してくれるとは限りません。プロンプト v1 は Gemini 1.5 に適したものを試行錯誤の中から導き出したからです。では Gemini2.5 に適したプロンプト v2 を獲得するためにはどうすると良いでしょう。


図1: モデルの移行

まずは Gemini 2.5 に対してゼロからプロンプト エンジニアリングに取り組みという方法があります。しかし、Gemini 1.5 で獲得したプロンプトを活用できるのであればそれに越したことはありません。業務効率を考えると、プロンプトエンジニアリングの実験時間は最小限に抑えたいはずです。そこで、プロンプト v1 から v2 に最適化するツールとして、Google Cloud では Prompt Optimizer が提供されています。

機能の公式ドキュメントに詳しく記載されていますが、ここでは簡単に説明したいと思います。重要なことは、プロンプトの最適化のため準備すべきデータセットが非常に小さいことです。公式ドキュメントには、「理想は50-100サンプルだが、5サンプルでも効果的」と記載されています。

Prompt Optimizer の準備

まずは、現状のモデルでどのような振る舞いをしているか入力する必要がありますので、システム プロンプト、プロンプトテンプレート、サンプルデータを用意します。ここでは公式ドキュメントの例を用いて説明します。(翻訳の都合でシステム プロンプトに英語が残っていますが、簡単のため修正しています。ご了承ください。)

system prompt

You are a professional chef. Your goal is teaching how to cook healthy cooking recipes to your apprentice.

Given a question from your apprentice and some context, provide the correct answer to the question.
Use the context to return a single and correct answer with some explanation.

prompt template

Question: {input_question}
Facts: {input_context}

サンプルデータ

input_question input_context
健康に悪い化合物の形成を最小限に抑えながら、赤身肉や豚肉の風味と柔らかさを最大限に引き出す調理方法を教えてください。 赤身肉と豚肉は、安全を確保するために内部温度を摂氏 63 度(華氏 145 度)にする必要があります。レモン汁や酢などの酸性成分で肉をマリネすると、硬い筋肉繊維が分解され、肉が柔らかくなります。グリルやフライパン焼きなどの高温調理方法では、おいしい焼き色やカラメル化を実現できますが、その場合、有害な化合物が発生する恐れのある焦げ付きを避けることが重要です。
添加糖類や人工添加物を使用せずに、プロテイン シェイクに風味と栄養を加える創造的な方法はありますか? ほうれん草やケールなどの葉物野菜を加えることで、味を大きく変えることなく、シェイクの栄養価を高めることができます。通常の牛乳の代わりに、無糖アーモンドミルクやココナッツ ウォーターを使用すると、それぞれ繊細な甘みと健康的な脂肪や電解質を加えることができます。シェイクを過度に混ぜると、温度が上昇する可能性があることをご存じですか?冷たくてさわやかに保つには、短時間でミキシングし、必要に応じてミキシングを中断します。

上記のデータは既存のモデルで動いているプロンプトを持ち込むだけなので、新たにデータセットを準備するよりも手軽です。ログを抽出すれば、動かすことができます。system_prompt prompt_template input_question input_context は既存のモデルでの振る舞いをデータとして準備したものです。下の図では青の枠です。


図2: Prompt Optimizer のイメージ図

これに対して、新モデルでも同等の振る舞いをするように、prompt を繰り返しアップデートすることで、これを最適化します。この図から分かるように、準備したデータ以外に検討すべきは、新モデル(gemini-2.5-flash-001 など)、生成結果を評価するための指標です。

Prompt Optimizer の設定

ドキュメントに記載されているノートブックのリンクから、実装のサンプルをダウンロードすることができます。この記事ではすべてのパラメータを説明することを避け、重要なポイントをいくつかご紹介します。より深く理解されたい方は、ノートブックのコメントアウトをご参照ください。

Target Model

まずは Step 3 のtarget_model です。これは、上の図の新モデルに該当します。移行先のモデルを指定することができます。現モデルに制限はないため、Google Cloud 以外のモデルのデータを Gemini に移行するという使い方もできます。移行先は最適化の過程で推論が必要になるため、与えられたモデルから選択する必要があります。

TARGET_MODEL = "gemini-2.0-flash-001"  # @param ["gemini-2.5-flash-lite", "gemini-2.5-flash", "gemini-2.5-pro", "gemini-2.0-flash-lite-001", "gemini-2.0-flash-001"]

評価指標

現モデルの生成結果と新モデルの生成結果に差がない(=近い)ことが Prompt Optimizer のゴールですが、自然言語における「差」は非常に曖昧です。そこで、学術論文などで採用されているような計算ベースの指標(BLEU など)や、タスクに特化したquestion_answering_qualityなどが用意されています。これらを用途に応じて選ぶことで、適切な「近さ」を指定することができます。

EVAL_METRIC = "question_answering_correctness"  # @param ["bleu", "coherence", "comet", "exact_match", "fluency", "groundedness", "metricx", "text_quality", "verbosity", "rouge_1", "rouge_2", "rouge_l", "rouge_l_sum", "safety", "question_answering_correctness", "question_answering_quality", "summarization_quality", "tool_name_match", "tool_parameter_key_match", "tool_parameter_kv_match", "tool_call_valid"] {type:"string"}

言語

また、Step 4 で言語の設定ができます。日本語のタスクを扱われている方は漏れなく変更をお勧めします。

TARGET_LANGUAGE = "English"  # @param ["English", "French", "German", "Hebrew", "Hindi", "Italian", "Japanese", "Korean", "Portuguese", "Simplified Chinese", "Spanish", "Traditional Chinese"] {type:"string"}

Prompt Optimizer の実行

ノートブックの Step 5 で最適化の job を実行することになります。ここから、system_prompt prompt_template の逐次的なアップデートが始まります。繰り返しの回数にもよりますが、この最適化には少し時間がかかります。以下のように徐々にアップデートされていき、最終的に最適化された prompt がスコアと共に提案されます。


図3: Prompt Optimizer の振る舞い

公式ドキュメントのデータに戻ると、以下のように最適化された例が紹介されています。

system_instruction 最適化された system_instruction
You are a professional chef. Your goal is teaching how to cook healthy cooking recipes to your apprentice. Given a question from your apprentice and some context, provide the correct answer to the question. Use the context to return a single and correct answer with some explanation. As a highly skilled chef with a passion for healthy cooking, you love sharing your knowledge with aspiring chefs. Today, a culinary intern approaches you with a question about healthy cooking. Given the intern's question and some facts, provide a clear, concise, and informative answer that will help the intern excel in their culinary journey.

モデルをアップデートしても、既存の出力結果が大きく変わらないようにprompt がアップデートされました。新しいモデルに対してゼロからプロンプト エンジニアリングをする手間が省ける可能性があり非常に効率的です。

終わりに

今回は日々進化する生成 AI の世界で、最新のモデルにアップデートすることの重要性、そしてそれを円滑に進めるための機能をご紹介しました。大規模なゴールデンデータセットを用意するような評価プロセスよりも、より手軽で効率的なモデルマイグレーションの方法です。現在使われているモデルのサービス数量が近づいているようでしたら、是非お試しください。

Google Cloud Japan

Discussion