Agent Mentor Learn
プロンプトエンジニアリング基礎: 効果的な指示の書き方 · 第 3 回 / 全 6 回

レッスン3: Few-Shot 学習: 例でAIを導く

学習目標:

  • zero-shot、one-shot、few-shotの違いを理解する
  • 2〜5個の例を使ってAIにパターンを把握させる方法を学ぶ
  • 高品質な例を選ぶ原則をマスターする

前提: << レッスン2: プロンプトの基本構造 | 次: レッスン4 >>

説明よりも例の方が明確な場合

AIに特定の形式でデータを出力してもらいたい場合を考えてみましょう。例えば「この記事から重要な事実を抽出してJSONで返してください」というタスクです。プロンプトでフィールド名、データ型、ネストなどを詳しく説明したのに、AIが想定と異なる形式で返してくることがあります。

別のアプローチを試してみましょう。形式の説明をやめて、代わりにきれいな例を2〜3個示すのです。AIはそれらを読み、あなたが求めているものを正確に理解し、一発で正しい形式を返します。これがfew-shot learningの力です。例は、説明の段落よりも明確なのです1

Few-shot learningとは何か

Few-shot learningは、プロンプトに少数の例(通常2〜5個)を配置することで、AIを望むパターンに導くプロンプト技法です2 1。AIはそれらの例から入力と出力の関係、形式、スタイルを学び、新しい入力に適用します。

3つの比較方法:

  • Zero-shot: 例なし、指示のみ3
  • One-shot: 例1個
  • Few-shot: 例2〜5個2

Zero-shot: 指示のみ

Zero-shotプロンプト:

以下のユーザーレビューを「positive」、「negative」、または「neutral」に分類してください。
レビュー: この製品は問題なく動作しますが、少し高価です。分類:

AIは次のように返すかもしれません:

  • "neutral"(妥当)
  • "negative"(「高価」に言及しているため)
  • "positive with reservations"(その場で作り出したカテゴリ)

例がない場合、AIはエッジケースについて自身の判断に頼るしかありません。

Few-shot: 例を示す

Few-shotプロンプト:

ユーザーレビューを「positive」、「negative」、または「neutral」に分類してください。
例:
レビュー: 作りが良く、とても満足しています。分類: positive
レビュー: 全く使い物にならない、お金の無駄でした。分類: negative
レビュー: 機能は問題ありませんが、カスタマーサポートの対応が遅いです。分類: neutral
では、このレビューを分類してください:
レビュー: この製品は問題なく動作しますが、少し高価です。分類:

例を見た後、AIは次のことを理解します:

  • "positive"は完全に満足したレビュー用
  • "negative"は深刻な不満
  • "neutral"は良い点と悪い点が混在したレビュー
  • 出力は1語のみで、説明なし

そのため、このレビューが3番目の例のパターンに一致するため、"neutral"を返します。

Few-shot learningの仕組み

Few-shot learningは大規模言語モデルのin-context learning能力を活用します2。モデルは再訓練されません。現在の会話の中でいくつかの例を見て、ルールを推論し、それを適用するだけです。

モデルは例から3種類の情報を取得します:

  1. 入力から出力へのマッピング: どの種類の入力がどの種類の出力を生成するか
  2. 出力の形式とスタイル: 短い回答か詳細な回答か、JSONかプレーンテキストか
  3. エッジケースの基準: 曖昧なケースをどう分類すべきか

重要な発見: 研究によると、例の形式多様性が、すべての例が正しいかどうかよりも重要であることが示されています2。"Following the findings from Min et al. (2022), here are a few more tips about demonstrations/exemplars when doing few-shot: the label space and the distribution of the input text specified by the demonstrations are both important."(Min et al. (2022)の発見によれば、few-shotを行う際のデモンストレーション/例についていくつかのヒントがあります。ラベル空間とデモンストレーションで指定された入力テキストの分布の両方が重要です。)いくつかのラベルが間違っていても、形式が一貫していて例が異なる種類の入力をカバーしていれば、AIは有用なパターンを学習できます。

高品質な例を設計する原則

どんな例でも投げ込めばいいわけではありません。例の品質がAIの出力に直接影響します1

