🎬

LangWatch Optimization Studioでプロンプトをノーコードで自動最適化する

に公開

はじめに

LLM アプリケーションの開発において、プロンプトの最適化に苦労している方は多いのではないでしょうか。
プロンプトを変更して、実行して、結果を確認して、またプロンプトを変更して...という作業を繰り返すのは非常に手間がかかります。
また、結果が良くなったかどうかの判断も難しい場合があります。

この記事では、その手間や悩みを減らすことができるかもしれない、LangWatch Optimization Studio の使い方を紹介します。
ノーコードでプロンプト最適化を実行できるため、敷居が低く試しやすいのが特徴です。

LangWatch とは

LangWatch は、LLMOps プラットフォームです。
LLM 実行のトレース、評価、プロンプト管理、データセット管理などの機能を提供します。

https://langwatch.ai/

SaaS として提供されているほか、 GitHub でソースコードが公開されています。

https://github.com/langwatch/langwatch

ただし、Business Source License 1.1 (BSL-1.1) となっているため、本番環境での商用利用には制約がある点に注意が必要です。

Optimization Studio とは

Optimization Studio は、LLM ワークフローの作成、評価、最適化を行うための機能です。
プロンプトの最適化には、内部で DSPy が利用されています。
DSPy は LLM アプリのプロンプトや few-shot を、学習データに基づいて自動最適化する Python 製のフレームワークです。

次の要素で構成されています。

Node

ワークフローを構成する要素です。次の種類のノードがあります。

  • Entry ノード
    • ワークフローの開始点です。入力データを指定します。
  • LLM ノード
    • LLM を呼び出すノードです。モデル、プロンプト、入力、出力を設定します。
  • End ノード
    • ワークフローの終了点です。出力データを指定します。

Datasets

評価や最適化に使用するデータの集合です。

Evaluators

LLM ワークフローの出力を評価します。
評価方法には、期待値の完全一致や、LLM に判断させる LLM as a Judge などがあります。

実践: エンジニアのレベル判定プロンプトの最適化

簡単な例として、エンジニアのレベルを 3 段階で分類するワークフローを作成し、プロンプトを最適化してみます。
レベル判定の精度が高くなる、プロンプトと Demo(few-shot の例)を自動生成することを目指します。

なお、few-shot は LLM に入力する複数のお手本全体のことで、その一つひとつの「入力 → 出力」のお手本が Demo です。

事前準備

  • LangWatch のアカウントを作成します。docker-compose でローカルで動かすことも可能ですが、本記事の主旨とは異なるため割愛します。
  • LLM の API キーを用意します。今回は Google Gemini を使用しました。

Gemini モデルの設定

Gemini の API キーを発行します。
https://app.langwatch.ai/settings/model-providers から Gemini を Enabled にし、GEMINI_API_KEY に API キーを設定します。
Save を押したら設定完了です。

Geminiの設定

ワークフローの作成

LangWatch にログインし、Workflows から Create New をクリックします。
Blank Template を選択し、名前を入力して Create Workflow をクリックします。

Workflowトップ

workflowの作成

ワークフローエディタが開き、Entry、LLM、End のノードが最初から配置されています。

初期ワークフロー

DATASET の作成

評価と最適化に使用するデータセットを作成します。

入力となるエンジニアのプロフィール(text)と、正解となるレベル(level)1-3 を次のように CSV 形式で用意します。

text,level
Goを半年ほど触っています。個人開発中心です。,1
Goを3年使っています。API設計やレビューも担当しています。,3
Goを5年使っていますが、業務では保守が多いです。,2
Goを1年使っていますが、設計から関わっています。,3
Pythonを半年使っています。スクレイピングが中心です。,1
Pythonを2年使っています。DjangoでAPI開発経験あり。,2
Pythonを4年使っています。要件定義や設計にも入っています。,3
Python歴は3年ですが、分析系が中心でWebは未経験です。,2
Pythonは独学で3年ですが、チュートリアル中心です。,1
Pythonは1年ですが、FastAPIでプロダクト開発に参加しています。,3
省略...
※ 実際には 50 件程度のデータセットを用意しました。

Entry ノードの Dataset の Edit をクリックします。

Upload or Create Dataset をクリックし、Create New Dataset を選択します。

Upload CSV から先ほどの CSV ファイルをアップロードします。

Datasetの作成

名前を入力し、Save をクリックします。

Entry ノードの設定

Dataset は先程作成したものを選択します。
すると、Fields には text と level が自動で設定されます。
これで Entry ノードの設定は完了です。

Entryノードの設定

LLM ノードの設定

LLM ノードをクリックして設定画面を開きます。

次のように設定します。

  • Model

    • gemini-2.5-flash-lite
  • Inputs

    • text: str
  • Outputs

    • out_level: str
  • System Prompt

あなたはエンジニアのスキルを判定するアシスタントです。
以下の入力に基づき、スキルレベルを1〜3で推測してください。
厳密なルールはありません。あなたの判断で答えてください。
  • User Prompt
以下のエンジニア情報から、スキルレベル(1〜3)を1つだけ返してください。
回答は数字のみ。

{{text}}

{{text}} は変数を表しており、 実行時は Input の text の内容が入ります。

LLMノードの設定

  • Entry ノードとの接続

    • Entry ノードの text を LLM ノードの text と接続します。

Evaluator の設定

LLM ノードの評価を行う Evaluator を作成します。
ここでは、完全一致で評価する Exact Match を使用します。
Exact Match をドラッグアンドドロップでワークフローエディタに追加します。

LLM ノードの out_level と Exact Match の output を接続します。
Entry ノードの level と Exact Match の expected_output を接続します。

ワークフローの完成

以上までの設定でワークフローが完成しました。
全体は次のようになります。

