はじめに

DPO(Direct Preference Optimization)訓練において、モデルの性能を客観的に評価することは非常に重要です。これまでTrial 11〜14で対数確率ベースの評価を実施してきましたが、「実際の応答品質」を測る評価が不足していました。 そこでTrial 17では、GPT-4 APIを使った自動評価システムを構築し、コールセンターボットの応答を5段階で評価する実験を行いました。 本記事では、システム構築の過程で遭遇した技術的課題、Base Modelの評価結果、そして今後の展望について報告します。 ---

実行サマリー

日時: 2025-10-29 実行時間: 21.2分 推定コスト: $0.26(Lambda Labs: $0.23 + OpenAI API: ~$0.03) インスタンス: gpu_1x_a10 (us-west-1, $0.75/時間) ---

技術的成果

✅ 1. OPENAI_API_KEY環境変数の伝搬問題を解決

問題: Lambda Labs リモートサーバーでOPENAI_API_KEY環境変数が設定されず、GPT-4 API通信に失敗 原因: lambda_auto_train.pyがローカルの環境変数をリモートサーバーに伝搬していなかった 解決策: lambda_auto_train.pyrun_training()メソッドを修正
def run_training(self, command: str, tmux_session: str = None) -> None:
    """訓練を実行"""
    env_vars = "export TF_USE_LEGACY_KERAS=1 && export USE_TF=0 && "

# OPENAI_API_KEYを追加(存在する場合) openai_key = os.environ.get("OPENAI_API_KEY") if openai_key: env_vars += f"export OPENAI_API_KEY='{openai_key}' && " print(f"✅ OPENAI_API_KEY をリモート環境に設定") else: print(f"⚠️ OPENAI_API_KEY が見つかりません")

# tmuxセッション作成&訓練実行(環境変数付き) tmux_cmd = f"tmux new-session -d -s {tmux_session} '{env_vars}{command} 2>&1 | tee ~/workspace/{self.project_name}_training.log'" # ...

結果: GPT-4 API との通信に成功し、Base Model評価が完了 ✅ ---

✅ 2. 訓練パイプラインの完全動作

2段階訓練アプローチ(SFT → DPO)がすべて成功:

| ステージ | 結果 | 詳細 | |---------|------|------| | SFT訓練 | ✅ 完了 | Loss: 13.4954 → 0.2915 (78.4%削減)
早期停止: epoch 14.62 | | DPO Beta=0.05 | ✅ 完了 | Accuracy: 100%
Margins: 0.045 → 1.502 (33倍改善) | | DPO Beta=0.03 | ✅ 完了 | 正常終了 | | DPO Beta=0.01 | ✅ 完了 | 正常終了 |

所要時間: 18.6分(SFT: 15分、DPO×3: 3.6分) ---

✅ 3. Base Model GPT-4評価: 10/10質問完了

評価結果サマリー:

| 指標 | 値 | |------|-----| | 平均スコア | 2.7/5 | | スコア分布 | 5/5: 10% ■
4/5: 30% ■■■
2/5: 30% ■■■
1/5: 30% ■■■ |

カテゴリ別パフォーマンス:

| カテゴリ | 平均スコア | 評価 | |----------|-----------|------| | 事務手続き (領収書、キャンセル、交換) | 4.3/5 | 良好 ✅ | | 配送管理 (配送先変更) | 4.0/5 | 良好 ✅ | | その他 (ギフト、未着、会員、在庫、クーポン、送料) | 1.5/5 | 不十分 ❌ |

代表的な良い応答例(Q9: 注文のキャンセルは可能ですか? - 5/5):
はい、可能です。

ただし、キャンセル料としてご注文金額の半額がかかりますので、 あらかじめご了承ください。

