Zero-Shot、One-Shot、Few-Shot
例の数を選択します。
「Zero-Shot、One-Shot、Few-Shot」はCoddyKit上の無料AI Prompt Engineeringレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAI Prompt Engineering学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 AI Prompt Engineeringコースには全4レッスンが含まれています。
ショット数のスペクトラム
ショットとは、実際のクエリの前にプロンプトへ配置する、ラベル付きのデモンストレーションの数を指します。ゼロショットではモデルが事前学習で得た事前分布に完全に依存します。一方、フューショットでは重みを更新せず、推論時に小規模なタスク固有の分布をモデルに条件付けます。
これは文脈内学習(ICL)です。Transformerは例をシーケンスの一部として扱い、例に対してメタ学習された回帰のような処理を暗黙的に実行します。k(ショット数)は経験的に調整するハイパーパラメーターであり、固定されたベストプラクティスではありません。
from dataclasses import dataclass
@dataclass
class ICLConfig:
k: int # number of demonstrations
selection: str # 'static' | 'dynamic'
order: str # 'random' | 'similarity' | 'curriculum'
# Zero-shot is simply k=0
cfg = ICLConfig(k=0, selection='static', order='random')ゼロショットが有効な場合
タスクが事前学習で十分に扱われている場合(要約、翻訳、一般的な分類など)や、例によって出力形式が偏る可能性がある場合は、zero-shotを優先してください。指示チューニング済みのモデルでは、簡潔な指示と出力スキーマの組み合わせのほうが、スタイルを subtly 固定してしまう例よりも効果的なことがよくあります。
Zero-shotはトークンコストとレイテンシーも最小限に抑えられます。また、デモの中で最も多いクラスをモデルが過剰に予測する多数派ラベルバイアスも回避できます。
# Zero-shot with explicit schema beats vague few-shot
PROMPT = (
'Classify sentiment as POSITIVE, NEGATIVE, or NEUTRAL.\n'
'Respond with only the label.\n\n'
'Text: ' + user_text + '\nLabel:'
)フォーマットのアンカーとしてのワンショット
One-shotは、タスクの概念は明確でも、出力形式が特殊または厳密な場合に力を発揮します。1つのデモンストレーションで、文章による説明よりもはるかに確実に、正確な形(JSONキー、区切り文字、大文字・小文字の使い分け)を教えられます。
トークンを大量に消費したり、複数の例によって生じるラベル分布の偏りを招いたりせずに構造を制約したい場合は、one-shotを使用してください。
ONE_SHOT = (
'Extract entities as JSON.\n\n'
'Input: Apple released the iPhone in Cupertino.\n'
'Output: {"org": ["Apple"], "product": ["iPhone"], "loc": ["Cupertino"]}\n\n'
'Input: ' + query + '\nOutput:'
)Few-shotとk曲線
kに対する性能は、単調に向上するとは限りません。通常は上昇してから横ばいになり、その後、例がコンテキストに詰め込まれることで注意が分散し、処理対象のクエリがモデルの直近重視の範囲から遠ざかるにつれて低下します。
ホールドアウトセットで、kを{1, 2, 4, 8, 16}について実験的にスイープしてください。最適なkは、タスクの複雑さ、例の長さ、モデルの実効コンテキスト利用率に依存します。実効コンテキスト利用率は通常、モデルが公称するウィンドウ長を大きく下回ります。
def sweep_k(eval_set, candidates, ks=(1,2,4,8,16)):
results = {}
for k in ks:
acc = evaluate(build_prompt(candidates[:k]), eval_set)
results[k] = acc
return max(results, key=results.get)ICLが機能する理由:暗黙的推論
研究では、ICLをモデルが暗黙的なベイズ推論を実行しているものとして捉えます。デモンストレーションは、モデルが事前学習中にすでに学習した潜在的なタスク概念を特定する助けになります。例はタスクに関する事後分布を絞り込む証拠として機能するのであって、新しい知識として機能するわけではありません。
この見方から、直感に反する発見も説明できます。デモンストレーションのラベルが誤っていても、精度の大部分が維持される場合があります。支配的な信号は入力とラベルの対応関係そのものではなく、フォーマットとラベル空間だからです。
# Min, Lyu et al. (2022): label correctness matters less than
# - the input distribution
# - the label space (which classes exist)
# - the format / structure
# Implication: invest in representative inputs + valid label setトークン予算とコストのトレードオフ
すべてのショットがコンテキストとコストを消費します。デモンストレーションが長い場合、4つの例だけでクエリをはるかに上回ることがあります。精度1ポイント当たりのコストという指標を計算してください。k=8によってk=4より0.5%向上しても、トークン数が2倍になるなら、本番環境ではk=4のほうが優れています。
スループットの高いパイプラインでは、静的な例のブロックをプロンプトキャッシュに入れることを優先してください。これにより、繰り返し使用するデモンストレーションを一度だけ課金・処理できます。
def cost_efficiency(acc_by_k, tokens_by_k, price_per_1k):
return {
k: acc_by_k[k] / (tokens_by_k[k] / 1000 * price_per_1k)
for k in acc_by_k
}
# Pick the k maximizing accuracy per dollar, not raw accuracy多数派ラベルバイアスと位置バイアス
Few-shotプロンプトには隠れたバイアスがあります。多数派ラベルバイアスにより、モデルはデモで最も頻繁に登場するクラスを選びやすくなります。直近性バイアスは最後の例を過大評価します。共通トークンバイアスは、頻繁に登場するトークンを好ませます。
コンテキストキャリブレーションなどのキャリブレーション手法では、内容を含まない入力(たとえばトークンN/A)に対するモデルの事前分布を推定し、その値で割って補正します。これにより、few-shot分類器が大幅に安定します。
# Contextual calibration (Zhao et al. 2021)
p_cf = model_probs(prompt_with_input('N/A')) # content-free prior
W = 1.0 / p_cf # diagonal correction
def calibrated(probs):
return normalize(W * probs)デモンストレーションセットのバランス調整
多数派ラベルバイアスに対処するには、デモンストレーション全体でクラスを均衡させ、順序も変化させてください。k=4の二値分類なら、3:1ではなく、正例2つと負例2つをシャッフルして使用します。
生成タスクでは、重要な次元(長さ、トーン、難易度)に沿ってバランスを取ってください。そうしないと、モデルが最も頻繁に見た単一のモードに収束する可能性があります。
import random
def balanced_demos(pool, k, label_fn):
by_label = {}
for ex in pool:
by_label.setdefault(label_fn(ex), []).append(ex)
per = k // len(by_label)
picks = [e for lst in by_label.values() for e in random.sample(lst, per)]
random.shuffle(picks)
return picksFew-shotとファインチューニング
タスクが頻繁に変わる場合、データが少ない場合、またはチューニング済みモデルをホストできない場合は、few-shotが適切な手段です。一方、数千件の例があり、呼び出しごとのレイテンシーを最小にしたい場合や、プロンプトを短く保つためにフォーマットを組み込みたい場合は、ファインチューニングが有効です。
本番環境でよくある進め方は、few-shotでプロトタイプを作り、成功した実行トレースを収集してから、それらをファインチューニングに蒸留し、例のトークンを完全になくす方法です。
# Decision heuristic
if num_labeled < 500 or task_volatility == 'high':
strategy = 'few-shot ICL'
elif latency_budget_ms < 200 or prompt_token_cost_dominant:
strategy = 'fine-tune + zero-shot'
else:
strategy = 'few-shot now, distill later'推論タスクに必要なのはショット数だけではない
複数ステップの推論では、回答だけのfew-shotペアが逆効果になることがあります。モデルが、根拠を説明できないまま回答に直行することを学習してしまうためです。few-shotには、最終ラベルだけでなく推論トレースを示すchain-of-thoughtデモンストレーションを組み合わせてください。
ショット数は推論の深さと相互作用します。算術や論理のベンチマークでは、質の高いCoT例をk=2個使うほうが、回答だけの例をk=8個使うよりも優れた結果になることがよくあります。
COT_SHOT = (
'Q: A shop had 23 apples, used 20, bought 6 more. How many now?\n'
'A: Start 23, minus 20 leaves 3, plus 6 is 9. Answer: 9\n\n'
'Q: ' + question + '\nA:'
)kの評価ハーネス
ショットの選択は、評価ハーネスに支えられた実証的な探索として扱ってください。検証セットを分離し、複数のシードを使って例の順序を制御し、平均と分散を報告します。few-shotの精度は、順序だけで数ポイント変動することがあるためです。
最終的な選択が精度だけでなく、目的全体を最適化できるよう、kごとのトークン数とレイテンシーを記録してください。
def harness(pool, val, ks, seeds=5):
report = {}
for k in ks:
accs = []
for s in range(seeds):
demos = balanced_demos(pool, k, label_fn)
accs.append(evaluate(build_prompt(demos), val))
report[k] = (mean(accs), stdev(accs))
return report理解度チェック
ショットの選択とICLのバイアスについて理解度を確認してください。
まとめ
重要なポイント:
kは調整可能なハイパーパラメータです。スイープして、上昇・横ばい・低下の曲線を確認してください。- Zero-shotはよく知られたタスクに適しています。One-shotは厳密なフォーマットのアンカーになり、few-shotはタスク分布に応じて条件付けします。
- ICLは事前学習済みのタスクを特定することで機能するため、ラベルの正しさよりもフォーマットとラベル空間が大きく影響します。
- バランス調整、シャッフル、コンテキストキャリブレーションによって、多数派ラベル、直近性、共通トークンの各バイアスに対処してください。
- 1ドル当たりの精度を最適化し、推論タスクにはCoT例を組み合わせ、安定したfew-shotプロンプトをファインチューニングに蒸留してください。
よくある質問
「Zero-Shot、One-Shot、Few-Shot」レッスンは無料ですか?
はい。「Zero-Shot、One-Shot、Few-Shot」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、AI Prompt Engineeringコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 AI Prompt Engineeringコースには全4レッスンが含まれています。
「Zero-Shot、One-Shot、Few-Shot」で何を学びますか?
例の数を選択します。 ブラウザで直接実行するハンズオンコードでAI Prompt Engineeringを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
AI Prompt Engineeringを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAI Prompt Engineeringは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「Zero-Shot、One-Shot、Few-Shot」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAI Prompt Engineeringレッスンでコードを書いて実行できますか?
はい。すべてのAI Prompt Engineeringレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Zero-Shot、One-Shot、Few-Shot
- 効果的な例の設計
- 例の順序と新しさ
- 動的なFew-Shot選択