In-context Learning(インコンテキストラーニング)とは?読み方・LLMが少数例から学ぶ仕組みとFew-shot/Zero-shot/Fine-tuningとの違いを完全解説

In-context Learningとは

In-context Learning(インコンテキストラーニング)とは

In-context Learning(インコンテキストラーニング、略称ICL)とは、LLMがプロンプト内に提示された少数の例(デモンストレーション)だけを参考に、新しいタスクをその場で学習・実行する能力のこと。重みを一切更新せず、推論時に「文脈から学ぶ」のが特徴で、GPT-3論文(Brown et al., 2020)で広く知られるようになった。

身近な例えで言えば、新人にマニュアルを渡さず「こういう問い合わせには、こう答える」という見本を3つ見せるだけで、似たような問い合わせに自力で答えられるようにする状況。LLMはわずか数例の入力・出力ペアを見ただけで、そのパターンを推論時に掴んで類似タスクに応用できる。これがLLMの最大の革新の一つとなっている。

In-context Learningの読み方

インコンテキストラーニング

アイシーエル(略称ICL)

文脈内学習(ぶんみゃくないがくしゅう)

In-context Learningの仕組み

In-context Learningの仕組みは、研究者の間でも完全には解明されていないが、有力仮説として「LLMはTransformerの内部で勾配降下法に近い計算を暗黙的に行っている」とされる。プロンプト内の例から類似パターンを抽出し、Attention機構を通じて入力に対して内部的なパラメータ調整に相当する処理を行う、と考えられている。これが重要なポイントです。

例示数による分類

ICLは例示数によって以下に分けられる:

  • Zero-shot: 例なし。タスク説明のみで実行させる。
  • One-shot: 1例だけ提示。
  • Few-shot: 2〜10例程度を提示。最も一般的。
  • Many-shot: 数十〜数百例。長文コンテキスト対応モデルで台頭。

ICLの典型的なプロンプト構造

タスク: 入力テキストの感情を「ポジティブ」「ネガティブ」「中立」で分類してください。

例:
入力: 今日の映画は最高だった。
出力: ポジティブ

入力: 期待外れで残念。
出力: ネガティブ

入力: 普通だった。
出力: 中立

入力: このコーヒー、めっちゃ美味しい!
出力: 

背景: ICLはなぜ革命的だったのか

2020年以前のNLPでは、新しいタスクごとにラベル付きデータを集めてモデルをファインチューニングするのが標準だった。GPT-3論文がICLを示したことで、「学習データ収集→学習→デプロイ」という長いサイクルなしに、プロンプトを書き換えるだけで新タスクに即対応できるようになった。実務では、PoC(概念実証)にかかる時間が数週間から数分に短縮された大革命です。

In-context Learningの使い方・実例

基本的な使い方(Quick Start)

import anthropic
client = anthropic.Anthropic()

prompt = '''以下のメールを「クレーム」「問い合わせ」「営業」に分類してください。

例1:
メール: 商品が届かないのでお金を返してください。
分類: クレーム

例2:
メール: 在庫はありますか?
分類: 問い合わせ

例3:
メール: 弊社サービスのご紹介です。
分類: 営業

メール: 注文番号12345の進捗を教えてください。
分類: '''

resp = client.messages.create(
    model="claude-sonnet-4-5",
    max_tokens=10,
    messages=[{"role": "user", "content": prompt}],
)
print(resp.content[0].text)  # 期待: 問い合わせ

よくある実装パターン

パターンA: 動的Few-shot(RAG+ICL)

# ベクトルDBから類似事例を検索し、プロンプトの例として注入
similar_examples = vector_db.search(user_query, top_k=3)
prompt = "以下の例を参考に分類してください。\n\n"
for ex in similar_examples:
    prompt += f"入力: {ex.input}\n出力: {ex.label}\n\n"
prompt += f"入力: {user_query}\n出力: "

向いているケース: 大量のラベル付き事例があり、各クエリに最も類似した例を動的に選びたい場合。実務では、固定Few-shotより精度が一段上がります。

