Home Microsoft Research解説: LLMLinguaシリーズ — プロンプト圧縮技術の進化と20倍圧縮の実現
投稿
キャンセル

✍️ Microsoft Research解説: LLMLinguaシリーズ — プロンプト圧縮技術の進化と20倍圧縮の実現

ブログ概要(Summary)

Microsoft Researchが開発したLLMLinguaシリーズは、LLMへの入力プロンプトを圧縮し、推論コスト削減とレイテンシ短縮を実現するプロジェクトである。初代LLMLingua(EMNLP 2023)はパープレキシティベースの粗粒度→細粒度圧縮で最大20倍の圧縮を達成。LongLLMLingua(ACL 2024)は長文コンテキスト特化の拡張でNaturalQuestionsベンチマークで17.1%の精度向上。LLMLingua-2(ACL 2024 Findings)はGPT-4蒸留によるトークン分類アプローチで3〜6倍の速度向上を実現した。

この記事は Zenn記事: LLMコンテキストウィンドウ最適化:5層戦略でコスト70%削減と精度維持を両立する の深掘りです。

情報源

技術的背景(Technical Background)

なぜプロンプト圧縮が必要か

LLMの入力プロンプトが長大化する3つの要因と、それに伴う問題を整理する:

要因具体例問題
RAGによるコンテキスト注入検索結果5-10チャンクトークン数増大 → APIコスト増
Few-shot例の追加5-10個の例示コンテキスト消費 → 有効容量減
会話履歴の蓄積長い対話セッションレイテンシ増大 → UX悪化

Microsoft Researchのチームは、「LLMへの入力の多くは冗長であり、重要な情報を失わずに大幅に圧縮できる」という仮説から出発した。

プロンプト圧縮の分類

graph TD
    A[プロンプト圧縮手法] --> B[抽出型<br/>Extractive]
    A --> C[生成型<br/>Abstractive]
    A --> D[ソフトプロンプト型<br/>Soft Prompt]

    B --> B1[LLMLinguaシリーズ<br/>トークン選択・削除]
    B --> B2[Selective Context<br/>自己情報量ベース]
    C --> C1[要約ベース<br/>LLMによる要約]
    D --> D1[In-context Autoencoder<br/>埋め込みベース]

    style B1 fill:#e1f5fe

LLMLinguaシリーズは抽出型に分類される。元のトークンの部分集合を選択するため、新しい単語が追加される生成型と比較して忠実度が高い。

実装アーキテクチャ(Architecture)

LLMLingua v1: 粗粒度→細粒度の2段階圧縮

初代LLMLinguaは、因果言語モデル(GPT-2/LLaMA-7B等)のパープレキシティを用いた2段階圧縮を行う。

Stage 1: 粗粒度圧縮(Budget Controller)

プロンプトを「デモ例」「指示」「質問」等のセグメントに分割し、セグメント単位でパープレキシティを計算。予算制約内で低パープレキシティ(=冗長)なセグメントを優先的に削除する。

\[\text{Budget allocation: } b_i = \frac{\text{PPL}(s_i)}{\sum_{j} \text{PPL}(s_j)} \times B_{\text{total}}\]

ここで $s_i$ はセグメント $i$、$\text{PPL}(s_i)$ はそのパープレキシティ、$B_{\text{total}}$ は総トークン予算である。高パープレキシティのセグメントほど情報量が多いと判断し、多くの予算を割り当てる。

Stage 2: 細粒度圧縮(Token-Level Pruning)

各セグメント内で、トークンレベルのパープレキシティを計算し、閾値以下のトークンを削除する。

\[\text{Keep token } x_i \iff \text{PPL}(x_i | x_{<i}) > \tau\]

パープレキシティが閾値 $\tau$ を超えるトークン(=予測が難しい=情報量が多い)を保持する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# LLMLingua v1の概念的な実装
from llmlingua import PromptCompressor

compressor = PromptCompressor(
    model_name="gpt2",  # or "meta-llama/Llama-2-7b-hf"
    device_map="cuda",
)