原則1: 最低2個、通常は5個以下

  • 1個の例(one-shot)では不十分な場合があります。AIはそれを特殊ケースとして扱うかもしれません
  • 2〜3個の例は通常、AIがパターンを把握するのに十分です
  • 4〜5個の例は、より複雑なタスクや多くのエッジケースがあるタスク用です
  • 5個を超えると効果が薄れ、かなりのトークンを消費します

2個から始めて、結果が十分でない場合にのみ3個目または4個目を追加します1

原則2: 例は代表的で多様であるべき

例は、タスクが遭遇する可能性のある異なる種類の入力をカバーすべきです。つまり、例の多様性が必要です2

多様性に欠ける例:

例1: iPhone 15 Pro → 電話例2: iPhone 14 → 電話例3: iPhone 13 → 電話
分類してください: MacBook Pro

すべての例が電話です。AIは他の種類の電子製品を見たことがないため、それをどう扱うか分からないかもしれません。

多様性のある例:

例1: iPhone 15 Pro → 電話例2: MacBook Air → ノートPC例3: AirPods Pro → ヘッドフォン
分類してください: iPad Pro

これは異なる製品カテゴリをカバーしているため、AIはより一般的な分類ロジックを学習できます。

原則3: 例全体で形式を同一に保つ

形式の一貫性は、成功するfew-shotプロンプトの鍵です2

一貫性のない形式:

例1:入力: 良い天気ですね出力: positive
例2:"この映画はとても退屈だった" --> negative sentiment
例3: まあまあ → neutral

形式がバラバラなので、AIは「positive」、「positive sentiment」、または他の何かを出力すべきか分かりません。

一貫した形式:

例1:入力: 良い天気ですね出力: positive
例2:入力: この映画はとても退屈だった出力: negative
例3:入力: まあまあ出力: neutral

きれいで統一されているため、AIは出力が1つの形容詞であるべきだと分かります。

原則4: エッジケースと混同しやすい例を含める

タスクにグレーゾーンがある場合は、それを例に入れます1

シナリオ: コードコメントが有用かどうかを判断する

明白な例のみ:

例1:コード: x = x + 1  # 1を加算判定: 無用(コメントがコードを繰り返しているだけ)
例2:コード: result = calculate_tax(income, deductions)  # 納税額を計算判定: 有用(ビジネス的な意味を説明している)

エッジケースを含む:

例1:コード: x = x + 1  # 1を加算判定: 無用(コメントがコードを繰り返しているだけ)
例2:コード: result = calculate_tax(income, deductions)  # 納税額を計算判定: 有用(ビジネス的な意味を説明している)
例3:コード: time.sleep(2)  # APIレート制限のリセットを待つ判定: 有用(なぜ待機するのかを説明しており、自明ではない)
例4:コード: users = users.filter(active=True)  # アクティブなユーザーをフィルタ判定: 無用(メソッド名で既に明確)

例3と4は、AIに境界を理解させます。「コードが何をするかを説明する」すべてのコメントが有用なわけではありません。重要なのは、コード自体が既にその意図を明確に表現しているかどうかです。

実例: Few-shotで構造化データを抽出する

ここで最も一般的なタスクは、非構造化テキストから構造化データを抽出することです。

タスク: 求人情報から主要フィールドを抽出する

Zero-shotバージョン(不安定):

以下の求人情報から次の項目を抽出してください: 職種、給与範囲、勤務地、必要な経験。JSONで返してください。
求人情報: シニアPython開発者を募集中、東京勤務、3〜5年の経験、年収800〜900万円。

AIはさまざまな形式を返すかもしれません:

または

フィールド名、形式、単位がすべて一貫していません。

Few-shotバージョン(安定した形式):

求人情報から主要フィールドを抽出し、以下のJSON形式で返してください。
例1:入力: フロントエンドエンジニア募集、大阪、2〜3年の経験、年収600〜750万円出力:{  "position": "フロントエンドエンジニア",  "location": "大阪",  "experience": "2〜3年",  "salary": "年収600〜750万円"}
例2:入力: 急募: Javaバックエンド、福岡(天神)、5年以上必須、月給60〜80万円出力:{  "position": "Javaバックエンド",  "location": "福岡(天神)",  "experience": "5年以上",  "salary": "月給60〜80万円"}
例3:入力: データアナリスト、リモート、経験不問、時給4000〜6000円出力:{  "position": "データアナリスト",  "location": "リモート",  "experience": "不問",  "salary": "時給4000〜6000円"}
では、これを処理してください:入力: シニアPython開発者を募集中、東京勤務、3〜5年の経験、年収800〜900万円。出力:

例は3つの給与単位(年収、月給、時給)と3つの勤務地タイプ(市、市+エリア、リモート)をカバーしているため、AIは次のことを学習します:

  • 日本語のフィールド名を使用
  • 元のテキストから給与単位を保持
  • 勤務地を抽出する際に詳細を保持
  • 「不問」も有効な経験要件

よくあるFew-shotの罠

罠1: 例が少なすぎて不完全なカバレッジ

1つの例だけを与えると、AIは単一のインスタンスを見るだけで、ルールではありません。

修正: 最低2個、理想的には3個。

罠2: 例間で形式が一貫していない

ここでは矢印→、そこではコロン:、別の場所では複数行。

修正: 1つの形式を選び、すべての例で厳格に従う。

罠3: すべてが簡単なケースで、エッジケースがない

実際のデータにはノイズ、曖昧性、欠落があります。例が理想的なケースのみを示している場合、AIはエッジケースに遭遇した瞬間に停止します。

修正: 少なくとも1つの例にエッジケース(欠落フィールド、曖昧な表現)を含める。

罠4: 例が多すぎる

5個を超えると効果はわずかで、余分なトークンを消費し、応答が長くなります。

修正: 2〜3個から始め、必要な場合にのみ追加する。5個を超えることはほとんどありません。

Few-shotを使うべき場合

Few-shotは次のような状況に最適です:

  • 形式変換: 非構造化テキスト → JSON、Markdown、CSV
  • 分類: 感情分析、トピックタグ付け、意図検出
  • スタイル模倣: 特定の書き方やコードスタイルに合わせる
  • 言葉にしにくいルール: 「コメントが無用とは何か」のような

適さない場合:

  • タスク自体が単純: 「これを英語に翻訳」は例不要
  • すべての入力が独自: 創作、ブレインストーミング — 例は制約になるだけ
  • 外部知識が必要: 「2024年ワールドカップの優勝者は誰」— 例では役立たない

経験則: 人間の同僚に2〜3個の例を見せれば何をすべきか理解できる場合、few-shotが適しています。

まとめ

Few-shot learningは2〜5個の例を使ってAIに望むパターンを把握させます。これは言葉で説明するよりも明確です。高品質な例は: 適度な数(2〜5個)、代表的で多様、形式が同一、エッジケースを含む、という特徴があります。

Few-shotは形式変換、分類、スタイル模倣に最適です。例を設計する際は、2個から始め、異なる種類の入力をカバーし、すべてに同じ形式を使用してください。

次のレッスンではchain-of-thoughtについて説明します。AIに推論のステップを示させ、複雑なタスクの精度を向上させる方法です。

次のレッスン Chain-of-Thought: AIに推論を示させる >>

Footnotes

  1. Few-Shot Prompting Guide — https://www.prompthub.us/blog/the-few-shot-prompting-guide 2 3 4 5

  2. Prompt Engineering Guide - Few-Shot Prompting — https://www.promptingguide.ai/techniques/fewshot 2 3 4 5 6

  3. Zero-shot Learning - Wikipedia — https://en.wikipedia.org/wiki/Zero-shot_learning

練習

01

タスク: AIにユーザーフィードバックを3つのカテゴリ(「機能リクエスト」、「バグ報告」、「使い方の質問」)に分類させます。

レベル1: 高品質な例を設計する

異なるケースをカバーし、一貫した形式を保つ3つのfew-shot例を設計してください。

完了基準 · ローカルでチェック
02

こちらはうまく機能しないfew-shotプロンプトです。問題を見つけて改善してください:

レベル2: 既存のfew-shotプロンプトを改善する
製品レビューから長所と短所を抽出し、JSONを出力。
例:"まあまあの品質" -> {"pros": ["品質"], "cons": []}"高すぎる、配送も遅い" -> {"pros": [], "cons": ["高価", "配送が遅い"]}
では処理してください: [レビューテキスト]

問題: AIの出力が不安定。フィールド名が別の言語で出力されることがあり、長所が形容詞(「良い」)になったり、具体的なポイント(「品質」)になったりする。

完了基準 · ローカルでチェック