避けるべきケース: 事例が少ない・偏っている場合。ベクトル検索の品質に依存しすぎる。

パターンB: Chain-of-Thought(CoT)

prompt = '''数学の問題を解いてください。途中の計算過程も書いてください。

例:
問題: りんごが3個あります。さらに4個もらいました。何個になりますか?
解答: 元々3個あり、4個追加されたので、3+4=7個になります。答えは7個。

問題: 太郎は本を5冊持っています。3冊を友達に渡し、その後8冊買いました。今何冊ですか?
解答: '''

向いているケース: 算数・論理推論・複雑な分類など段階的思考が要るタスク。CoTの効果は大きい。

避けるべきケース: 単純なfactual QAやフォーマット変換。出力が冗長になりコストが膨らむ。

パターンC: Many-shot ICL

# 200K context のClaude / Gemini で50〜200例を提示
prompt = "以下は分類例です:\n\n"
for ex in training_examples[:100]:  # 100例
    prompt += f"In: {ex.input}\nOut: {ex.label}\n\n"
prompt += f"In: {query}\nOut: "

向いているケース: 長文コンテキスト対応モデル(Claude Sonnet、Gemini 1.5/2.5)で、ファインチューニング無しでも高精度を狙いたい場合。Google DeepMindの2024年研究で「many-shot ICLはfine-tuningに匹敵する精度を出せる」と示された。

アンチパターン: 矛盾する例を混ぜる

# ⛔ NG(同じ入力に対して異なるラベルが付いている)
例1: 入力「今日は良い天気」 → ポジティブ
例2: 入力「今日は良い天気」 → 中立  # ← 矛盾

例同士の整合性が崩れると、LLMはパターンを掴めずに精度が大きく落ちる。実務では、Few-shot例の整合性チェックは必須であり、ここは特に注意してください。

In-context Learningのメリット・デメリット

メリット

  • 学習データ収集・ファインチューニング不要
  • 新タスクへの即時対応(プロンプト変更で完了)
  • 1モデルで多様なタスクに対応可能
  • 例の入れ替えで継続改善が容易
  • 機密データを学習させずに使える(プロンプトのみ)

デメリット・注意点

  • 毎リクエストで例を含めるため、トークンコストが嵩む
  • コンテキスト長の上限がボトルネック
  • 例の選び方・順序で結果が大きく変動
  • 小さいモデルでは効果が薄い(emergent ability)
  • 大量の事例を要する難タスクではfine-tuningに劣ることがある

In-context LearningとFine-tuningの違い

両者はLLMをタスクに適応させる代表的な手法だが、根本的に異なる。下記の比較表で整理する。

観点 In-context Learning Fine-tuning RAG
重みの更新 なし あり なし
必要データ量 数〜数百例 数千〜数万例 大量の文書(学習不要)
セットアップ時間 数分 数時間〜数日 数日(インデックス構築)
推論コスト 高(毎回例を含むため) 低(プロンプト短縮可能) 中(検索結果を含む)
適応の柔軟性 高(即時切替) 低(再学習必要) 高(インデックス更新)
主な用途 PoC・少数例タスク 専門ドメイン・スタイル統一 最新情報・社内文書

使い分けのポイントは、まずICLで試し、コストや精度の壁にぶつかったらRAGやFine-tuningへ進むのが定石です。これを覚えておきましょう。

In-context Learningに関するよくある誤解

誤解1: 「ICLはモデルが本当に学習している」

なぜそう誤解されるのか: 「Learning(学習)」という名称から、モデル本体に何かが記憶されると感じやすい。学術論文でも「learn」と表現されるが、これは比喩的な意味。マスメディアが「AIが学ぶ」と書くため、その背景でも誤解が生まれやすい。

正しい理解: ICLでは重みは一切変わらない。プロンプトが終われば「学習内容」も消える。次のリクエストではゼロから出発する。研究分野では「meta-learning」「implicit gradient descent」と説明されることもある。

誤解2: 「例を多くするほど精度が上がる」

なぜそう誤解されるのか: 「データが多いほど学習が進む」という機械学習の一般則からの類推。多くの入門書も「Few-shot > Zero-shot」と書かれているため、その方向への誤った外挿が広まっている。