# 2段階圧縮の実行
result = compressor.compress_prompt(
    context=["Document 1 content...", "Document 2 content..."],
    instruction="Answer the question based on the context.",
    question="What is the key finding?",
    target_token=500,  # 最大500トークンに圧縮
    condition_in_question="after",  # 質問を条件として使用
    reorder_context="sort",  # パープレキシティでソート
)

print(f"圧縮率: {result['rate']:.1%}")
print(f"圧縮結果: {result['compressed_prompt'][:200]}...")

性能: 最大20倍の圧縮で性能低下を最小限に抑制。

LongLLMLingua: 長文コンテキスト特化

長文コンテキスト(RAG等)での「Lost in the Middle」問題に対応した拡張版。

Key Innovation: Question-Aware Compression

通常のパープレキシティは質問に依存しない。LongLLMLinguaは質問を条件としたパープレキシティを使用し、質問に関連するトークンの保持率を向上させる:

\[\text{PPL}_{\text{qa}}(x_i) = \text{PPL}(x_i | x_{<i}, q)\]

ここで $q$ は質問テキストである。これにより、質問に直接関連しないが文脈上重要なトークンも適切に保持される。

結果: NaturalQuestionsベンチマークで、4倍圧縮時に元のプロンプトより17.1%精度向上。これは圧縮がノイズ除去として機能した結果と解釈される。

LLMLingua-2: トークン分類への転換

LLMLingua-2は、パープレキシティベースのアプローチを根本的に刷新した:

graph LR
    subgraph "LLMLingua v1"
        A[因果LM<br/>7B params] --> B[パープレキシティ計算<br/>一方向・逐次]
    end

    subgraph "LLMLingua-2"
        C[Transformerエンコーダ<br/>560M params] --> D[トークン分類<br/>双方向・並列]
    end

    A -.->|3-6x遅い| C
    B -.->|忠実度低い| D

技術的比較

項目LLMLingua v1LLMLingua-2
ベースモデルLLaMA-7B(因果LM)XLM-RoBERTa-large(エンコーダ)
パラメータ数7B560M
圧縮指標パープレキシティ(情報理論)GPT-4蒸留ラベル(学習ベース)
コンテキスト参照一方向(左→右)双方向
推論方式逐次(トークン毎)並列(全トークン同時)
圧縮速度1x3-6x
汎化性能タスク依存傾向タスク非依存

GSM8Kでの圧縮率 vs 精度

圧縮率LLMLingua v1精度LLMLingua-2精度
2x78.2%79.1%
5x72.5%76.3%
10x63.8%74.1%
14x77.8%

LLMLingua-2は14倍の圧縮でもGSM8K精度77.8%(元: 78.9%)を維持しており、極端な圧縮率でも安定した性能を示す。

パフォーマンス最適化(Performance)

End-to-End レイテンシ

プロンプト圧縮のEnd-to-Endレイテンシは3つの要素で構成される:

\[T_{\text{total}} = T_{\text{compress}} + T_{\text{inference}} + T_{\text{overhead}}\]
手法$T_{\text{compress}}$$T_{\text{inference}}$(圧縮後)$T_{\text{total}}$
圧縮なし0ms100ms(8Kトークン)100ms
LLMLingua v150ms40ms(3.2Kトークン)90ms
LLMLingua-210ms40ms(3.2Kトークン)50ms

LLMLingua-2は圧縮処理自体が高速(560Mモデル + 並列分類)なため、圧縮コストを含めてもEnd-to-Endで大幅な改善を実現する。

コスト削減効果

OpenAI GPT-4oを想定した月間コスト試算:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 月間コスト試算
daily_requests = 10000
avg_input_tokens = 8000
price_per_1k_input = 0.0025  # $/1K tokens

# 圧縮なし
monthly_cost_base = daily_requests * 30 * avg_input_tokens / 1000 * price_per_1k_input
# = $6,000/月

# LLMLingua-2(2.5倍圧縮)
compression_rate = 0.4
monthly_cost_compressed = monthly_cost_base * compression_rate
# = $2,400/月

