Packaging & Context Handling — パッケージングとコンテキストハンドリング
Packaging & Context Handling — LLM のコンテキストに抽出された知識の断片を選択、圧縮、配置、提供するための一連のテクニックであり、Retrieval-Augmented Generation (RAG) の一部です。目的は、限られたトークン予算の有用性を最大化し、応答の精度と安定性を向上させ、出典の追跡可能な引用を確保することです。「パッケージング」とは、断片のリストを作成するだけでなく、それらの圧縮、順序、グループ化、および stuff、map-reduce、refine、tree-of-chunks といった戦略を含むモデルへの指示も意味します。[1][2]
定義と動機
RAGシステムでは、最終的な応答の品質はリトリーブだけでなく、選択された断片がプロンプトにどのように組み込まれるかによっても決まります。コンテキストの制限とトークンコストにより、網羅性と精度の間でバランスを取る必要があります。不要な断片は「中間で迷子になる」(lost-in-the-middle)リスクを高め、レイテンシを増加させる一方、積極的なフィルタリングや圧縮は重要な証拠を削除する可能性があります。[3] 古典的なRAGでは、出典は外部の「非パラメトリックメモリ」として機能し、パッケージングがLLMに事実と参照を確実に操作させることで、情報の現在性と引用可能性を保証します。[1]
チャンキングとコンテンツ抽出
セグメンテーション(chunking)ポリシーは、チャンクのサイズや重複、正規化、粒度(document→passage→sentence)を定義します。一般的なアプローチは以下の通りです:
- 固定サイズルール(文字数/トークン数に基づく)と、チャンク間の連続性を維持するための重複。[4][5]
- セマンティックチャンキング(埋め込みの近接性に基づく境界設定)により、「意味の断絶」を減少させる。[6]
- Sentence-window retrieval — 最初は文単位でインデックス化し、リトリーブ時には関連する文をその前後の隣接する文のウィンドウと共に抽出し、ローカルなコンテキストを復元する。[7]
- Passageレベルのインデックス化 — Wikipediaを約100単語のパッセージに分割することは、オープンQA(DPR)の標準となっており、初期段階での細かい粒度の有用性を示している。[8]
- 正規化とクリーニング(ゴミ、ヘッダー/フッターの削除、空白の統一)、追跡可能性のためのメタデータレベルでの出典/ページ/オフセットの追跡。[9]
- 重複排除 — 候補チャンクの(完全一致およびnear-duplicateの)重複排除:繰り返しを減らすためのシン グリング + MinHash/LSH。[10]
多様化と選択 (MMRなど)
コンテキストのセットを形成する際には、高い関連性と低い冗長性が求められます。古典的なMaximal Marginal Relevance(MMR)関数は、クエリへの近接性と、すでに選択されたものとの最大の類似性(重複に対するペナルティ)を考慮して次の断片を選択します:
。[11]
複数のシグナルの組み合わせ:ハイブリッドリトリーブ(BM25 + dense)→ フュージョン(例:Reciprocal Rank Fusion, RRF)→ クロスエンコーダー/ColBERTによるリランキング:
- RRF: 異種リトリーバーのランキングをマージするためのシンプルで効果的な教師なし手法。[12]
- クロスエンコーダーリランカー(BERT/MonoT5/現代の商用API)は、top-kの精度を大幅に向上させるが、レイテンシを追加する。[13][14]
- マルチベクターリトリーバー ColBERT (late interaction) は、大規模コーパスにおいて効果的なリランカー/第一段階リトリーバーとしてしばしば機能する。[15]
- ハイブリッド検索(BM25F+ベクトル)は、調整可能な重み/フュージョン(α、RRFなど)を持つ産業用エンジンやライブラリに実装されている。[16][17]
コンテキストの圧縮
事実を失うことなくコンテキストの量を削減することは、コストとレイテンシにとって重要です:
- 抽出型圧縮(重要な文/フレーズの抽出);抽象型要約(言い換え/圧縮)。古典的な視点については Nenkova & McKeown を参照。[18]
- Query-guided / instruction-guided 圧縮:クエリ/タスクに応じた要約(証拠を強調し、無関係な部分を削除する)。
- LLMフィルタリング/トークン枝刈りによるPrompt/context compression(例:LLMLingua/LLMLingua-2)は、品質の低下を最小限に抑えながらトークン予算を削減するが、faithfulness の慎重な検証が必要。[19]
- 圧縮は品質↔コスト↔レイテンシのトレードオフです。積極的な圧縮は、ニュアンスや前提を見逃すリスクを高め、事実の帰属を悪化させる。[20]
パッケージング戦略 (stuff/map-reduce/refine/tree)
以下は、プロンプトに情報源を配置するための4つの基本的な手法と、その典型的な適用シナリオです(比較表も参照)。
- Stuff (直接入力)
- 選択された断片を(可能な圧縮後に)連結し、全体として入力する。シンプルで高速だが、容量に制限があり、長い入力では lost-in-the-middle の影響を受けやすい。[2]
- Map-Reduce
- map 段階で各断片/文書についてローカルに応答/要約し、次に reduce 段階で集約(比較、投票、マージ)する。情報源の数に対してスケールしやすいが、単純な集約では情報源間の相互関連性が失われるリスクがある。[2][21]
- Refine
- 逐次的な改善:最初の断片に基づいて初期応答を生成し、その後、次の断片を考慮して反復的に refine(追加/修正)する。情報源の順序が重要な場合に便利だが、初期の誤りに「固執」し、歪みが蓄積されるリスクがある。[22]
- Tree-of-chunks
- 階層的な圧縮/要約:チャンクごとのローカルな要約 → セクションレベルでの要約 → 最終的な要約。長い文書に有用だが、正しい帰属のためにはレベル間で情報源の識別子を正確に伝達する必要がある。[23]
| 戦略 | アイデア | コスト/レイテンシ | コンテキスト損失のリスク | 適用場面 | 出典 |
|---|---|---|---|---|---|
| Stuff | 全ての断片を一度に1つのプロンプトに | 低い(コンテキスト制限まで) | 長い入力で高い(lost-in-the-middle) | 少量の情報、単純な質問 | [2][3] |
| Map-Reduce | ローカルな応答 → 集約 | 中/高い(多くの呼び出し) | 中(reduceの品質に依存) | 多くの情報源、スケーラビリティが必要 | [2][21] |
| Refine | 逐次的な応答の改善 | 中 | 順序への依存、誤りの固定化リスク | 順序/応答の進化が重要な場合 | [22] |
| Tree-of-chunks | 階層的な要約 | 中/高い | 上位レベルでの詳細損失 | 長い文書/コレクション | [23] |
出典の順序と配置
LLMは長いコンテキストの中間にある情報を利用するのが苦手です。有用な事実は、最初や最後に配置し、トピックや情報源ごとにグループ化し、見出しやIDでマークするのが良いでしょう。query-aware の重要性と多様性を考慮したリランキングは、主要な断片をより先頭に移動させるのに役立ちます。[3][13]
RAGパイプラインへの統合 (fusion → rerank → packaging)
典型的な多段階パイプラインは、hybrid retrieval (BM25 + dense) → fusion (RRF/加重混合) → rerank (Cross-Encoder/ColBERT) → packaging (戦略のいずれか) → 生成 + 引用 です。ハイブリッド検索とRRFは、異なるリトリーバーのスコアの非互換性に対して頑健です。クロスエンコーダーはLLMへの入力の精度を高め、トークンを節約します。[16][12][14][15]
品質評価とアブレーション
評価は、リトリーブ、パッケージング、生成の各レベルで行われます:
- リトリーブ: Recall@k, nDCG@k, MRR — 情報検索の標準的なメトリクス。[24]
- Faithfulness/groundedness: 引用によって裏付けられた主張の割合。自動化されたフレームワーク(RAGAS, TruLens)+ 手動による帰属の検証。[25][26][27]
- End-to-end QA: タスク/データセット(NQ/HotpotQAなど)に応じたEM/F1/ROUGE。[1]
- 効率性: レイテンシp50/p95、トークン数、コスト($);パッケージング戦略と圧縮レベルを品質↔コストで比較。
- アブレーション: MMR/重複排除/圧縮の無効化や順序の変更により、各コンポーネントの貢献度を測定する(2025年9月10日現在、RAG研究の実践では、k, λ, チャンクサイズ、トークン制限を明確に記録することが推奨されている)。[28]
実践的な推奨事項とチェックリスト
- kと多様化: ハイブリッドリトリーブからk=20–40の候補で開始し、λ≈0.5–0.8のMMRを適用する。URL/ID/テキストハッシュによる重複には厳しくペナルティを課す。[11][16]
- チャンキング: 固定チャンキングでは200–400トークン、10–20%の重複を使用する。法律・技術文書では、sentence/window スキームが役立つことが多い。[4][7]
- 圧縮: クエリに基づく抽出型フィルタリングと慎重な抽象化を使用する。LLMLinguaのような手法は、データに対する faithfulness に応じて増減させる(A/B検証が必須)。[19][27]
- 順序: 重要/高信頼度の断片はプロンプトの最初に配置する。情報源/トピックでグループ化し、IDと見出しを明示する。lost-in-the-middle 効果を考慮する(重要な事実を最初と最後に重複させることが役立つ場合がある)。[3]
- リランク: 予算が許せば、パッケージングの前にトップk(k≈50–200)にCross-Encoder/ColBERTを追加する。これにより、生成トークンを節約し、精度を向上させることができる。[13][15]
- フォールバック戦略: (1) 事実不足 → 追加の情報源を要求、(2) トークン制限超過 → stuff→refine への切り替えまたは圧縮の有効化、(3) 低信頼度/矛盾 → 不足しているIDのリストを明記した拒否応答(下記のテンプレート参照)。
パッケージングパイプラインの疑似コード
# 入力: query q cands = retrieve(q, K_sparse, K_dense) # BM25, DPRなどで検索 cands = diversify_MMR(cands, lambda=0.7) # 多様化 (MMR) snips = compress(query=q, items=cands, mode="extractive|abstractive", budget=tokens) pkg = package(snips, strategy="stuff|map_reduce|refine|tree") resp = generate(prompt=build_prompt(q, pkg), citations=True) # 引用付きLLM
プロンプトテンプレートの骨子 (抜粋)
[ユーザーのクエリ]
{q}
[出典]
{# 各断片にID、タイトル、リンクを付与 #}
- [{id}] {title} — {url}
{content_snippet}
[要件]
1) 出典からの事実のみを使用し、[ID]で参照してください。
2) データが不十分な場合は、その旨を伝え、詳細な情報や追加の出典を求めてください。
3) 回答の構造を維持し、使用した[ID]のリストを記載してください。
制限と未解決の問題
- map-reduce/refineにおけるハルシネーションと集約: 抽象的な要約は新たな事実を導入する可能性がある。帰属に関する明確な指示と引用検証メカニズムが重要。[20][27]
- 積極的な圧縮/階層的圧縮による詳細の損失: 元の出典/ページ/オフセットへの逆参照を保持することが重要。
- リトリーバー/リランカーおよびコンプレッサーのドメイン適応性: ドメイン固有のコーパスでの適応/ファインチューニングが必要。[28]
- プライバシー/PIIとLLMの記憶: 厳密なgroundingなしでの生成は、プライベートな文字列の漏洩につながる可能性がある。フィルター、プライベートストレージ、拒否ポリシーを適用する。[29][30]
- 訓練可能な「パッカー」、適応的な順序/配置、faithfulness向上のためのRLHF/フィードバックループ、多言語および超長コンテキスト — これらは活発な研究分野である。[28][3]
リンク
- LangChain: Summarization (stuff/map_reduce/refine). [29]
- LangChain: Text splitters. [30]
- LlamaIndex: Response Synthesizers (refine/tree). [31]
- LlamaIndex: Node Parsers / SentenceSplitter / SemanticSplitter. [32]
- Haystack: SentenceWindowRetriever. [33]
- Haystack: PreProcessors / DocumentSplitter. [34]
- Weaviate: Hybrid search. [35]
- Pinecone: Hybrid search. [36]
- Cohere: Rerank API. [37]
- RAGAS (repo/docs). [38] [39]
- TruLens (docs). [40]
参考文献
- Manning, C. D., Raghavan, P., Schütze, H. (2008). Introduction to Information Retrieval. Cambridge University Press. ISBN 978‑0521865715.
- Nenkova, A., McKeown, K. (2011). Automatic Summarization. FnT IR, 5(2–3), 103–233. DOI:10.1561/1500000015.
- Lewis, P., et al. (2020). Retrieval‑Augmented Generation for Knowledge‑Intensive NLP Tasks. NeurIPS. arXiv:2005.11401.
- Khattab, O., Zaharia, M. (2020). ColBERT. SIGIR’20. DOI:10.1145/3397271.3401075.
- Izacard, G., Grave, E. (2021). Fusion‑in‑Decoder. EACL. arXiv:2007.01282.
- Ji, Z., et al. (2023). Survey of Hallucination in NLG. ACM CS. DOI:10.1145/3571730.
- Gao, S., et al. (2024). RAG for LLM: A Survey. arXiv:2312.10997.
注釈
- ↑ 1.0 1.1 1.2 Lewis, P., Perez, E., Piktus, A., Petroni, F., Karpukhin, V., et al. (2020). Retrieval‑Augmented Generation for Knowledge‑Intensive NLP Tasks. NeurIPS. arXiv:2005.11401. [1]
- ↑ 2.0 2.1 2.2 2.3 2.4 LangChain Docs. Summarization (stuff/map_reduce/refine/map_rerank). (アクセス日: 2025‑09‑10). [2]
- ↑ 3.0 3.1 3.2 3.3 3.4 Liu, N. F., Lin, K., Hewitt, J., Paranjape, A., Bevilacqua, M., Petroni, F., Liang, P. (2024). Lost in the Middle: How Language Models Use Long Contexts. TACL. arXiv:2307.03172. [3]
- ↑ 4.0 4.1 LangChain Docs. Text splitters (RecursiveCharacter/TokenTextSplitter). (アクセス日: 2025‑09‑10). [4]
- ↑ LlamaIndex Docs. SentenceSplitter / TokenTextSplitter / SemanticSplitter. (アクセス日: 2025‑09‑10). [5] [6] [7]
- ↑ LlamaIndex Docs. SemanticSplitterNodeParser. (アクセス日: 2025‑09‑10). [8]
- ↑ 7.0 7.1 Haystack Docs. SentenceWindowRetriever. (アクセス日: 2025‑09‑10). [9]
- ↑ Karpukhin, V., Oguz, B., Min, S., Lewis, P., Wu, L., Edunov, S., Chen, D., Yih, W.‑T. (2020). Dense Passage Retrieval for Open‑Domain Question Answering. EMNLP. arXiv:2004.04906. [10]
- ↑ Haystack Docs. PreProcessors / DocumentSplitter. (アクセス日: 2025‑09‑10). [11] [12]
- ↑ Broder, A. Z. (1997). On the Resemblance and Containment of Documents. Compression and Complexity of Sequences. [13]
- ↑ 11.0 11.1 Carbonell, J., Goldstein, J. (1998). The Use of MMR, Diversity‑Based Reranking for Reordering Documents and Producing Summaries. SIGIR’98, pp. 335–336. DOI:10.1145/290941.291025.
- ↑ 12.0 12.1 Cormack, G. V., Clarke, C. L. A., Büttcher, S. (2009). Reciprocal Rank Fusion outperforms Condorcet and Individual Rank Learning Methods. SIGIR’09, pp. 758–759. DOI:10.1145/1571941.1572114. [14]
- ↑ 13.0 13.1 13.2 Nogueira, R., Cho, K. (2019). Passage Re‑ranking with BERT. arXiv:1901.04085. [15]
- ↑ 14.0 14.1 Cohere Docs. Rerank API overview. (アクセス日: 2025‑09‑10). [16]
- ↑ 15.0 15.1 15.2 Khattab, O., Zaharia, M. (2020). ColBERT: Efficient and Effective Passage Search via Contextualized Late Interaction over BERT. SIGIR’20, pp. 39–48. DOI:10.1145/3397271.3401075. arXiv:2004.12832.
- ↑ 16.0 16.1 16.2 Weaviate Docs. Hybrid search (BM25F + vector). (アクセス日: 2025‑09‑10). [17]
- ↑ Pinecone Docs. Hybrid search. (アクセス日: 2025‑09‑10). [18]
- ↑ Nenkova, A., McKeown, K. (2011). Automatic Summarization. Foundations and Trends in Information Retrieval, 5(2–3), 103–233. DOI:10.1561/1500000015.
- ↑ 19.0 19.1 Zhu, Y., Shao, Z., Li, M., et al. (2023). LLMLingua: Compressing Prompts for Accelerating LLM Inference. arXiv:2310.05736. [19]
- ↑ 20.0 20.1 Ji, Z., Lee, N., Frieske, R., et al. (2023). Survey of Hallucination in Natural Language Generation. ACM Computing Surveys, 55(12), Art.248. DOI:10.1145/3571730.
- ↑ 21.0 21.1 Izacard, G., Grave, E. (2021). Leveraging Passage Retrieval with Generative Models for Open‑Domain QA (Fusion‑in‑Decoder). EACL. arXiv:2007.01282. [20]
- ↑ 22.0 22.1 LlamaIndex Docs. Response Synthesizers: refine. (アクセス日: 2025‑09‑10). [21]
- ↑ 23.0 23.1 LlamaIndex Docs. Tree Summarize. (アクセス日: 2025‑09‑10). [22]
- ↑ Manning, C. D., Raghavan, P., Schütze, H. (2008). Introduction to Information Retrieval. Cambridge Univ. Press. (nDCG/MRRに関する章を参照). [23]
- ↑ Es, S., et al. (2023). RAGAS: Automated Evaluation of Retrieval‑Augmented Generation. arXiv:2309.15217. [24]
- ↑ TruLens Docs. Evaluating RAG (groundedness, relevance). (アクセス日: 2025‑09‑10). [25]
- ↑ 27.0 27.1 27.2 Rashkin, H., Nakov, P., et al. (2023). Measuring Attribution in Natural Language Generation. Computational Linguistics, 49(4), 1207–1261. DOI:10.1162/coli_a_00486.
- ↑ 28.0 28.1 28.2 Gao, S., et al. (2024). Retrieval‑Augmented Generation for Large Language Models: A Survey. arXiv:2312.10997. [26]
- ↑ Carlini, N., Tramèr, F., et al. (2021). Extracting Training Data from Large Language Models. USENIX Security. [27]
- ↑ Shokri, R., Stronati, M., Song, C., Shmatikov, V. (2017). Membership Inference Attacks Against ML Models. IEEE S&P. [28]