ファインチューニング

**ファインチューニング**は、既存のモデルを取り込み、自分自身の例でトレーニングを継続して、そのデフォルトの動作が望む方向にシフトするようにすることを意味します。この章では、それが何を変えるのか、何が得意なのか、そしていつプロンプトまたはレトリーバルの代わりにそれに手を伸ばすべきかについての実践的な理解を示します。
トレーニングが実際に何をするのか
ファインチューニングが何を変えるのかを見るには、モデルがどこから来るのかを知ることが役に立ちます。モデルは2つの大きな段階で構築されます。
最初は**事前トレーニングです。モデルは膨大な量のテキストを読み、何度も何度も次のトークンを予測することを学び、副作用として文法、事実、推理のパターンがそこに定着するまでトレーニングされます。出力されるのはベースモデル**で、流暢ですが焦点が定まっていません。テキストを喜んで続けますが、質問に答えるために役立つアシスタントになるように教えられていません。
2番目の段階は事後トレーニングです。ベースモデルはさらに、良い応答のキュレートされた例と、どの答えが優れているかについての人間からのフィードバックでトレーニングされます。これが、生のテキスト予測器を、実際に会話する指示に従うアシスタントに変えるものです。APIから呼び出すモデルはすでに両方の段階を通過しています。
両方の段階は同じメカニズムで機能します。モデルに例を示し、その内部の数値(パラメータまたは重み)を調整して、その予測がこれらの例に近づくようにします。トレーニングは、モデルを永久に変更したままにする予測練習です。
ファインチューニングとは
ファインチューニングはその2番目の段階の小規模でターゲットを絞ったバージョンで、自分で実行します。既にトレーニングされているモデルを取り、自分の例のセットで継続してトレーニングし、各例は入力と、希望する出力が一致しています。十分な例の後、モデルの重みはシフトして、この種の応答がデフォルトになり、プロンプトで毎回それを求めることなくなります。
プロンプト設定とRAGとの実際の区別は、変更がどこに住むかです。プロンプト設定とRAGはモデルを凍結したままにして、呼び出しの時点で提供するコンテキストを通じてそれを操舵します。ファインチューニングはモデル自体を変更するため、新しい動作が焼き付けられ、短いプロンプトでも表示されます。実行時により良い指示を与えていません。すでに望む方向に傾いているモデルを配布しています。
実際には、プロバイダーに例の会話のファイルを渡し、トレーニングジョブを実行させて、新しい**モデルID**を取得します。そのIDを他のモデルと同じように呼び出します。ただし、その答えはトレーニング内容を反映しています。ファインチューニングは動作をモデルに移し、プロンプト設定とRAGは凍結されたものを操舵します。
何が得意で、何が苦手か
ファインチューニングは、プロンプトが固定化するのに苦労する**一貫した動作**が必要な場合にその場所を獲得します。毎回正確な出力フォーマット、特定のトーンやハウススタイル、または分類のような狭いタスクが数千の呼び出しに渡って確実に実行されます。また、そうでなければ長いプロンプトで綴る動作がモデルに焼き付けられるため、呼び出しはより安く、より速くできます。
それが落ちる場所は知識です。ファインチューニングは新しい事実をモデルに教えるのに貧弱で、変わる事実に更に貧弱です。トレーニング例は正確でルックアップ可能なエントリとして保存されるのではなく一般的なパターンにぼやけるため、ファインチューニングされたモデルはまだ詳細を発明し、情報が更新される瞬間に依然として陳腐化します。価格や政策が変わるたびにリトレーニングするのは遅く、高額です。「モデルはXを知りません」という問題の答えはほぼ常にRAGで、ファインチューニングではありません。
経験則:形を変えるファインチューン、事実を追加するのではなく。モデルに答え方を教え、取得に事実の処理をさせます。
プロンプト、RAG、またはファインチューニング?
ほとんどの場合、ここから始めません。3つの技術は**ラダー**を形成し、変更するのに最も安く最も速い最初:
- プロンプト設定。 これを常に最初に試してください。反復は即座で、追加コストはなく、明確なプロンプトと数個の例が人々が期待するより多くを解決します。プロンプトを機能させていない場合、ファインチューニングする準備ができていません。
- RAG。 モデルが持っていない事実が必要な場合、または時間とともに変わる場合、これに到達します。RAGはそれらを質問時に提供し、モデルに触れません。
- ファインチューニング。 ギャップが知識ではなく動作で、プロンプト設定がそれを十分に一貫性を作ることができない場合、または自分のプロンプトが大きくなり、指示をモデルに焼き付けるのはスケールでより安くて速いときに到達します。
これらは相互排他的ではなく、最強のシステムはそれらを組み合わせます。モデルをフォーマットとトーンのためにファインチューンしてから、実行時に現在の事実を取得するためにRAGを使用します。トレーニングからの動作、取得からの知識。
そのため、ファインチューニングする前の短いテスト。より良いプロンプトでそこに着きますか?その後そうしてください。ギャップは知識がありませんか?その後、RAGです。
ラダーを上る。ファインチューニングは最初のランではなく最後のランです。プロンプトが既に正しく、事実が既に利用可能で、モデルが依然として十分に一貫して動作しないときだけ、ファインチューニングは適切なツールになります。
実際に
ファインチューニングデータは何も異国ではありません。各例は実行時に送信する正確な形状の短い会話で、望むモデルが与えた答えで終わります。
# ここで数個表示されます。実際のデータセットは数百から数千の例で、
# 実行時に予期される入力の全範囲をカバーします。
training_examples = [
{"messages": [
{"role": "system", "content": "チケットの緊急度を低、中、高に分類します。"},
{"role": "user", "content": "今週2回請求されたので、今日中に修正が必要です。"},
{"role": "assistant", "content": "high"},
]},
{"messages": [
{"role": "system", "content": "チケットの緊急度を低、中、高に分類します。"},
{"role": "user", "content": "ダークモード設定はどこかにありますか?"},
{"role": "assistant", "content": "low"},
]},
# ...
]これらをファイルに保存し、プロバイダーでトレーニングジョブを開始して、それが完了するのを待ちます。返されるのは新しいモデルIDで、他のモデルと同じように呼び出します。
# ファインチューニングされたモデルは別のID。その他すべては変わりません。
response = client.chat.completions.create(
model="your-org/urgency-classifier-v1",
messages=[
{"role": "system", "content": "チケットの緊急度を低、中、高に分類します。"},
{"role": "user", "content": "エクスポートボタンをクリックするときに何もしません。"},
],
)
# response.choices[0].message.content -> "low" (ラベルのみ、トレーニングした動作)勝利は動作がモデルに住むことです。指示はより短くでき、フォーマットは数千の呼び出しに渡って保持し、あなたはそこに着くためにプロンプトを成長させる必要がありませんでした。コストはそのすべての周りです。品質**データセット**、トレーニング実行、そして学習したものを変更したいたびにフレッシュジョブが必要です。これは正確にこれがラダーの下に座る理由です。例をアップロード、モデルIDを取得、他のモデルと同じように呼び出します。
これは、モデルが予測テキストを行う机の上に葉するモデルの何を知ると答えるかを形作つ最後の方法です。次の章はそれに行為する能力を与えます。ツール使用ではモデルはあなた自身の機能を呼び出し、その後ループでエージェントとして実行します。