完成したワークフロー

Evaluate の実行

ワークフローの動作確認も兼ねて、Evaluate を実行します。
画面右上の Evaluate ボタンをクリックします。
Save & Run Evaluation をクリックすると実行されます。

Evaluateの実行

実行が完了すると、Evaluations タブに結果が表示されます。
データセットに対して、ワークフローが実行され、各々の結果と全体の正解率が表示されます。
今回は 73.5% でした。
Optimize でこの数値を向上させていきます。

Evaluate結果

Optimize の実行

Optimize を実行して、プロンプトの自動最適化を行います。

右上の Optimize ボタンをクリックします。
次のように設定します。

  • OPTIMIZER

    • Prompt + Demonstrations (MIPRO v2)
    • システムプロンプトと Demo(few-shot の例)の両方を最適化する設定です。
    • MIPRO v2 の概要は後述します。
  • TEACHER LLM

    • gemini-2.5-flash-lite
    • MIPRO v2 でプロンプトや Demo を生成する際に使用する LLM です。
  • Number of Candidate Prompts

    • 7
    • 生成する候補プロンプトの数
  • MAX Bootstrapped Demos

    • 4
    • 生成する Demo(few-shot の例)の上限数
  • Max Labeled Demos

    • 16
    • trainset(学習用データセット)から選択する Demo の上限数

Optimizeの設定

Run Optimization を押すと、最適化が開始されます。

最適化が完了すると、Optimizations タブに結果が表示されます。

Optimize結果

各 Step ごとに、評価結果や利用されたプロンプト、Demo の内容が確認できます。
最適化の結果、Score が 90 となるプロンプトと Demo が見つかりました。
内容は次の通りです。

  • プロンプト(Instruction)
あなたは優秀なAIエンジニアであり、提供された職務経歴書を分析して、そのエンジニアのスキルレベルを評価するタスクを担当します。
提供された職務経歴書のテキスト入力に基づいて、スキルレベルを1から3の範囲で判定してください。
スキルレベルの定義は以下の通りです。
*   **レベル1:** 主にチュートリアルや基本的なタスクの実行に焦点を当てた経験。
*   **レベル2:** 特定の技術を用いたUI実装や、限定的な範囲での開発経験。
*   **レベル3:** システム設計やアーキテクチャの主導など、より広範で責任のある役割を担った経験。

最終的な出力は、スキルレベルを示す数字(1、2、または3)のみとしてください。推論プロセスや追加の説明は不要です。
  • DEMO
[
  {
    "augmented": true,
    "text": "Scalaを3年使っていますが、データパイプライン保守中心です。",
    "out_level": "2"
  }
]

最適化結果の適用

右下の Apply Best Optimization をクリックすると、最適化で得られた最良のプロンプトと Demo が LLM ノードに適用されます。

最適化結果の適用

補足: MIPRO v2 の概要

MIPRO v2 は、DSPy が提供するオプティマイザーです。
LLM のプロンプトと few-shot の例を、データにもとづいて自動最適化します。
次のような流れで、最適な組み合わせを探索します。

  1. 正解付きデータと評価指標を定義
    「入力と正解のペア」からなるデータセットと評価指標を渡します。評価指標は、例えばモデルの出力が正解と完全一致する割合などです。

  2. few-shot に使う例を自動で作成
    few-shot に入れる例をいくつかのパターンで作成します。ここでの例 1 件 1 件が Demo(お手本)に相当します。

    • データセットの入出力ペアをそのまま例にしたもの(Labeled demos)
    • 入力だけを LLM に入力し、正しく答えられたケースだけを「成功例」として集めたもの(Bootstrapped demos)

    これらを組み合わせて、複数パターンの few-shot セットを生成します。

  3. Instruction を複数パターン生成
    「このタスクはこういうルールで解いてください」というタスク説明文(Instruction)をいくつか自動生成します。
    LangWatch では Instruction は System Prompt に対応します。

  4. Instruction × few-shot セットの組み合わせを試してスコアを比較
    Instruction と few-shot セットの組み合わせについて、データセットの一部を使って実際に LLM を動かし、評価指標に基づいてスコアを計算します。

  5. ベイズ最適化で効率よく探索し、ベストなプロンプトを選択
    Instruction と few-shot セットのすべての組み合わせを総当たりするのではなく、ベイズ最適化により「次に試すべき組み合わせ」を選びながら、スコアの高い組み合わせに絞り込んでいきます。
    最終的に、一番スコアの良かった「Instruction と few-shot 例のセット」が、MIPRO v2 が提案するベストなプロンプト設定になります。

まとめ

LangWatch Optimization Studio を使うと、ノーコードで LLM ワークフローを作成し、プロンプトの自動最適化を実行できます。
もちろん、DSPy を利用して、今回紹介した最適化を Python コードで実装できると思います。
ただ、ちょっとしたプロンプトの最適化を試したい場合など、ノーコードで手軽に試せる点はメリットがあると感じました。
ワークフローのエディタは視覚的に直感で使いやすく、特に Dify や n8n を使ったことがある方ならすぐに馴染めるのではないかと思います。
LLM アプリケーション開発は不確実性に向き合うことになりがちですが、こうしたツールを活用して試行錯誤の効率を上げていきたいですね。
本記事がそういった方々の一助となれば幸いです。

参考

https://docs.langwatch.ai/optimization-studio/optimizing
https://langwatch.ai/blog/the-power-of-miprov2-in-a-low-code-environment-with-langwatch-s-optimization-studio
https://langwatch.ai/blog/what-is-prompt-optimization-an-introduction-to-dspy-and-optimization-studio
https://www.langtrace.ai/blog/grokking-miprov2-the-new-optimizer-from-dspy

Discussion