タスク: AIにユーザーフィードバックを3つのカテゴリ(「機能リクエスト」、「バグ報告」、「使い方の質問」)に分類させます。
レベル1: 高品質な例を設計する異なるケースをカバーし、一貫した形式を保つ3つのfew-shot例を設計してください。
学習目標:
- zero-shot、one-shot、few-shotの違いを理解する
- 2〜5個の例を使ってAIにパターンを把握させる方法を学ぶ
- 高品質な例を選ぶ原則をマスターする
前提: << レッスン2: プロンプトの基本構造 | 次: レッスン4 >>
AIに特定の形式でデータを出力してもらいたい場合を考えてみましょう。例えば「この記事から重要な事実を抽出してJSONで返してください」というタスクです。プロンプトでフィールド名、データ型、ネストなどを詳しく説明したのに、AIが想定と異なる形式で返してくることがあります。
別のアプローチを試してみましょう。形式の説明をやめて、代わりにきれいな例を2〜3個示すのです。AIはそれらを読み、あなたが求めているものを正確に理解し、一発で正しい形式を返します。これがfew-shot learningの力です。例は、説明の段落よりも明確なのです1。
Few-shot learningは、プロンプトに少数の例(通常2〜5個)を配置することで、AIを望むパターンに導くプロンプト技法です2 1。AIはそれらの例から入力と出力の関係、形式、スタイルを学び、新しい入力に適用します。
3つの比較方法:
Zero-shotプロンプト:
AIは次のように返すかもしれません:
例がない場合、AIはエッジケースについて自身の判断に頼るしかありません。
Few-shotプロンプト:
例を見た後、AIは次のことを理解します:
そのため、このレビューが3番目の例のパターンに一致するため、"neutral"を返します。
Few-shot learningは大規模言語モデルのin-context learning能力を活用します2。モデルは再訓練されません。現在の会話の中でいくつかの例を見て、ルールを推論し、それを適用するだけです。
モデルは例から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。
2個から始めて、結果が十分でない場合にのみ3個目または4個目を追加します1。
例は、タスクが遭遇する可能性のある異なる種類の入力をカバーすべきです。つまり、例の多様性が必要です2。
多様性に欠ける例:
すべての例が電話です。AIは他の種類の電子製品を見たことがないため、それをどう扱うか分からないかもしれません。
多様性のある例:
これは異なる製品カテゴリをカバーしているため、AIはより一般的な分類ロジックを学習できます。
形式の一貫性は、成功するfew-shotプロンプトの鍵です2。
一貫性のない形式:
形式がバラバラなので、AIは「positive」、「positive sentiment」、または他の何かを出力すべきか分かりません。
一貫した形式:
きれいで統一されているため、AIは出力が1つの形容詞であるべきだと分かります。
タスクにグレーゾーンがある場合は、それを例に入れます1。
シナリオ: コードコメントが有用かどうかを判断する
明白な例のみ:
エッジケースを含む:
例3と4は、AIに境界を理解させます。「コードが何をするかを説明する」すべてのコメントが有用なわけではありません。重要なのは、コード自体が既にその意図を明確に表現しているかどうかです。
ここで最も一般的なタスクは、非構造化テキストから構造化データを抽出することです。
Zero-shotバージョン(不安定):
AIはさまざまな形式を返すかもしれません:
または
フィールド名、形式、単位がすべて一貫していません。
Few-shotバージョン(安定した形式):
例は3つの給与単位(年収、月給、時給)と3つの勤務地タイプ(市、市+エリア、リモート)をカバーしているため、AIは次のことを学習します:
1つの例だけを与えると、AIは単一のインスタンスを見るだけで、ルールではありません。
修正: 最低2個、理想的には3個。
ここでは矢印→、そこではコロン:、別の場所では複数行。
修正: 1つの形式を選び、すべての例で厳格に従う。
実際のデータにはノイズ、曖昧性、欠落があります。例が理想的なケースのみを示している場合、AIはエッジケースに遭遇した瞬間に停止します。
修正: 少なくとも1つの例にエッジケース(欠落フィールド、曖昧な表現)を含める。
5個を超えると効果はわずかで、余分なトークンを消費し、応答が長くなります。
修正: 2〜3個から始め、必要な場合にのみ追加する。5個を超えることはほとんどありません。
Few-shotは次のような状況に最適です:
適さない場合:
経験則: 人間の同僚に2〜3個の例を見せれば何をすべきか理解できる場合、few-shotが適しています。
Few-shot learningは2〜5個の例を使ってAIに望むパターンを把握させます。これは言葉で説明するよりも明確です。高品質な例は: 適度な数(2〜5個)、代表的で多様、形式が同一、エッジケースを含む、という特徴があります。
Few-shotは形式変換、分類、スタイル模倣に最適です。例を設計する際は、2個から始め、異なる種類の入力をカバーし、すべてに同じ形式を使用してください。
次のレッスンではchain-of-thoughtについて説明します。AIに推論のステップを示させ、複雑なタスクの精度を向上させる方法です。
次のレッスン Chain-of-Thought: AIに推論を示させる >>
Few-Shot Prompting Guide — https://www.prompthub.us/blog/the-few-shot-prompting-guide ↩ ↩2 ↩3 ↩4 ↩5
Prompt Engineering Guide - Few-Shot Prompting — https://www.promptingguide.ai/techniques/fewshot ↩ ↩2 ↩3 ↩4 ↩5 ↩6
Zero-shot Learning - Wikipedia — https://en.wikipedia.org/wiki/Zero-shot_learning ↩
異なるケースをカバーし、一貫した形式を保つ3つのfew-shot例を設計してください。
問題: AIの出力が不安定。フィールド名が別の言語で出力されることがあり、長所が形容詞(「良い」)になったり、具体的なポイント(「品質」)になったりする。
以下のユーザーレビューを「positive」、「negative」、または「neutral」に分類してください。
レビュー: この製品は問題なく動作しますが、少し高価です。分類:ユーザーレビューを「positive」、「negative」、または「neutral」に分類してください。
例:
レビュー: 作りが良く、とても満足しています。分類: positive
レビュー: 全く使い物にならない、お金の無駄でした。分類: negative
レビュー: 機能は問題ありませんが、カスタマーサポートの対応が遅いです。分類: neutral
では、このレビューを分類してください:
レビュー: この製品は問題なく動作しますが、少し高価です。分類:例1: iPhone 15 Pro → 電話例2: iPhone 14 → 電話例3: iPhone 13 → 電話
分類してください: MacBook Pro例1: iPhone 15 Pro → 電話例2: MacBook Air → ノートPC例3: AirPods Pro → ヘッドフォン
分類してください: iPad Pro例1:入力: 良い天気ですね出力: positive
例2:"この映画はとても退屈だった" --> negative sentiment
例3: まあまあ → neutral例1:入力: 良い天気ですね出力: positive
例2:入力: この映画はとても退屈だった出力: negative
例3:入力: まあまあ出力: neutral例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) # アクティブなユーザーをフィルタ判定: 無用(メソッド名で既に明確)以下の求人情報から次の項目を抽出してください: 職種、給与範囲、勤務地、必要な経験。JSONで返してください。
求人情報: シニアPython開発者を募集中、東京勤務、3〜5年の経験、年収800〜900万円。{"title": "Python開発者", "pay": "800-900万円", ...}
{"job": "シニアPython開発者", "salary": "年収800〜900万円", ...}
求人情報から主要フィールドを抽出し、以下の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万円。出力:製品レビューから長所と短所を抽出し、JSONを出力。
例:"まあまあの品質" -> {"pros": ["品質"], "cons": []}"高すぎる、配送も遅い" -> {"pros": [], "cons": ["高価", "配送が遅い"]}
では処理してください: [レビューテキスト]