リソース/モデルのトレーニング/チャットからトレーニング例へ

概念

マルチターン会話と重み付け

複数のアシスタントの返答を含む会話がトレーニングデータになる仕組み、プロバイダーが使用する2つのフォーマット、および注意すべき副作用について。

第3章読了時間 2分参考文献 4件

課題

実際の会話が1つの質問と1つの回答だけで構成されることは稀です。サポートチャットでは、挨拶、明確化のための質問、2つの部分的な回答、そして最終的な解決策など、10回のやり取りに及ぶこともあります。これらのアシスタントの返答の中には学習する価値があるものとそうでないものがあります。学習フォーマットは、完全なコンテキストと、どの返答を重視するかの選択の両方を表現できなければなりません。

メッセージごとの重み付け · 1つのレコード
userこんにちはassistant · weight 0コンテキストのみuserレポートをPDFとしてエクスポートassistant · weight 1学習
重み付けなし · ターゲットごとに1つのレコード
userこんにちはassistant結果的に学習userレポートをPDFとしてエクスポートassistant学習✂
2番目の返答のみが選択された同一のチャット。重み付けがある場合、1番目の返答はコンテキストとして維持されます。重み付けがない場合、レコードは選択された返答の後で分割され、その中に含まれるすべてのアシスタントの返答が学習されます。

アプローチ1: メッセージごとの重み

一部のフォーマットでは、各アシスタントのメッセージに重みを持たせることができます。会話全体を1つのレコードとし、weight: 1とマークされた返答は学習され、weight: 0とマークされた返答はコンテキストとしてのみ扱われます — 読み込まれますが、評価はされません。

メッセージごとの重み
{"messages": [
  {"role": "user",      "content": "Hi"},
  {"role": "assistant", "content": "Hello! How can I help?", "weight": 0},
  {"role": "user",      "content": "Export my report as PDF"},
  {"role": "assistant", "content": "Open the report, click Export → PDF…", "weight": 1}
]}

これは効率的なオプションです。各レコードは1回処理され、会話内のすべてのターゲットがそのコンテキストを共有し、何を学習するかの選択が正確に行われます。

アプローチ2: ターゲットごとに1レコード

重み付け(ウェイト)のないフォーマットでは、「これが会話です。アシスタントの返答を学習してください」としか指示できません。特定の返答を学習させるには、その直後で会話を切り取り、独立したレコードとして記述する必要があります。3つのターゲットを含む会話は3つのレコードになり、それぞれが前のものより長くなります。

重みなし — 選択した返答の後にレコードを分割
{"messages": [
  {"role": "user",      "content": "Hi"},
  {"role": "assistant", "content": "Hello! How can I help?"},
  {"role": "user",      "content": "Export my report as PDF"},
  {"role": "assistant", "content": "Open the report, click Export → PDF…"}
]}

これには2つの副作用があります。フォーマット上、コンテキストのみとしてマークできないため、レコード内の以前のアシスタントの返答もすべて学習されてしまいます。これには、選択しなかった返答も含まれます。また、会話の序盤部分は複数のレコードに登場するため、複数回処理され、その分のコストが発生します。

計算例
  1. 1つの会話に、それぞれ約250トークンのやり取りが4回あります。返答2と4がターゲットであり、返答1と3はターゲットではありません。
  2. 重みありの場合: 約1,000トークンの1つのレコードになります。返答2と4はそれぞれ1回学習され、1と3はコンテキストとして扱われます。
  3. 重みなしの場合: 返答2の後で分割されたレコード(約500トークン)と、返答4の後で分割されたレコード(約1,000トークン)の2つになります — 合計1,500トークンとなり、50%増加します。
  4. レコード内のすべてのアシスタントの返答が学習されます。返答1と2は2回、返答3と4は1回です。選択しなかった返答1と3も学習されることになります。

重要となるケース

会話が短い場合や、アシスタントのすべての返答が適切である場合、その差はわずかです。しかし、会話が長い場合、序盤の返答の質が低い場合(後で修正された誤った最初の試みなど)、または意図的に返答を除外した場合に問題となります。重み付けをサポートするプロバイダーを使用すれば、選択した内容を正確に得ることができます。サポートしていないプロバイダーの場合は、トレーニング前に質の低い返答を修正しておく価値があります。

よくある間違い

  • プロバイダーのフォーマットに関わらず、マークしていない返答は学習されないと思い込むこと。
  • プロバイダーが除外できない場合に、長い会話の中で誤った初期の返答を残してしまうこと。
  • 繰り返されるコンテキストを考慮せずに、プロバイダー間でトークン数を比較すること。
  • 1つの会話のレコードを学習用と検証用に分割すること。このため、分割は会話単位で行われます。

参考文献および関連資料

外部ソースは新しいタブで開きます。

  1. 01SFT TrainerHugging Face TRL docs · huggingface.co会話全体の中で、アシスタントのターンのみを対象としたトレーニング。
  2. 02Chat templatesHugging Face Transformers docs · huggingface.coモデルに対してマルチターンチャットがどのように配置され、アシスタントのターンがどのように配置されるか。
  3. 03Supervised fine-tuningOpenAI API docs · developers.openai.comマルチターンの例を含む、プロバイダーのチャット形式のトレーニングデータ。
  4. 04Prepare supervised fine-tuning data for Gemini modelsGoogle Cloud documentation · docs.cloud.google.comユーザーとモデルのロールを含むコンテンツフォーマット。

専門家が数週間かける作業を数分に短縮します

Scalataがお客様のチーム、データ、および統制にどのように適合するかをご確認ください。

営業へのお問い合わせ