【キャンセル方法】 ■ご注文日の当日に出荷(ご注文が完了した商品を1つの倉庫に出荷します...

GPT-4評価理由: > この応答は、詳細で丁寧な説明が含まれており、具体的な手順や例を提供しています。ユーザーがキャンセルプロセスを理解しやすいように、段階的な指示が明確に示されています... 代表的な悪い応答例(Q7: クーポンコードが使えないのですが。 - 1/5):
お早めにどうぞ。
(追記)
3月15日に、再度、おトクなきっぷ「九州乗り放題きっぷ」が発売されました。
九州内の往復は「九州新幹線」が乗り放題、九州内の乗り放題きっぷとセットで購入すると2,000円割...
GPT-4評価理由: > 応答は質問の内容に全く関連しておらず、クーポンコードの問題に対する具体的な解決策や説明が含まれていません。また、提供された情報は質問とは無関係であり、ユーザーの... ---

技術的課題

❌ SFT/DPO Models GPT-4評価: 途中で失敗

評価完了状況:
  • Base Model: 10/10 ✅
  • SFT Model: 1/10 ⚠️(Q1のみ)
  • DPO Models (×3): 0/10
Q1でのSFT改善効果:

| モデル | スコア | 改善幅 | |--------|--------|--------| | Base | 1/5 | - | | SFT | 4/5 | +3ポイント ✨ |

SFT応答例(Q1: ギフト包装をお願いできますか?):
はい、可能です。ご注文時、お届け先等を入力する画面にて「ラッピングを希望」にチェックを入れてください。ギフト包装を承ります。
最短出荷日はいつですか?
出荷完了日は最短で出荷日の翌日です。最短で出荷日...
改善点:
  • Base Model(1/5)は「申し訳ございませんが、プレゼント包装は行っておりません」という不適切な回答
  • SFT Model(4/5)は「はい、可能です」と正確に答え、具体的な手順を説明 ✨
---

JSONDecodeError による評価停止

エラー詳細:
json.decoder.JSONDecodeError: Unterminated string starting at: line 3 column 16 (char 31)
発生箇所: gpt4_evaluator.py:95(SFT Model評価のQ2で発生) 原因分析: 1. GPT-4レスポンスが不完全なJSON形式で返された 2. reasoningフィールドの文字列が途中で切れた(おそらくmax_tokens制限に達した) 3. エラーハンドリングが"Non-retryable error"と判断し即座に停止 影響範囲:
  • SFT Model評価: 2/10質問で停止(残り9問未評価)
  • DPO Models評価: 未実施(30問未評価)
---

Base Modelの強み・弱みの分析

強み

1. 事務手続き系の質問に強い (領収書、キャンセル、サイズ交換) - 平均スコア: 4.3/5 - 段階的な説明が得意 - 具体的な手順を含む応答が可能

2. 配送管理系 (配送先変更) - 平均スコア: 4.0/5 - 注意事項を詳細に記載

弱み

1. 質問との関連性が低い応答を生成しやすい - 例: クーポンの質問に対して「九州新幹線」の話を返す(1/5)

2. 短すぎる応答 - 例: 在庫確認の質問に「各店舗までお問合せ下さい」のみ(2/5)

3. 無関係な情報の混入 - ギフト包装の質問に「プレゼント包装は行っておりません」と誤回答(1/5)

---

SFT Modelの改善効果(限定的データ)

1問のみのデータ:
  • ギフト包装: 1/5 → 4/5(+3ポイント改善 ✨)
  • 具体的な手順の説明が追加
  • ユーザーの状況に配慮した応答
この結果は、SFT訓練により明確な改善効果が見られることを示唆していますが、1問のみのデータなので一般化には注意が必要です。 ---

次のステップ

優先度1: 評価システムの安定化

問題: JSONDecodeError により評価が途中で停止 解決策オプション: 1. max_tokens制限を追加 - reasoningフィールドの長さを制限 2. リトライ機構の強化 - JSON parse失敗時に再試行 3. フォールバック処理 - JSON parse失敗時にデフォルトスコアを返す

優先度2: 完全評価の実施

必要な評価:
  • SFT Model: 残り9問
  • DPO Beta=0.05: 10問
  • DPO Beta=0.03: 10問
  • DPO Beta=0.01: 10問
推定時間: 約15-20分 推定コスト: $0.05-0.10(OpenAI API)

優先度3: 結果の可視化

計画中のグラフ: 1. モデル別スコア比較(Base vs SFT vs DPO×3) 2. 質問別改善度 3. カテゴリ別パフォーマンス ---

結論

部分的な成功

  • OPENAI_API_KEY問題を完全解決 - 環境変数伝搬の実装完了
  • Base Model完全評価を実施 - 平均スコア2.7/5、カテゴリ別の強み・弱みを特定
  • SFT Model改善効果の兆候を確認 - 1問で+3ポイント改善
  • ⚠️ 評価システムのJSON処理に脆弱性を発見 - max_tokens制限の必要性
  • 完全な5モデル評価は未完了 - JSONDecodeErrorで停止

重要な発見

1. Base Modelは事務手続き系に強く、その他のカテゴリに弱い - 事務手続き: 4.3/5 vs その他: 1.5/5 - カテゴリ別の訓練データ拡充が必要

2. SFT訓練により明確な改善効果が見られる(限定的データ) - ギフト包装: 1/5 → 4/5(+3ポイント) - 完全評価により一般化可能性を確認する必要あり

3. 評価システムのエラーハンドリング改善が必要 - JSONDecodeErrorのリトライ機構実装 - max_tokens制限の追加

技術的価値

  • Lambda Labs自動化システムの完全動作確認
  • GPT-4評価パイプラインの実証
  • 環境変数伝搬問題の解決方法の確立
---

まとめ

Trial 17では、GPT-4評価システムを構築し、Base Modelの性能を客観的に評価することに成功しました。OPENAI_API_KEY伝搬問題の解決は、今後のLambda Labs自動化において重要な知見となります。 SFT ModelがBase Modelから大幅に改善されている兆候(1/5 → 4/5)が確認できたことは非常に励みになりますが、JSONDecodeErrorによる評価停止により、完全な5モデル評価は達成できませんでした。 次回は、評価システムのJSON処理を改善し、SFT ModelとDPO Models(×3)の完全評価を実施する予定です。 --- 関連記事: プロジェクトリポジトリ: dpo-rlhf-demo 実行環境: Lambda Labs GPU (gpu_1x_a10, $0.75/時間)