正しい理解: 多くのタスクで5〜10例で精度は頭打ち。それ以上は微増または減少することがある。例の質・順序のほうが量より重要で、Lu et al. 2022の研究では例の順序を変えるだけで精度が大きく変動することが示されている。

誤解3: 「ICLが効くなら全部ICLで済ませればよい」

なぜそう誤解されるのか: ICLが手軽で即時対応可能なため、「fine-tuningはもう不要」という単純化した結論に飛びつきやすい。実務でもPoC段階では十分機能するため、その成功体験で本番でも全部ICLで通そうとする背景がある。

正しい理解: ICLには「コンテキスト長」「毎回トークン消費」「精度頭打ち」という限界がある。本番運用で大量のクエリを高速・低コストで処理したい場合、Fine-tuningのほうが優位なケースが多い。両者を排他的でなく相補的に使うのが正解。

実務での活用シーン

1. 新タスクのPoC

顧客から「こういうタスクできる?」と聞かれた際、Few-shot ICLで5分でPoCを示すのが定番。投資対効果が見えてからfine-tuningやRAGに進む二段階アプローチが主流。

2. レアなクラスの分類

クラス分布が不均衡で、レアクラスの教師データが10件しかない場合、ICLで対応するほうが過学習を避けられる。fine-tuningだとレアクラスを学べない。

3. プロンプトテンプレートの動的生成

RAG+ICLの組み合わせで、ユーザーごとに最適化された例をベクトル検索で抽出してプロンプトに注入。ECサイトの推薦理由生成など、パーソナライズが必要な場面で多用される。

4. 多言語対応

日本語の業務文書を英語要約する、というタスクでも、英→日の例を3つ提示するだけで言語横断の能力が引き出せる。多言語fine-tuningほどの整備工数を必要としない。

In-context Learningに関するよくある質問(FAQ)

Q1. In-context Learningはファインチューニングと何が違いますか?

ファインチューニングはモデル本体の重みを更新する学習プロセスで、訓練インフラ・データ・時間が必要です。In-context Learningはプロンプトに例を示すだけで重みを変えず、推論時に「適応」させるアプローチです。コストと柔軟性のトレードオフが異なります。

Q2. Few-shot learningとIn-context learningは同じ意味ですか?

Few-shot learningはIn-context learningの一形態です。ICLは「例示数による分類」で、Zero-shot(例示なし)、One-shot(1例)、Few-shot(複数例)に分けられます。ICLが上位概念、Few-shotがその一種です。

Q3. プロンプトに例を増やせば必ず精度は上がりますか?

増やすほど良いとは限りません。一定数(多くの場合5〜10例)を超えると精度が頭打ちまたは低下することが知られています。コンテキスト長も消費するため、コスト効率も悪化します。

Q4. Chain-of-ThoughtはIn-context Learningの一種ですか?

はい。Chain-of-Thought(CoT)は推論ステップを例として示すICL手法の一種です。「考え方」を例示することで、複雑な推論タスクでの精度を大きく向上させます。

Q5. In-context Learningは小さいモデルでも効きますか?

効果は限定的です。研究によれば、ICLは一定規模以上(数億〜数十億パラメータ)のLLMで初めて顕著に機能する「emergent ability(創発能力)」とされています。1.3Bクラスのモデルでは効きが弱い傾向があります。

まとめ

  • In-context Learning(ICL)はプロンプト内の例だけでLLMを新タスクに適応させる仕組み。
  • 重みを一切更新せず、推論時に「文脈から学ぶ」のが本質。
  • Zero-shot / One-shot / Few-shot / Many-shotの4段階に分類される。
  • Chain-of-ThoughtはICLの一種で、推論ステップを例として示す。
  • Fine-tuningと比較するとセットアップは早いが、推論コストは高め。
  • 例の数より質と順序のほうが精度に効くことが多い。
  • 新タスクPoC・レアクラス分類・パーソナライズ・多言語対応で広く使われる。

参考文献・出典

📚 参考文献・出典

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA