Prompt Compression
プロンプト圧縮は、情報量の少ないトークンを削除したり、コンテキストを簡潔に符号化したりしてLLMの入力を短縮します。回答の質を保ちながら、コストとレイテンシを削減できます。
プロンプト圧縮は、回答に必要な情報を保持しながら大規模言語モデル(LLM)への入力を短縮します。これにより、使用するトークン数が減り、実行が速くなり、コンテキストウィンドウに収まりやすくなります。手法には、小型言語モデルで予測しやすい単語を削除するもの、長い履歴を要約するもの、文章全体を代替するコンパクトな学習済みトークンを作るものがあります。検索拡張生成(RAG)パイプラインで多数の検索文書を挿入する場合、各ステップで履歴が増えるAIエージェント、長い指示や例を含むアプリケーションなど、長いプロンプトを頻繁に送信する場面で圧縮の効果が高まります。プロバイダーは入力トークンごとに課金し、アテンションの計算量は入力長に応じて増加するため、プロンプトを半分に圧縮すると入力コストもおおむね半減し、推論レイテンシも短縮されます。
プロンプト圧縮の仕組み#
ハードプロンプト圧縮はテキストを短いテキストに変換するため、クローズドAPIモデルを含むあらゆるLLMが読み取れます。多くの手法は小型言語モデルで各トークンをスコアリングし、予測しやすい、つまり情報量の少ないトークンを削除します。Selective Contextはこの考え方を単語やフレーズに適用します。MicrosoftのLLMLinguaは、指示、例、質問ごとに異なる圧縮率を割り当てる予算コントローラーと、反復的なトークン単位のプルーニングを追加し、性能をほとんど損なわず最大20倍の圧縮を達成します。LLMLingua-2は、XLM-RoBERTaなどの双方向エンコーダーを使うトークン分類として圧縮を再構成します。大規模LLMから蒸留した圧縮例で学習するため、従来手法より3~6倍高速に動作し、圧縮率2~5倍でエンドツーエンドのレイテンシを1.6~2.9倍短縮します。一方、抽象的な手法では、モデルにコンテキストの要約を依頼します。より圧縮できますが、質問への回答に必要な詳細が失われる場合があります。
ソフトプロンプト圧縮は、テキストを少数の学習済み埋め込みに変換し、元のトークンの代わりにモデルへ読み込ませます。Gistトークンでは、LLaMA-7BとFLAN-T5-XXLを学習し、指示を少数の特殊トークンに圧縮することで、最大26倍の圧縮と最大40%のFLOP削減を達成します。これらの手法にはモデルの重みへのアクセスが必要なため、オープンモデルに適用されます。
トークン単位の圧縮の中核部分は、数行のPyTorchコードで実装できます。この例では、Hugging Face Transformersの1億2400万パラメーターGPT-2を使い、各トークンの自己情報量、つまりそれ以前のすべての情報を条件としたトークンの負の対数確率を計算し、より意外性の高い半分を残します。
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
prompt = (
"The quarterly maintenance report states that, as of the end of the quarter, a total of three conveyor "
"belts on line 4 were found to have worn bearings, and all of them were replaced on March 12 by the night shift."
)
ids = tokenizer(prompt, return_tensors="pt").input_ids[0]
# Self-information of each token, -log p(token | preceding tokens), under a small language model
with torch.no_grad():
logits = model(ids[None]).logits[0, :-1]
info = -logits.log_softmax(-1).gather(1, ids[1:, None]).squeeze(1)
# Keep the first token and the more surprising half of the rest, in their original order
keep = torch.cat([torch.tensor([True]), info > info.median()])
compressed = tokenizer.decode(ids[keep])
print(f"{len(ids)} -> {keep.sum().item()} tokens: {compressed}")出力は46 -> 23 tokens: The quarterly maintenance report states, a three convey on line 4 found worn bearings all replaced on March 12 by night shiftです。4号線、摩耗したベアリング、3月12日、夜勤などの事実は残り、「四半期末時点では」のような予測しやすい補足は消えます。「コンベヤーベルト」から残った断片「convey」は、トークン単位でプルーニングした場合によく見られる結果です。そのため、単語またはフレーズ全体をプルーニングする手法もあります。
画像の圧縮#
ビジョン言語モデルは各画像を数百の視覚トークンに変換しますが、その多くは重複しています。FastVは第2レイヤー後に画像トークンの半分をプルーニングし、性能を落とさずLLaVA-1.5-13BのFLOPを45%削減します。また、トークンマージもビジョントランスフォーマー内で同様の考え方を適用します。物体検出器も画像圧縮器として利用できます。Ultralytics YOLO26は写真をResults.summary()、つまり各物体のクラス名、信頼度、ボックス座標を含むリストに変換します。存在する物体と位置だけが必要なLLMパイプラインなら、数百から1,000を超えるトークンを要する画像の代わりに、物体ごとに数十トークンを送信できます。
プロンプト圧縮と関連手法の比較#
- プロンプトキャッシュ: 繰り返し使用するプロンプトのプレフィックスについてモデルが計算した状態を保存し、再計算を防ぎます。プロンプトの長さは変わりません。プロンプトの可変部分を圧縮し、固定部分をキャッシュすれば、両手法を効果的に組み合わせられます。
- KVキャッシュの圧縮: 生成中にモデル内部のキー・バリュー状態を削除するか、量子化します。プロンプト圧縮は、モデルに入力する前のテキストに適用します。
- プロンプトエンジニアリング: 人が明確で簡潔なプロンプトを手作業で作成します。圧縮は自動で行われ、検索文書のように人が編集しないコンテンツにも適用できます。
- コンテキストエンジニアリング: 各ステップでモデルのコンテキストに何を含めるかを決める、より広範な取り組みです。圧縮は検索やフィルタリングと並ぶ手段の1つです。
- プロンプトエンリッチメント: 検索または生成したコンテキストをプロンプトに追加します。多くの場合、パイプラインでは先にエンリッチメントを行い、その結果を圧縮します。
実際のアプリケーション#
- RAGパイプライン: 生成前に検索した文章を圧縮することで、予算内により多くの情報源を含め、質問に答える文にモデルの注意を集中させます。
- エージェントの履歴: コーディングエージェントや調査エージェントは、コンテキストがいっぱいになると履歴を圧縮し、古いツール出力ややり取りを要約に置き換えます。長いコンテキストに古い情報が蓄積すると、精度が低下するためです。
- 少数ショットプロンプト: 解答例が長く並ぶプロンプトは、圧縮に適しています。LLMLinguaの予算コントローラーは、まずパープレキシティに基づいて例全体を削除し、次に個々のトークンをプルーニングします。論文のデフォルト設定では、指示の85%と質問の90%を保持します。










