🎓 レベル:基礎 | 重要度:A(必須)
📎 前提:LLMの全体像
要点(BLUF)
- In-context learning(ICL) は、重みを一切更新せず、プロンプト(入力テキスト)の中に置いた指示や例だけでタスクを実行させる技術です。学習ではなく「条件付け」です。
- 例を 0 個/1 個/数個と与えるかで zero-shot / one-shot / few-shot と呼び分けます。
- Chain-of-Thought(CoT) は「順を追って考えて」と促して途中の推論ステップを出させる技法で、算術・論理など複雑な推論の精度を上げます。
In-context learning(ICL)とは
ICL は、推論時にモデルに渡す文脈(context)の中で、その場でタスクを学んだかのように振る舞わせる仕組みです。GPT-3 の論文(Brown et al., 2020)で体系的に示されました。
ポイントは 「重み(パラメータ)を一切変えない」 こと。ファインチューニング(ファインチューニング)が勾配降下で重み を書き換えるのに対し、ICL は学習済みモデルをそのまま使い、プロンプトという入力だけで出力の傾向を変えます。
形式的には、LLM は次トークンの条件付き分布
を計算しているだけです。ICL は を固定したまま、条件にあたる「プロンプト」を工夫して、欲しい出力が出やすい条件を作る行為だと言えます。要するに、学習させるのではなく「問いの立て方で答えを引き出す」 ということです。
zero / one / few-shot の違い
プロンプトの中に**例(demonstration、入力と出力のペア)**をいくつ入れるかで呼び分けます。
| 呼び方 | プロンプトに入れる例の数 | イメージ |
|---|---|---|
| zero-shot | 0 個(タスクの指示だけ) | 「次の文を英訳して:…」 |
| one-shot | 1 個 | 1 組の手本+本番 1 問 |
| few-shot | 数個〜文脈に収まる範囲 | 数組の手本+本番 1 問 |
few-shot は「文脈窓(context window)に収まる範囲なら何個でも」入れられますが、いくらでも増やせば良いわけではありません(後述)。
⚠️ ICL ≠ 学習:few-shot で例を見せても、その例はモデルの重みに残りません。会話/リクエストが終われば何も覚えていません。 恒久的に挙動を変えたいなら ファインチューニング が必要です。ここが両者の根本的な違いです。
flowchart TB
subgraph Prompt["プロンプト(推論時の入力。重みは固定)"]
E1["例1:入力A → 出力a"]
E2["例2:入力B → 出力b"]
E3["例3:入力C → 出力c"]
Q["新しい入力X → ?"]
end
Prompt --> LLM["LLM(パラメータθは更新しない)"]
LLM --> OUT["出力x(例のパターンに倣って生成)"]
上の図は few-shot ICL の構造です。プロンプト内の例 →新しい入力 →出力 という流れで、モデルは例の「形式・ラベル空間・入力の分布」を手がかりに、新しい入力にも同じパターンを当てはめます。
なぜ ICL は効くのか(理論は研究途上・要最新確認)
正直に言うと、なぜ重み更新なしで「学習したように」振る舞えるのか、決定的な理論はまだ確立していません。 有力な見方が複数あり、活発に議論されています(要最新確認)。代表的な 2 つを挙げます。
- 暗黙のベイズ推論という見方:事前学習で多様な「タスク」を含むデータを学んだ結果、モデルは内部に潜在的なタスク(概念)の分布を持つ。プロンプト内の例はその潜在タスクを事後的に絞り込む条件として働き、例が増えるほどベイズ最適な予測に近づく、という説明です(Xie et al., 2021 ほか)。要するに、プロンプトが「どのタスクをやってほしいか」の事後分布を条件付けるという見方です。
- 順伝播が暗黙の勾配降下に相当するという見方:Transformer の自己注意(LLMの全体像)の順伝播そのものが、例に対する勾配降下に似た更新を内部で実行している、という解釈です(Transformer をメタ最適化器とみなす)。
ただしこの「勾配降下」説には反例も出ています。注意機構を使わない状態空間モデル(Mamba など)も ICL が得意ですが、その順伝播は素直に勾配計算に分解できません。したがって単一の説明では片付かず、現時点では“複数の見方が併存する未解決問題”と理解しておくのが安全です。
Chain-of-Thought(CoT):段階的に考えさせる
CoT は、答えだけでなく「途中の推論ステップ」を出力させるプロンプト技法です(Wei et al., 2022)。few-shot の手本を「入力 →答え」ではなく「入力 →考える過程 →答え」にする、あるいは zero-shot で
「Let’s think step by step(順を追って考えよう)」
の一言を添えるだけ(zero-shot CoT、Kojima et al., 2022)でも、算術・常識・記号推論などの精度が大きく上がることが報告されています。
flowchart LR
subgraph A["CoTなし"]
Qa["問題"] --> Da["即答"] --> Wa["答え(間違えやすい)"]
end
subgraph B["CoTあり"]
Qb["問題"] --> S1["ステップ1"] --> S2["ステップ2"] --> S3["ステップ3"] --> Wb["答え(精度↑)"]
end
なぜ CoT は効くのか
直観は 「逐次計算の余地を与える」 ことです。
- LLM はトークンを 1 個ずつ生成します。中間ステップを書かせる=より多くのトークン=より多くの計算ステップを、最終解にたどり着く前に費やせるということです。1 回の順伝播で一気に答えを出すより、難問を小問に分解できます。
- 各ステップの出力が次のステップの入力(文脈)になるため、途中結果を“外部メモリ”として持ち越せます。暗算より筆算が正確なのと同じ理屈です。
また CoT は 創発的能力(emergent ability) とされ、ある程度大きいモデルでのみ安定して効果が出る、という観察があります(小さいモデルでは逆に下がることもある)。ただし「どの規模から」「どの程度効くか」はモデルと評価の仕方に強く依存し、解釈にも議論があります(要最新確認)。
self-consistency など発展技法(要最新確認)
CoT を強化する代表が self-consistency(Wang et al., 2022)です。
- 仕組み:温度付きサンプリングなどで 複数の異なる推論経路を生成 し、最終的な答えの多数決を取ります(sample-and-marginalize)。
- 直観:貪欲に 1 本だけ生成した推論が最善とは限らない。多様な推論を引いて、同じ答えに多く行き着いたものほど信頼できる、という考え方です。
この系統には自動で推論経路を作る手法、検証器を組み合わせる手法など多数の派生があります。ただし このあたりは最も動きが速い領域で、推論特化モデル(“考えてから答える”系)の普及で前提自体が変わりつつあります。個別技法はモデル世代に依存するため、必ず最新の一次情報を確認してください(要最新確認)。
プロンプト設計の基本(廃れにくい原則)
具体的な「効くフレーズ」はモデルごとに変わりますが、土台になる原則は比較的安定しています。
- 明確で具体的な指示:何を・どんな形式で・どんな制約で出すかを曖昧にしない。
- 例を見せる(few-shot):言葉で説明しづらいタスクは、入出力の手本を数個示すのが速い。例の形式・ラベルの種類・入力の分布を本番に合わせる。
- 役割や文脈の付与:立場や前提(誰として・何のために)を与えると出力が安定することがある。
- 段階的に考えさせる(CoT):推論を要する課題では途中過程を出させる。
- 出力形式の固定:JSON など決まった形を要求すると後段の処理が安定する。
要するに、「曖昧さを減らし、欲しい出力が出やすい条件を作る」 のが共通原理です。個別の言い回しよりこの原理を押さえるほうが長持ちします。
⚠️ よくある誤解・落とし穴
- 「ICL はモデルが学習している」→誤り:重みは変わりません。例はその場限りの条件付けで、終われば残りません。恒久的に変えたいなら ファインチューニング。
- 「例さえ正しければ精度が出る/例の正解ラベルが命」→単純化しすぎ:研究では「例の形式・ラベル空間・入力分布が効き、正解ラベルの正確さ自体は思ったほど効かない」という報告(Min et al., 2022)がある一方、「正解ラベルは効く」とする反論(Yoo et al., 2022)もあり、条件次第で結論が変わります(要最新確認)。
- 「CoT は万能」→誤り:単純なタスクでは冗長になり、誤った推論を“もっともらしく”積み上げて間違うこともあります。規模やタスクへの依存も大きいです。
- 「プロンプトのコツは普遍」→危険:技法はモデル世代に強く依存し、急速に変わります。特定の魔法のフレーズに頼らず、原理(曖昧さ低減・例の提示・段階化)で考えること。
- few-shot は多いほど良いわけではない:文脈窓には限りがあり、例が多すぎると関係ない情報がノイズになったり、近くの例に引っ張られたりします。