LLMによる長文ドキュメントの攻略
100ページの技術PDFから質問に回答するシステムを構築しました。
単純なスクリプトではうまくいきませんでした。数週間にわたり、トークン制限や高額なコストとの戦いが続きました。
最初はGPT-4に全文を入力する方法を試しました。これは10ページ程度なら機能しましたが、100ページになるとトークン上限に達しました。モデルは中盤の詳細を忘れてしまい、コストも高すぎました。
以下の手法を試しました:
- 基本的なチャンキング:モデルが誤ったセクションを選択してしまい、文脈を見失いました。
- Map-reduce:具体的な詳細が失われてしまいました。
- スライディングウィンドウ:処理が遅すぎ、コストもかかりすぎました。
私は人間が読む方法を模倣することにしました。人間はまず目次をざっと読み、それから特定のセクションを読みます。
新しいワークフローは以下の通りです:
- 階層構造を作成する。LLMを使用して、各チャンクの短い要約を作成する。
- 要約と全文をベクトルデータベースに保存する。
- ハイブリッド検索を使用する。キーワード検索とセマンティック検索を組み合わせる。
- まず上位3つの要約を取得する。
- それらの要約に対応する全文を取得する。
- このコンテキストをLLMに渡す。
結果:
- コストが70%削減されました。
- 技術用語が正確になりました。
- 精度が向上しました。
セットアップのヒント:
- 要約にはGPT-3.5を使用する。
- 最終的な回答にはGPT-4を使用する。
- 早めにテストデータセットを作成する。
- 20ページ未満のドキュメントについては、プロンプトに全文を詰め込む(Stuffing)。