# 月間削減額: $3,600(60%削減)

運用での学び(Production Lessons)

フレームワーク統合

LLMLinguaはLangChainとLlamaIndexの両方と統合されている:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# LangChain統合
from langchain.retrievers import ContextualCompressionRetriever
from langchain_community.document_compressors import LLMLinguaCompressor

compressor = LLMLinguaCompressor(
    model_name="microsoft/llmlingua-2-xlm-roberta-large-meetingbank",
    target_token=300,
)

compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=vector_store.as_retriever(search_kwargs={"k": 10}),
)

# k=10で取得 → 圧縮 → 重要トークンのみ残す
compressed_docs = compression_retriever.get_relevant_documents(query)
1
2
3
4
5
6
7
8
# LlamaIndex統合
from llama_index.core.postprocessor import LLMLinguaPostprocessor

node_postprocessor = LLMLinguaPostprocessor(
    model_name="microsoft/llmlingua-2-xlm-roberta-large-meetingbank",
    target_token=300,
    rank_method="longllmlingua",  # 質問考慮の圧縮
)

本番環境での注意点

  1. GPU vs CPU: XLM-RoBERTa-largeの推論はGPU推奨。CPUでは100-200ms、GPU(A100)では5-10ms程度
  2. バッチ処理: 複数プロンプトを同時に圧縮する場合、バッチサイズ8-16でGPU利用率を最適化
  3. モデルのウォームアップ: 初回推論は遅い(モデルロード含む)。サービス起動時にダミー入力でウォームアップを推奨
  4. 日本語対応: XLM-RoBERTaは多言語モデルだが、圧縮品質は英語で最も高い。日本語テキストの圧縮は精度低下のリスクがあり、ベンチマーク評価を推奨

モニタリング指標

本番環境では以下の指標を監視すべきである:

指標意味閾値
圧縮率入力トークン/出力トークン期待値±20%
End-to-Endレイテンシ圧縮+推論の合計時間p99 < 500ms
下流タスク精度圧縮後のLLM出力品質ベースラインの95%以上
圧縮モデルGPU利用率XLM-RoBERTaのGPU消費<30%(推論のみ)

学術研究との関連(Academic Connection)

LLMLinguaシリーズの学術的位置づけ:

会議論文主な貢献
EMNLP 2023LLMLinguaパープレキシティベースの粗粒度→細粒度圧縮
ACL 2024LongLLMLingua長文コンテキスト特化の質問条件付き圧縮
ACL 2024 FindingsLLMLingua-2GPT-4蒸留によるトークン分類アプローチ
ICLR ME-FoMo 2024LongLLMLinguaMemory-Efficient FoMoワークショップ発表

3本の論文が2年間で発表されており、Microsoft Researchの重点プロジェクトであることがわかる。

関連プロジェクト

  • MInference: 100万トークン推論の高速化(Sparse Attention活用)
  • In-context Autoencoder (ICAE): コンテキストをソフトプロンプトに圧縮
  • MELODI (DeepMind): 階層的メモリ圧縮でメモリ使用量8分の1

まとめと実践への示唆

LLMLinguaシリーズは、プロンプト圧縮という実用的課題に対する体系的なアプローチを提供している。

実務での導入戦略:

  1. 即日導入: pip install llmlingua → LangChain/LlamaIndexに組み込み → 2.5倍圧縮でコスト60%削減
  2. 段階的最適化: 圧縮率を0.5から0.3まで段階的に引き上げ、下流タスク精度をモニタリング
  3. ハイブリッド戦略: コード含有プロンプトは低圧縮(0.5)、テキストのみは高圧縮(0.3)と使い分け

Zenn記事の第1層(プロンプト圧縮)への直接適用: LLMLingua-2はZenn記事で紹介したプロンプト圧縮レイヤーの最も成熟した実装オプションである。LangChain/LlamaIndex統合が用意されているため、既存のRAGパイプラインへの組み込みが容易である。

参考文献

この投稿は CC BY 4.0 でライセンスされています。