4章 LangChain を用いた高度なテキスト生成手法
ドキュメントチェーン
ドキュメントチェーンとは、単一・複数のドキュメントをLLMに渡して、回答を生成する手法
LangChain を使うときにはドキュメントチェーンの方法が4種類あるのでまとめる
Stuff ドキュメントチェーン
ドキュメントを変換せずに、そのままLLMに渡すパターン
ドキュメントチェーン戦略の中で最もシンプルな方法
code:mermaid
flowchart TD
C1 --> STUFF
C2 --> STUFF
C3 --> STUFF
CN --> STUFF
STUFF --> FINAL
style C1 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C2 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C3 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style CN fill:#E1F5EE,stroke:#0F6E56,color:#085041
style STUFF fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style FINAL fill:#FAECE7,stroke:#993C1D,color:#712B13
メリット
LLMは一度の呼び出しで完結
同一コンテキストに含まれるので、ファイル間の情報漏れがない
実装がシンプル
デメリット
コンテキスト長に収まらない可能性がある
ファイルが大きくなれば大きくなるほどコスト増
入力が大きすぎると回答品質が下がる可能性がある
使い道
サイズの小さいドキュメントに最適
Refine ドキュメントチェーン
複数のドキュメントをひとつずつLLMに渡し、回答を含めた状態で次のドキュメントと共にLLMに再度渡すことを繰り返す手法
以下の手順で全てのファイルを見終えるまでループをする
code:mermaid
flowchart TD
C1 --> IP
IP --> A1
A1 -.->|前の回答を引き継ぎ| RP1
C2 --> RP1
RP1 --> A2
A2 -.->|前の回答を引き継ぎ| RP2
C3 --> RP2
RP2 --> A3
A3 -.->|繰り返し...| RPN
CN --> RPN
RPN --> FINAL
style C1 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C2 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C3 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style CN fill:#E1F5EE,stroke:#0F6E56,color:#085041
style IP fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style RP1 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style RP2 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style RPN fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style A1 fill:#FAEEDA,stroke:#854F0B,color:#633806
style A2 fill:#FAEEDA,stroke:#854F0B,color:#633806
style A3 fill:#FAEEDA,stroke:#854F0B,color:#633806
style FINAL fill:#FAECE7,stroke:#993C1D,color:#712B13
メリット
ファイル間の情報の抜け漏れが防げる
文章全体の流れを反映して回答が得やすい
Stuff では対応できないファイルなどに有用
デメリット
直列処理のために時間がかかる
最初の回答に偏る傾向がある
後半のステップほど入力トークンが増え、コストが膨らむ
使い道
ストーリー性があるものの要約
前後関係を踏まえた回答が欲しい時(QAなど)
ファイルの数がそこまで多くない時
Map Reduce ドキュメントチェーン
複数のドキュメントをそれぞれLLMに渡し(Map 処理)、回答をすべてまとめてLLMに問い合わせをする手法(Reduce 処理)
Map フェーズ:各ドキュメントに対して同じプロンプトを適用して、中間結果を作成
Reduceフェーズ:中間結果をすべて一つのプロンプトにまとめて、LLMに依頼する
code:mermaid
flowchart TD
C1 --> M1 --> R1
C2 --> M2 --> R2
C3 --> M3 --> R3
CN --> MN --> RN
R1 --> REDUCE
R2 --> REDUCE
R3 --> REDUCE
RN --> REDUCE
REDUCE --> FINAL
style C1 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C2 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C3 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style CN fill:#E1F5EE,stroke:#0F6E56,color:#085041
style M1 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style M2 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style M3 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style MN fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style R1 fill:#FAEEDA,stroke:#854F0B,color:#633806
style R2 fill:#FAEEDA,stroke:#854F0B,color:#633806
style R3 fill:#FAEEDA,stroke:#854F0B,color:#633806
style RN fill:#FAEEDA,stroke:#854F0B,color:#633806
style REDUCE fill:#E6F1FB,stroke:#185FA5,color:#0C447C
style FINAL fill:#FAECE7,stroke:#993C1D,color:#712B13
メリット
並列処理で高速化できる
大量のドキュメントに対応できる
Reduce フェーズで全体を参照しているため、全体を踏まえた回答が得られる
デメリット
ファイル間の文脈が失われやすい
Reduce フェーズで重要な情報が欠落する可能性がある
LLMの呼び出しが N + 1になる
使い道
大量の議事録・レポートの一括要約
複数ドキュメントからの情報収集・横断的な分析
速度重視で大規模データを処理するバッチ処理
Map Re-rank ドキュメントチェーン
それぞれのドキュメントに対して回答とスコアを生成し(Map処理)、最もスコアが高い回答を最終回答として選択(Re-rank処理)する手法
Map フェーズ:各ファイルに対して同じプロンプトを使い、回答とスコアを取得する
Re-rank フェーズ:スコアを比較して一番高い回答を最終回答とする(LLM呼び出しはしない)
code:mermaid
flowchart TD
C1 --> M1 --> R1
C2 --> M2 --> R2
C3 --> M3 --> R3
CN --> MN --> RN
R1 -.-> RERANK
R2 ==>|最高スコア| RERANK
R3 -.-> RERANK
RN -.-> RERANK
RERANK --> FINAL
style C1 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C2 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style C3 fill:#E1F5EE,stroke:#0F6E56,color:#085041
style CN fill:#E1F5EE,stroke:#0F6E56,color:#085041
style M1 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style M2 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style M3 fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style MN fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style R1 fill:#FAEEDA,stroke:#854F0B,color:#633806
style R2 fill:#FAEEDA,stroke:#854F0B,color:#633806
style R3 fill:#FAEEDA,stroke:#854F0B,color:#633806
style RN fill:#FAEEDA,stroke:#854F0B,color:#633806
style RERANK fill:#E6F1FB,stroke:#185FA5,color:#0C447C
style FINAL fill:#FAECE7,stroke:#993C1D,color:#712B13
メリット
Map Reduce と違いLLMの呼び出しがN回でいい
答えが1箇所に存在するQAでは、最もシンプルかつ的確に動作する
並列実行可能で高速
デメリット
情報の統合を行わないため、複数ファイルの情報を組み合わせる必要がある質問には使えない
LLMの自己評価スコアが不安定で、ハルシネーションに高スコアがつくリスクがある
要約タスクには不向き(要約は情報の統合が本質であるため)
使い道
FAQ検索
ドキュメント内の特定情報の抽出
RAGでのリランキング工程
選定フローチャート
code:mermaid
flowchart TD
Q1{"全チャンクが\nコンテキストウィンドウに\n収まる?"}
Q2{"タスクの種類は?"}
Q3{"文脈の連続性は\n重要?"}
QA{"答えが1箇所にある?"}
START --> Q1
Q1 -->|はい| STUFF
Q1 -->|いいえ| Q2
Q2 -->|QA(質問応答)| QA
Q2 -->|要約・分析| Q3
QA -->|はい| RERANK
QA -->|いいえ| REDUCE
Q3 -->|はい| REFINE
Q3 -->|いいえ| REDUCE
style START fill:#F1EFE8,stroke:#5F5E5A,color:#2C2C2A
style Q1 fill:#FAEEDA,stroke:#854F0B,color:#633806
style Q2 fill:#FAEEDA,stroke:#854F0B,color:#633806
style Q3 fill:#FAEEDA,stroke:#854F0B,color:#633806
style QA fill:#FAEEDA,stroke:#854F0B,color:#633806
style STUFF fill:#E1F5EE,stroke:#0F6E56,color:#085041
style RERANK fill:#E6F1FB,stroke:#185FA5,color:#0C447C
style REDUCE fill:#EEEDFE,stroke:#534AB7,color:#3C3489
style REFINE fill:#FAECE7,stroke:#993C1D,color:#712B13
`