見出し画像

プロンプティング技法大全 Part2: 自己改善・知識拡張系 (No.18-34)

Part2: 自己改善・反復系 + 知識拡張・検索強化系(No.18-34)

各手法を 解説 + 専用Mermaid図 + 実際のプロンプト例 のトリプレットで構成する。


C. 自己改善・反復系(No.18-27)


No.18 Self-Refine

  • 提案: Madaan, Tandon, Gupta et al., 2023

  • 論文: Self-Refine: Iterative Refinement with Self-Feedback

  • arXiv: 2303.17651

  • 引用数: ~2,548

LLMが自身の出力に対しフィードバックを生成し、そのフィードバックに基づいて出力を反復的に改善する手法。
追加学習やRLは不要で、単一モデルが生成・フィードバック・改善の3役を担う。

コードの最適化、数学の推論、対話の応答品質改善など7タスクで平均20%の品質向上を達成した。

人間のライティングプロセス(下書き→推敲→改善)をLLMに適用したもので、停止条件(品質スコアの閾値や反復回数の上限)を適切に設定することが重要。
反復ごとにトークンコストが加算される点がトレードオフ。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    IN["入力x"] --> GEN["🧠 生成<br/>初期出力y0を作成"]
    GEN --> FB["🔍 フィードバック<br/>改善点・問題点を指摘"]
    FB --> REF["✏️ 改善<br/>フィードバックに基づき修正"]
    REF --> CHECK{品質基準<br/>を満たす?}
    CHECK -->|No| FB
    CHECK -->|Yes| OUT["✅ 最終出力"]

    style IN fill:#E8F5E9,stroke:#81C784
    style CHECK fill:#DBEAFE,stroke:#93C5FD
    style OUT fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: 初期生成
以下のコードをレビューし、改善してください。
def avg(lst): return sum(lst)/len(lst)

# ステップ2: 自己フィードバック
あなたが生成した上記のコードについて、問題点を指摘してください。
→ フィードバック: 空リストの場合にZeroDivisionErrorが発生する。型ヒントがない。docstringがない。

# ステップ3: フィードバックに基づき改善
上記のフィードバックを踏まえて、コードを改善してください。

# ステップ4: 品質基準を満たすまで繰り返し
改善後のコードについて、再度問題点を指摘してください。
→ フィードバック: 問題なし。品質基準を満たしています。→ 終了

No.19 Reflexion

  • 提案: Shinn, Cassano, Berman et al., 2023

  • 論文: Reflexion: Language Agents with Verbal Reinforcement Learning

  • arXiv: 2303.11366

  • 引用数: ~2,094

重み更新ではなく言語的フィードバックでエージェントを強化する手法。

タスク失敗時に自然言語の「反省テキスト」を生成し、エピソード記憶に蓄積して次の試行で活用する。
HumanEval(コード生成)で91%を達成し、GPT-4のベースライン80%を大幅に上回った。

従来の強化学習がスカラー報酬で学習するのに対し、Reflexionは言語的なフィードバック(「前回はエッジケースを見落とした」等)でより豊富な情報を伝達する。
エージェント型タスクにおいて、失敗から学ぶ能力を付与する画期的なフレームワーク。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    TASK["タスク実行"] --> ENV["環境フィードバック<br/>(成功 or 失敗)"]
    ENV --> REF["📝 反省テキスト生成<br/>「前回はエッジケースを<br/>見落とした」"]
    REF --> MEM["🧠 エピソード記憶<br/>に蓄積"]
    MEM --> RETRY["次の試行<br/>反省を文脈に含めて再実行"]
    RETRY --> TASK

    ENV -->|成功| DONE["✅ 完了"]

    style TASK fill:#E8F5E9,stroke:#81C784
    style MEM fill:#DBEAFE,stroke:#93C5FD
    style DONE fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# 試行1: タスク実行
以下の関数を実装してください: is_palindrome(s) - 文字列が回文かどうか判定する

# 試行1の結果: テスト失敗
テスト "A man, a plan, a canal: Panama" → 期待: True, 実際: False

# 反省テキスト生成
前回の試行を振り返ってください。何が間違っていましたか?
→ 反省: 「大文字小文字を区別し、スペースや記号を除去していなかった。
   英数字のみを抽出してから比較すべきだった。」

# 試行2: 反省を踏まえて再実行
以下の反省を踏まえて、is_palindrome(s) を再実装してください。

エピソード記憶:
- 試行1の反省: 大文字小文字の統一と非英数字の除去が必要だった

No.20 Self-Ask

  • 提案: Press, Zhang, Min et al., 2022

  • 論文: Measuring and Narrowing the Compositionality Gap in Language Models

  • arXiv: 2210.03350

  • 引用数: ~500

モデルが自ら後続質問を生成し、それに回答してから最終回答を導く手法。構成的推論(compositionality)の弱さを明示的な分解で補う。

CoTとの違いは、推論の各ステップが明確な質問-回答ペアとして構造化される点。(CoTよりも厳格な形式の推論ステップを踏ませる)

検索エンジンとの統合が容易であり、中間質問をそのまま検索クエリとして使用できる。
「Compositionality Gap」(個々のサブ問題は解けるが組み合わせると解けなくなる現象)を定量化し、それを縮小する手法として提案された。
マルチホップ質問応答で特に有効。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["複合的な質問"] --> ASK{後続質問が<br/>必要?}
    ASK -->|Yes| FQ1["後続質問1を自己生成"]
    FQ1 --> FA1["中間回答1"]
    FA1 --> ASK2{さらに後続質問<br/>が必要?}
    ASK2 -->|Yes| FQ2["後続質問2を自己生成"]
    FQ2 --> FA2["中間回答2"]
    FA2 --> FINAL["中間回答を統合<br/>→ 最終回答"]
    ASK -->|No| DIRECT["直接回答"]

    style Q fill:#E8F5E9,stroke:#81C784
    style ASK fill:#DBEAFE,stroke:#93C5FD
    style FINAL fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

Q: Googleの創業者が通った大学はどの州にありますか?

後続質問が必要ですか? はい。
後続質問: Googleの創業者は誰ですか?
中間回答: ラリー・ペイジとセルゲイ・ブリンです。

後続質問が必要ですか? はい。
後続質問: ラリー・ペイジとセルゲイ・ブリンが通った大学はどこですか?
中間回答: スタンフォード大学です。

後続質問が必要ですか? はい。
後続質問: スタンフォード大学はどの州にありますか?
中間回答: カリフォルニア州です。

後続質問が必要ですか? いいえ。
最終回答: カリフォルニア州です。

No.21 Progressive-Hint Prompting (PHP)

  • 提案: Zheng, Liu, Xie et al., 2023

  • 論文: Progressive-Hint Prompting Improves Reasoning in Large Language Models

  • arXiv: 2304.09797

  • 引用数: ~135

前回生成した回答をヒントとして次の推論に与え、回答が安定するまで反復する手法。
CoTやSelf-Consistencyと直交的に組み合わせ可能で、追加コストは最小限。回答が前回と一致すれば収束と判断し停止する。

平均2-3回の反復で収束することが多く、Self-Refineほどのコストはかからない。既存のCoTプロンプトにほぼ無改修で追加できる実用性の高さが特徴。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["問題入力"] --> COT1["CoTで初期回答を生成<br/>回答: 12"]
    COT1 --> HINT["前回の回答をヒントに追加<br/>「ヒント: 前回の回答は12でした」"]
    HINT --> COT2["ヒント付きで再推論<br/>回答: 9"]
    COT2 --> CHECK{前回と<br/>一致?}
    CHECK -->|No| HINT2["「ヒント: 前回の回答は9でした」"]
    HINT2 --> COT3["再推論 → 回答: 9"]
    COT3 --> CHECK2{前回と一致?}
    CHECK2 -->|Yes| OUT["✅ 最終回答: 9"]

    style Q fill:#E8F5E9,stroke:#81C784
    style CHECK fill:#DBEAFE,stroke:#93C5FD
    style OUT fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ラウンド1: CoTで初期回答
Q: 23個のリンゴがあり、20個使い、6個買いました。何個?
ステップバイステップで考えてください。
A: ... 答えは12個です。

# ラウンド2: 前回の回答をヒントとして付加
Q: 23個のリンゴがあり、20個使い、6個買いました。何個?
ヒント: 前回この問題を解いたとき、答えは12でした。
この情報も考慮して、もう一度ステップバイステップで考えてください。
A: ... 答えは9個です。

# ラウンド3: 回答が安定するか確認
Q: 23個のリンゴがあり、20個使い、6個買いました。何個?
ヒント: 前回この問題を解いたとき、答えは9でした。
A: ... 答えは9個です。 → 前回と一致 → 収束 → 最終回答: 9

No.22 Cumulative Reasoning (CR)

  • 提案: Zhang, Yang, Yuan, Yao, 2023

  • 論文: Cumulative Reasoning with Large Language Models

  • arXiv: 2308.04371

  • 引用数: ~59

Proposer・Verifier・Reporterの3役割でLLMを協調させ、検証済みの中間命題をDAGとして累積的に構築する手法。
FOLIO(論理推論)で98.04%を達成。各命題が検証されてからDAGに追加されるため、誤った推論の伝播を防ぐ。

CoTが一直線の推論であるのに対し、CRは検証付きの漸進的な知識構築。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    P["💡 Proposer<br/>新たな命題を提案"] --> V["✅ Verifier<br/>命題の正当性を検証"]
    V -->|検証OK| DAG["📊 DAG<br/>検証済み命題を蓄積"]
    V -->|検証NG| P
    DAG --> CHECK{十分な命題が<br/>蓄積された?}
    CHECK -->|No| P
    CHECK -->|Yes| R["📋 Reporter<br/>最終回答を統合・報告"]

    style P fill:#E8F5E9,stroke:#81C784
    style V fill:#DBEAFE,stroke:#93C5FD
    style R fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# Proposer: 命題を提案
前提: 「全ての犬は動物である」「ポチは犬である」
現在の検証済み命題: なし
新たな命題を1つ提案してください。
→ 提案: 「ポチは動物である」

# Verifier: 検証
命題「ポチは動物である」は、前提から論理的に導出できますか?
→ 検証結果: Yes(「ポチは犬」かつ「犬は動物」より三段論法で導出可能)

# DAGに追加: [「ポチは動物である」(検証済み)]

# Proposer: 次の命題を提案
前提に加え「動物は生物である」
→ 提案: 「ポチは生物である」

# Verifier: 検証 → Yes

# Reporter: 最終回答を統合
蓄積された命題から質問「ポチは生物か?」に回答してください。
→ 最終回答: はい、ポチは生物です。

No.23 Maieutic Prompting

  • 提案: Jung, Qin, Welleck et al., 2022

  • 論文: Maieutic Prompting: Logically Consistent Reasoning with Recursive Explanations

  • arXiv: 2205.11822

  • 引用数: ~216

ソクラテス式問答に着想を得た手法。
True/Falseの両仮説について再帰的に説明を生成し、説明ツリーを構築した上で、論理的整合性をMAX-SAT問題として解くことで正解を導出する。
LLMの生成がノイジーであっても、論理的整合性のフィルタリングにより正確な回答を得られる点が独創的。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["命題: 「太陽は西から昇る」"] --> T["True仮説の説明を生成"]
    Q --> F["False仮説の説明を生成"]
    T --> ST["サブ命題を再帰的に検証"]
    F --> SF["サブ命題を再帰的に検証"]
    ST --> TREE["📊 説明ツリー構築<br/>論理関係(含意・矛盾)を判定"]
    SF --> TREE
    TREE --> SAT["🧮 MAX-SAT<br/>論理的に最も整合する<br/>回答を選択"]
    SAT --> ANS["✅ False<br/>太陽は東から昇る"]

    style Q fill:#E8F5E9,stroke:#81C784
    style TREE fill:#DBEAFE,stroke:#93C5FD
    style ANS fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: True/False両方の説明を生成(弁別的合理化)
命題: 「太陽は西から昇る」

この命題がTrueである理由を説明してください。
→ True説明: 「日本語で『日の入り』は西を指すため...」(ノイジーな説明)

この命題がFalseである理由を説明してください。
→ False説明: 「地球は西から東に自転するため、太陽は東から昇る」

# ステップ2: 各説明のサブ命題を再帰的に検証
サブ命題: 「地球は西から東に自転する」→ True/Falseの説明を生成...

# ステップ3: 論理関係を判定
True説明の根拠とFalse説明の根拠は矛盾しますか?
→ 矛盾する。False説明の根拠の方が整合的。

# ステップ4: MAX-SATで最終判定
→ 最終回答: False(太陽は東から昇る)

No.24 Verify-and-Edit

  • 提案: Zhao, Li, Joty et al., 2023

  • 論文: Verify-and-Edit: A Knowledge-Enhanced Chain-of-Thought Framework

  • arXiv: 2305.03268

  • 引用数: ~100

CoTで生成された推論連鎖を外部知識で事後検証し、事実に反するステップを編集して正確性を向上させる手法。
RAGとCoTのハイブリッドとも言える設計。
事実性が重要なタスク(知識集約型QA等)で特に有効。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["質問入力"] --> COT["CoTで推論チェーン生成<br/>Step1→Step2→Step3→回答"]
    COT --> V1["🔍 Step1を外部知識で検証"]
    COT --> V2["🔍 Step2を外部知識で検証"]
    COT --> V3["🔍 Step3を外部知識で検証"]
    V1 -->|✅ 正確| KEEP1["維持"]
    V2 -->|❌ 事実誤認| EDIT["✏️ 外部知識に基づき編集"]
    V3 -->|✅ 正確| KEEP3["維持"]
    EDIT --> REGEN["修正済みチェーンで再回答"]

    style Q fill:#E8F5E9,stroke:#81C784
    style V2 fill:#FDE8E0,stroke:#F48FB1
    style REGEN fill:#DBEAFE,stroke:#93C5FD
 ```

プロンプト例:

# ステップ1: CoTで推論チェーン生成
Q: エッフェル塔を設計したのは誰で、何年に完成しましたか?
A: Step1: エッフェル塔はパリにあるタワーです。
   Step2: ギュスターヴ・エッフェルが設計しました。
   Step3: 1900年のパリ万博のために建設されました。
   回答: ギュスターヴ・エッフェルが設計し、1900年に完成。

# ステップ2: 各ステップを外部知識で検証
Step1を検証: パリにあるタワー → ✅ 正確
Step2を検証: ギュスターヴ・エッフェルが設計 → ✅ 正確
Step3を検証: 1900年のパリ万博 → ❌ 事実誤認(正しくは1889年のパリ万博)

# ステップ3: 誤りを編集して再回答
Step3を修正: 「1889年のパリ万博のために建設されました」
→ 最終回答: ギュスターヴ・エッフェルが設計し、1889年に完成。

No.25 CRITIC

  • 提案: Gou, Shao, Gong et al., 2023

  • 論文: CRITIC: Large Language Models Can Self-Correct with Tool-Interactive Critiquing

  • arXiv: 2305.11738

  • 引用数: ~549

LLMが外部ツール(検索エンジン、コード実行環境、計算機等)と対話しながら自身の出力を批評・検証し、反復的に修正する手法。
Self-Refineが自己フィードバックのみに依存するのに対し、CRITICは外部ツールによる客観的な検証を行う点が差別化ポイント。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    GEN["🧠 初期出力を生成"] --> ID["検証すべき側面を特定"]
    ID --> TOOL["🔧 外部ツールで検証<br/>検索 / 計算機 / コード実行"]
    TOOL --> FB["フィードバック<br/>「計算結果が誤り」"]
    FB --> FIX["✏️ 出力を修正"]
    FIX --> CHECK{品質OK?}
    CHECK -->|No| ID
    CHECK -->|Yes| OUT["✅ 最終出力"]

    style GEN fill:#E8F5E9,stroke:#81C784
    style TOOL fill:#DBEAFE,stroke:#93C5FD
    style OUT fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: 初期出力を生成
Q: 2の10乗はいくつですか?
A: 2の10乗は2048です。

# ステップ2: 外部ツール(Python計算機)で検証
検証すべき点: 「2の10乗 = 2048」は正しいか?
→ Python実行: print(2**10) → 1024

# ステップ3: フィードバックに基づき修正
ツールの検証結果: 2**10 = 1024(元の回答2048は誤り)
この結果を踏まえて回答を修正してください。
→ 修正: 2の10乗は1024です。

# ステップ4: 再検証 → 品質OK → 最終出力

No.26 Self-Verification

  • 提案: Weng et al., 2022(代表例)

  • 論文: Large Language Models are Better Reasoners with Self-Verification

  • arXiv: 2212.09561

  • 引用数: ~200

LLMが生成した回答や推論過程を自ら検証し、矛盾や誤りを検出する手法。逆方向推論(回答から問題を再構成して一致確認)や条件整合性チェック等で回答の信頼性を評価する。
複数の候補回答に対して検証スコアを算出し、最も整合的な回答を選択する。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["問題"] --> C1["候補回答1: 9"]
    Q --> C2["候補回答2: 7"]
    Q --> C3["候補回答3: 11"]
    C1 --> V1["🔍 検証: 逆算で問題を再構成<br/>→ 整合スコア: 0.95"]
    C2 --> V2["🔍 検証<br/>→ 整合スコア: 0.40"]
    C3 --> V3["🔍 検証<br/>→ 整合スコア: 0.30"]
    V1 --> RANK["📊 スコアでランキング"]
    V2 --> RANK
    V3 --> RANK
    RANK --> ANS["✅ 最高スコアの回答: 9"]

    style Q fill:#E8F5E9,stroke:#81C784
    style RANK fill:#DBEAFE,stroke:#93C5FD
    style ANS fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: 複数の候補回答を生成
Q: 23個のリンゴがあり、20個使い、6個買った。何個?
候補回答1: 9個
候補回答2: 7個
候補回答3: 11個

# ステップ2: 各候補を逆方向推論で検証
候補1の検証: もし答えが9個なら、逆算すると
  9 - 6(買った) = 3、3 + 20(使った) = 23(最初の数) ✅ 一致
  → 整合スコア: 0.95

候補2の検証: もし答えが7個なら、逆算すると
  7 - 6 = 1、1 + 20 = 21 ≠ 23 ❌ 不一致
  → 整合スコア: 0.40

候補3の検証: もし答えが11個なら、逆算すると
  11 - 6 = 5、5 + 20 = 25 ≠ 23 ❌ 不一致
  → 整合スコア: 0.30

# ステップ3: 最高スコアの回答を選択
→ 最終回答: 9個

No.27 Iterative Prompting

  • 提案: 複数研究にまたがる一般的手法概念

  • 論文: 特定の単一論文なし

  • 引用数: N/A

プロンプトの出力を評価し、プロンプト自体やコンテキストを反復的に修正して品質を向上させる一般的フレームワーク。
Self-Refine、PHP、Reflexion等の上位概念にあたる。
実務では「一度のプロンプトで完璧な出力を得る」ことに固執せず、反復的に改善する方が効率的であることが多い。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart LR
    P["初期プロンプト"] --> OUT1["出力v1"]
    OUT1 --> EVAL["📊 評価"]
    EVAL --> MOD["✏️ プロンプト修正"]
    MOD --> OUT2["出力v2"]
    OUT2 --> EVAL2["📊 再評価"]
    EVAL2 --> MOD2["✏️ 再修正"]
    MOD2 --> OUT3["出力v3 ✅"]

    style P fill:#E8F5E9,stroke:#81C784
    style EVAL fill:#DBEAFE,stroke:#93C5FD
    style OUT3 fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ラウンド1: 初期プロンプト
「AIの歴史を説明してください」
→ 出力v1: 長すぎる、専門用語が多い

# ラウンド2: プロンプトを修正
「AIの歴史を、中学生にもわかるように3段落以内で説明してください」
→ 出力v2: 長さは適切だが具体例がない

# ラウンド3: さらに修正
「AIの歴史を、中学生にもわかるように3段落以内で説明してください。
各段落に具体的なAI製品やサービスの例を1つ含めてください」
→ 出力v3: ✅ 品質基準を満たす

D. 知識拡張・検索強化系(No.28-34)


No.28 Retrieval-Augmented Generation (RAG)

  • 提案: Lewis, Perez, Piktus et al., 2020

  • 論文: Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks

  • arXiv: 2005.11401

  • 引用数: ~7,000+

事前学習済みのパラメトリックメモリ(LLM)と非パラメトリックメモリ(密ベクトル検索)を組み合わせ、外部知識を動的に取得して生成に活用する手法。
2024-2025年のLLMアプリケーション開発で最も普及したアーキテクチャパターン。
知識のカットオフ問題、ハルシネーション、ドメイン特化の3つの課題を同時に解決を目指すアプローチ。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart LR
    Q["クエリ入力"] --> ENC["クエリ<br/>エンコーダ"]
    ENC --> IDX["🗄️ ベクトル<br/>インデックス"]
    IDX --> RET["Top-K<br/>関連文書取得"]
    RET --> LLM["🧠 LLM<br/>文書+クエリで生成"]
    LLM --> ANS["📄 根拠付き回答"]

    style Q fill:#E8F5E9,stroke:#81C784
    style IDX fill:#DBEAFE,stroke:#93C5FD
    style ANS fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: クエリをベクトル化し関連文書を検索(システム側で実行)
クエリ: 「当社の返品ポリシーは?」
→ ベクトル検索結果(Top-3):
  文書1: 「返品は購入後30日以内に限り受け付けます...」
  文書2: 「未開封品のみ返品可能です...」
  文書3: 「返金は元の支払い方法に7営業日以内に...」

# ステップ2: 検索結果を文脈としてLLMに入力
以下の社内ドキュメントに基づいて質問に回答してください。
ドキュメントに記載のない情報は「確認が必要です」と回答してください。

[関連ドキュメント]
文書1: 返品は購入後30日以内に限り受け付けます...
文書2: 未開封品のみ返品可能です...
文書3: 返金は元の支払い方法に7営業日以内に...

質問: 当社の返品ポリシーは?

No.29 Generated Knowledge Prompting (GKP)

  • 提案: Liu, Liu, Lu et al., 2022

  • 論文: Generated Knowledge Prompting for Commonsense Reasoning

  • arXiv: 2110.08387

  • 引用数: ~338

LLM自体から関連知識を生成し、その知識を追加入力として与えることで質問応答の精度を向上させる手法。
外部知識ベースへのアクセスや教師あり学習は不要。RAGが外部から知識を検索するのに対し、GKPはLLM内部の知識を明示的に引き出す。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["質問"] --> KG["🧠 知識生成<br/>関連知識をM個生成"]
    KG --> K1["知識1"]
    KG --> K2["知識2"]
    KG --> K3["知識3"]
    K1 --> QA1["知識1+質問→回答1"]
    K2 --> QA2["知識2+質問→回答2"]
    K3 --> QA3["知識3+質問→回答3"]
    QA1 --> AGG["📊 回答を集約"]
    QA2 --> AGG
    QA3 --> AGG
    AGG --> ANS["✅ 最終回答"]

    style Q fill:#E8F5E9,stroke:#81C784
    style KG fill:#DBEAFE,stroke:#93C5FD
    style ANS fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: 知識生成
Q: ゴルフボールの中には何が入っていますか?

この質問に答えるために必要な知識を3つ生成してください。
→ 知識1: ゴルフボールは多層構造で、コア・マントル・カバーで構成される。
→ 知識2: コアは通常、合成ゴムまたはポリブタジエンでできている。
→ 知識3: 昔のゴルフボールは液体コア(水や蜂蜜入り)だった。

# ステップ2: 知識を付加して回答
以下の知識を踏まえて質問に回答してください。

知識: ゴルフボールは多層構造で、コアは合成ゴムまたはポリブタジエンで
できている。昔は液体コアも使われていた。

Q: ゴルフボールの中には何が入っていますか?
A:

No.30 Active Prompting

  • 提案: Diao, Wang, Lin, Zhang, 2023

  • 論文: Active Prompting with Chain-of-Thought for Large Language Models

  • arXiv: 2302.12246

  • 引用数: ~150

不確実性指標に基づきタスクごとに最も有益な質問を選択してアノテーションし、タスク特化型のCoTプロンプトを適応的に構築する手法。
Active Learning(能動学習)の思想をプロンプトエンジニアリングに適用した。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    POOL["質問プール"] --> MULTI["各質問をLLMで<br/>複数回推論"]
    MULTI --> ENT["📊 不確実性を算出<br/>(エントロピー等)"]
    ENT --> SELECT["最も不確実な質問を選択"]
    SELECT --> HUMAN["👤 人間がCoT推論を<br/>アノテーション"]
    HUMAN --> PROMPT["タスク特化CoT<br/>プロンプトを構築"]
    PROMPT --> INFER["新しい質問で<br/>CoT推論を実行"]

    style POOL fill:#E8F5E9,stroke:#81C784
    style ENT fill:#DBEAFE,stroke:#93C5FD
    style INFER fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: 質問プールに対し不確実性を計算
# (各質問をtemperature=0.7で5回推論し、回答のばらつきを測定)

質問A: "5+3=?" → 5回とも回答8 → エントロピー: 0.0(確実)
質問B: "127×38=?" → 回答がバラバラ → エントロピー: 1.8(不確実)
質問C: "12÷4=?" → 5回とも回答3 → エントロピー: 0.0(確実)

# ステップ2: 最も不確実な質問Bを人間がアノテーション
Q: 127×38=?
A: まず127×30=3810。次に127×8=1016。3810+1016=4826。答えは4826。

# ステップ3: アノテーション済み例示でタスク特化プロンプトを構築
# (不確実だった質問タイプに最適化されたCoT例示が得られる)

No.31 Chain-of-Knowledge (CoK)

  • 提案: Li, Zhao, Chia et al., 2023

  • 論文: Chain-of-Knowledge: Grounding Large Language Models via Dynamic Knowledge Adapting over Heterogeneous Sources

  • arXiv: 2305.13269

  • 引用数: ~128

構造化データ(Wikidata、テーブル)と非構造化データ(Wikipedia等)を動的に統合し、推論チェーンの各ステップを段階的に修正してハルシネーションを低減する手法。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["知識集約型の質問"] --> PRE["予備的な推論チェーン生成"]
    PRE --> S1["Step1の知識ドメインを特定"]
    S1 --> QG["適応的クエリ生成<br/>SPARQL / SQL / 自然文"]
    QG --> KB["🗄️ 異種知識ソース<br/>Wikidata / Wikipedia / テーブル"]
    KB --> FIX["推論ステップを<br/>段階的に修正"]
    FIX --> ANS["✅ 修正済み回答"]

    style Q fill:#E8F5E9,stroke:#81C784
    style KB fill:#DBEAFE,stroke:#93C5FD
    style ANS fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: 予備的な推論チェーン生成
Q: 東京オリンピック2020のマラソン金メダリストの国籍は?

予備的推論:
Step1: 東京オリンピック2020の男子マラソン金メダリストは...
Step2: その選手の国籍は...

# ステップ2: 各ステップの知識ドメインを特定し検索
Step1の知識ドメイン: スポーツ記録 → Wikidata
適応的クエリ(SPARQL): SELECT ?winner WHERE { ?event wdt:P31 wd:Q159821 ... }
→ 検索結果: エリウド・キプチョゲ

Step2の知識ドメイン: 人物情報 → Wikipedia
→ 検索結果: ケニア国籍

# ステップ3: 推論チェーンを修正
修正済みStep1: 金メダリストはエリウド・キプチョゲ(検証済み)
修正済みStep2: 国籍はケニア(検証済み)
→ 最終回答: ケニア

No.32 Recitation-Augmented Language Models (RECITE)

  • 提案: Sun, Wang, Tay et al., 2022

  • 論文: Recitation-Augmented Language Models

  • arXiv: 2210.01296

  • 引用数: ~200

外部検索ではなくLLM自身の記憶から関連パッセージを暗唱させ、それに基づいて回答を生成するclosed-bookアプローチ。
外部インフラ不要で知識強化が可能。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    Q["質問入力"] --> REC["🧠 暗唱(Recite)<br/>関連パッセージを記憶から生成"]
    REC --> P1["パッセージ1"]
    REC --> P2["パッセージ2"]
    REC --> P3["パッセージ3"]
    P1 --> QA["質問+暗唱パッセージで回答"]
    P2 --> QA
    P3 --> QA
    QA --> SC["Self-Consistency<br/>で整合性検証"]
    SC --> ANS["✅ 最終回答"]

    style Q fill:#E8F5E9,stroke:#81C784
    style REC fill:#DBEAFE,stroke:#93C5FD
    style ANS fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# ステップ1: 関連パッセージを暗唱させる
Q: フランス革命は何年に始まりましたか?

まず、この質問に関連する段落を記憶から暗唱してください。
→ 暗唱: 「フランス革命は1789年にバスティーユ牢獄の襲撃で始まった。
   第三身分の代表者たちは国民議会を結成し、封建制度の廃止を宣言した。
   革命は1799年のナポレオンのクーデターまで続いた。」

# ステップ2: 暗唱した内容に基づいて回答
上記の暗唱内容に基づいて質問に回答してください。
Q: フランス革命は何年に始まりましたか?
A: 1789年に始まりました。

No.33 Demonstrate-Search-Predict (DSP)

  • 提案: Khattab, Santhanam, Li et al., 2022

  • 論文: Demonstrate-Search-Predict: Composing retrieval and language models for knowledge-intensive NLP

  • arXiv: 2212.14024

  • 引用数: ~217

言語モデル(LM)と検索モデル(RM)を高水準パイプラインで組成し、Demonstrate→Search→Predictの3段階で知識集約型タスクを解決するフレームワーク。
後のDSPyの前身。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart LR
    D["🎯 Demonstrate<br/>デモ例を<br/>ブートストラップ生成"] --> S["🔍 Search<br/>LM生成クエリで<br/>RM検索"]
    S --> P["💡 Predict<br/>検索結果で<br/>文脈化し予測"]
    P -->|マルチホップ| S

    style D fill:#E8F5E9,stroke:#81C784
    style S fill:#DBEAFE,stroke:#93C5FD
    style P fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# Demonstrate: デモンストレーションをブートストラップ生成
Q: 「ハリー・ポッター」の著者が住んでいる国の首都は?
→ 自動生成デモ: Search("ハリー・ポッターの著者") → J.K.ローリング
                Search("J.K.ローリング 居住国") → イギリス
                Predict: ロンドン

# Search: LMが生成したクエリでRM検索
Q: 「指輪物語」の著者が教鞭を取った大学のある都市は?
LM生成クエリ1: "指輪物語の著者"
→ 検索結果: J.R.R.トールキン

# Search(マルチホップ): 2回目の検索
LM生成クエリ2: "トールキン 大学 教授"
→ 検索結果: オックスフォード大学

# Predict: グラウンドされた情報に基づき予測
文脈: トールキンはオックスフォード大学の教授だった
→ 予測: オックスフォード

No.34 Knowledge Prompting

  • 提案: 複数研究にまたがる一般的手法概念

  • 論文: 特定の単一論文なし

  • 引用数: N/A

外部知識ベースやLLM自身の知識をプロンプトに明示的に組み込み、知識集約型タスクの精度を向上させる手法群の総称。GKP、CoK、RAG、RECITE等の上位概念にあたる。

```mermaid
%%{ init: { 'theme': 'base', 'themeVariables': { 'fontSize': '20px', 'primaryColor': '#DBEAFE', 'primaryTextColor': '#1E3A5F', 'primaryBorderColor': '#93C5FD', 'lineColor': '#A5B4C4', 'secondaryColor': '#FDE8E0', 'tertiaryColor': '#E8F5E9' } } }%%
flowchart TD
    NEED["知識領域を特定"] --> SRC{知識ソースを選択}
    SRC -->|外部DB| RAG_["RAG: ベクトル検索"]
    SRC -->|LLM内部| GKP_["GKP: 自己生成"]
    SRC -->|LLM記憶| REC_["RECITE: 暗唱"]
    SRC -->|異種DB| COK_["CoK: 動的統合"]
    RAG_ --> CTX["知識をプロンプトに構造化"]
    GKP_ --> CTX
    REC_ --> CTX
    COK_ --> CTX
    CTX --> LLM["🧠 知識付きで推論"]
    LLM --> ANS["✅ 回答"]

    style NEED fill:#E8F5E9,stroke:#81C784
    style SRC fill:#DBEAFE,stroke:#93C5FD
    style ANS fill:#FDE8E0,stroke:#F48FB1
 ```

プロンプト例:

# 知識をプロンプトに明示的に注入する基本パターン

以下の知識を参考にして質問に回答してください。
知識に記載のない情報については推測せず、「不明」と回答してください。

【参考知識】
- 当社の営業時間は平日9:00-18:00です。
- 土日祝は休業です。
- 年末年始(12/29-1/3)は特別休業です。
- 電話対応は10:00-17:00です。

質問: 12月30日に電話で問い合わせできますか?

参考文献(Part2)

いいなと思ったら応援しよう!