LongLLMLinguaとは?長文プロンプトを圧縮してLLMの精度・速度・コストを同時に改善する技術

LongLLMLinguaは、質問に関係する情報を残しながら長文プロンプトを段階的に圧縮し、LLMの長文処理を安く速くしつつ精度低下も抑える技術です。RAGや長文QA、要約で効く仕組みと実務での使い道を解説します。

参考文献

LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression

Huiqiang Jiang, Qianhui Wu, Xufang Luo, Dongsheng Li, Chin-Yew Lin, Yuqing Yang, Lili Qiu

論文を見る

今回の論文

今回取り上げるのは、Huiqiang Jiang、Qianhui Wu、Xufang Luo、Dongsheng Li、Chin-Yew Lin、Yuqing Yang、Lili Qiu による論文「LongLLMLingua: Accelerating and Enhancing LLMs in Long Context Scenarios via Prompt Compression」です。初出は 2023 年 10 月 10 日の arXiv で、ACL 2024 採択論文でもあります。公開元は arXiv、研究分野は長文コンテキスト処理、プロンプト圧縮、LLM 推論最適化です。URL は https://doi.org/10.48550/arXiv.2310.06839 です。

この論文を選んだ理由は、RAG、長文要約、エージェント、コード補完のように「入力が長くなりがち」な実務課題にそのまま刺さるからです。長文対応というとコンテキスト長拡張に目が向きがちですが、この論文は「全部読む」のではなく「重要な部分だけをうまく残す」ことで、精度とコストを両立させようとしている点が実用的です。

どんな技術か

LongLLMLingua は、長いプロンプトをただ短くする技術ではありません。質問に関係する情報を優先的に残し、不要なノイズを削ることで、LLM が長文の中から必要な情報を見つけやすくするプロンプト圧縮技術です。

ベースになっているのは LLMLingua という既存の圧縮手法ですが、LongLLMLingua では長文コンテキスト向けに 4 つの工夫が加わっています。具体的には、質問を見ながら重要文書を選ぶ粗い圧縮、文書内の重要トークンを残す細かい圧縮、重要文書ほど多めに残す動的な圧縮率、そして削りすぎて壊れた固有名詞や数値を回答後に復元する仕組みです。

つまり LongLLMLingua は、「長文を短くする」よりも「LLM が読み取りやすい形に再配置しつつ圧縮する」技術だと捉えるとわかりやすいです。これにより、API コストやレイテンシを下げながら、長文で起きやすい性能劣化まで改善できる可能性があります。

課題

長文コンテキストを扱う LLM には、主に 3 つの難しさがあります。1 つ目は単純に入力トークン数が多く、計算コストと API 料金が重いことです。2 つ目は入力が長いほど応答開始までの待ち時間が増え、体感速度が悪くなることです。3 つ目は、長くすればするほど性能が上がるとは限らず、むしろノイズが増えて必要情報を取り逃しやすくなることです。

特に難しいのは、「重要情報が少ししか含まれていない長文」です。RAG の検索結果 20 件、長いチャット履歴、コードベース断片、社内ドキュメント群などでは、答えに必要な部分は全体の一部にすぎません。それでも通常は全文を LLM に渡すため、関係ない情報まで大量に混ざります。するとモデルは重要な箇所を見失いやすくなります。

既存手法にも限界があります。単純な検索ベースの圧縮は、文書レベルでは関連度が高そうでも、質問に効く細かい記述を落としやすいです。逆に、質問を見ずに情報量だけでトークンを削る圧縮は、エントロピー的には目立たないが回答には必要な語を消してしまうことがあります。長文で本当に欲しいのは、「質問に効く情報を高密度で残す圧縮」です。

この課題を解く必要があるのは、実際の AI システムがどんどん長文化しているからです。RAG は複数文書を束ねますし、エージェントはツール実行ログやメモリを抱えます。コード支援や要約も入力が長くなりがちです。長文をそのまま投げる設計だけでは、コストも品質もスケールしにくくなります。

用語解説

プロンプト圧縮
LLM に渡す入力から重要度の低い部分を削り、短い入力へ変換する手法です。この論文では単なる短縮ではなく、質問に関係する情報密度を上げることが重要な狙いです。
Perplexity(パープレキシティ)
言語モデルが次のトークンをどれだけ予測しにくいかを表す指標です。LLMLingua 系では、小さな言語モデルで各トークンや文書の重要度を見積もる基礎として使われます。
Contrastive Perplexity
質問を条件に入れたときと入れないときで、あるトークンの予測しにくさがどれだけ変わるかを見る考え方です。この差分を使うことで、質問と特に強く結びつくトークンを見つけやすくなります。
Lost in the Middle
長文入力の真ん中付近にある重要情報を LLM が拾いにくい現象です。LongLLMLingua は文書並べ替えで重要情報を端に寄せ、この問題を緩和しようとしています。
Subsequence Recovery
圧縮で欠けたり壊れたりした固有名詞や数値を、元のプロンプトとの部分列関係を使って回答後に復元する後処理です。事実系 QA で特に重要な工夫です。

技術の仕組み

LongLLMLingua の中核は、長文をいきなりトークン単位で削るのではなく、文書単位とトークン単位の 2 段階で圧縮することです。そのうえで、質問との関係を両段階に持ち込んでいるのがポイントです。

基本アイデア

論文の出発点は、長文プロンプトの問題は「長いこと」そのものではなく、「質問に関係ない情報が多く、重要情報が埋もれること」だという見立てです。そこで LongLLMLingua は、小さな言語モデルを使って、質問に効く文書とトークンを優先的に残します。

処理は大まかに、文書選別、文書並べ替え、トークン圧縮、回答後復元の 4 段階です。単なる前処理ではありますが、質問との関係をかなり細かく見ながら圧縮するため、検索と要約の中間のような役割を持っています。

モデル構造

LongLLMLingua 自体は新しい大規模モデルを学習する論文ではなく、既存のターゲット LLM の前段に入る圧縮システムです。ターゲット LLM として論文では GPT-3.5-Turbo と LongChat-13B-16k を使い、圧縮側の小型モデルとして LLaMA-2-7B-Chat を使っています。

重要なのは、小型モデルが「代わりに答える」のではなく、「どこを残すべきかを判断する」役割を担うことです。つまり、重いモデルの前に軽いモデルを置いて、入力の質を整える構成です。実務でも、メイン LLM の前に前処理レイヤーを置く設計として理解しやすいです。

質問を見ながら文書を選ぶ粗粒度圧縮

最初の段階では、複数文書のうちどれを残すかを決めます。通常の LLMLingua は文書そのものの perplexity を見て重要度を測りますが、LongLLMLingua はそれでは不十分だと考えます。長文 QA では、文書全体の情報量が多くても質問には関係ないことがよくあるからです。

そこで論文は、「その文書を読んだとき、質問文がどれだけ自然に説明できるか」に近い観点で関連度を測ります。具体的には、質問を条件にした文書重要度を計算し、回答に効きそうな文書を優先して残します。これにより、単なる文書検索よりも質問依存の細かい関連性を拾いやすくしています。

質問を見ながらトークンを削る細粒度圧縮

文書を選んだ後は、その中のどのトークンを残すかを決めます。ここで効いてくるのが contrastive perplexity です。質問を条件にしたときに予測しにくさが大きく変わるトークンほど、質問に関連する可能性が高いとみなします。

この発想の良いところは、単に珍しい語を残すのではなく、「質問があるからこそ重要になる語」を残そうとする点です。たとえば年号、人物名、関係する属性語、比較対象などは、質問付きで見ると重要度が上がりやすくなります。長文 QA や RAG ではかなり筋の良い考え方です。

文書の順番も最適化する

この論文が面白いのは、圧縮だけでなく並べ替えまで入れていることです。著者らは、LLM が長文の中央付近にある重要情報を拾いにくいことを前提に、重要度の高い文書を前後の目立つ位置へ再配置します。

これは検索後処理としても応用しやすい考え方です。検索結果をスコア順にそのまま詰めるのではなく、モデルが読み取りやすい位置に置き直すだけでも、長文性能が変わりうるという示唆があります。

圧縮率を一律にしない

通常の圧縮だと、残した文書に同じ比率で削減をかけがちです。しかし LongLLMLingua では、質問により近い文書ほど多めの予算を与え、関連度が低い文書ほど強く圧縮します。論文では線形スケジューラで動的に予算配分しています。

この工夫は実務でも重要です。検索で 10 件取ってきたとしても、1 位と 10 位を同じ密度で残す必要はありません。関連度スコアをそのまま token budget に変換する発想は、RAG パイプラインへそのまま移植しやすいです。

回答後に壊れた文字列を復元する

トークン圧縮の弱点は、固有名詞や数値が中途半端に削れて壊れることです。論文では例として「2009」が「209」になったり、人名の一部だけが残ったりする問題を挙げています。これは事実確認系タスクでは致命的です。

そこで LongLLMLingua は、LLM が返した回答と圧縮済みプロンプト、元プロンプトの部分列関係をたどって、壊れた表現を元の文脈から復元します。圧縮前にすべてを残すのではなく、後処理で正しさを補う設計になっています。

実験と結果

この論文では、「本当に安くなるのか」だけでなく、「圧縮するとむしろ精度が上がるのか」を重点的に検証しています。長文のノイズを減らせば性能が上がるという仮説を、複数のベンチマークで確かめています。

何を検証したのか

主に検証しているのは次の 3 点です。1 つ目は、長文 QA や長文理解ベンチマークで元プロンプトより高い性能を出せるかです。2 つ目は、同時に入力トークン数とレイテンシをどこまで減らせるかです。3 つ目は、提案した各部品が本当に効いているかです。

どんなデータセットや評価指標を使ったのか

評価には 3 つの軸があります。NaturalQuestions では、1 問に 20 文書を含む multi-document QA を使い、正解文書の位置を 1 番目、5 番目、10 番目、15 番目、20 番目にずらして accuracy を測っています。これは検索付き QA や RAG にかなり近い設定です。

LongBench では、single-document QA、multi-document QA、要約、few-shot、合成タスク、コード補完の 6 系統 16 データセットを英語部分で評価しています。ZeroSCROLLS では要約、QA、感情分類、並べ替えを含む 10 データセットを評価しています。論文は提供スクリプトの指標をそのまま使っています。

NaturalQuestions では何が起きたのか

NaturalQuestions の結果はかなり示唆的です。4x 圧縮相当の設定で、正解文書が 10 番目にある難しいケースでは、元プロンプトの GPT-3.5-Turbo が 54.1 だったのに対し、LongLLMLingua は 71.2 を出しています。論文本文では、この差を 17.1 ポイントの改善として説明しています。

しかもこのとき入力トークン数は 2,946 から 748 まで減っています。つまり、約 4 分の 1 の入力で、むしろ精度が上がっています。単純な retrieval ベースや既存の LLMLingua ではここまで伸びておらず、質問依存の圧縮が効いていることがわかります。

もう 1 つ重要なのは、文書並べ替えの効果です。LongLLMLingua は reordering を入れた設定で GPT-3.5-Turbo 側の成績をさらに押し上げており、重要情報を中央から端へ寄せる設計が有効だと示しています。

LongBench と ZeroSCROLLS ではどうだったか

LongBench でも、圧縮して終わりではなく、多くのタスクで元プロンプト以上の平均性能を出しています。たとえば 2,000 tokens 制約では、LongLLMLingua の平均は 48.0、元プロンプトは 44.0 でした。single-document QA、multi-document QA、few-shot、コード補完などで特に強く、長文のノイズ削減が効いていることが見て取れます。

ZeroSCROLLS では、2,000 tokens 制約で LongLLMLingua が平均 32.5 を出し、元プロンプトの 32.5 と同等でした。入力は 9,788 tokens から 1,753 tokens まで減っているので、ほぼ同じ性能を大幅に安い入力で再現した形です。少なくとも「圧縮すると必ず精度が落ちる」という見方には反する結果です。

レイテンシはどれだけ減ったのか

論文は LongBench の平均 10k tokens 前後の入力でレイテンシも測っています。エンドツーエンドでは、圧縮なし 15.6 秒に対して、LongLLMLingua は 2x 圧縮で 11.4 秒、5x で 6.3 秒、10x で 4.1 秒でした。速度比で見ると 1.4 倍から 3.8 倍の高速化です。

ここで重要なのは、圧縮自体にもコストがあるのに、それを含めた end-to-end で速くなっていることです。前処理を入れると複雑になりますが、長文入力ではその前処理コストを上回る API 側の削減が得られることを示しています。

結果から何が言えるのか

この結果から言えるのは、長文処理では「より長いコンテキストを与える」ことよりも、「質問に効く情報密度を上げる」ことのほうが重要な場面があるということです。LongLLMLingua はそのための具体策として、検索、並べ替え、圧縮、復元を一つの流れにまとめています。

また、圧縮が効くのは QA だけではありません。LongBench の結果を見ると、few-shot やコード補完のように、文脈の中から必要なパターンを拾うタスクでも利点があります。これは長い履歴やドキュメントを抱える開発支援系プロダクトにも関係してきます。

何に使える?

LongLLMLingua は、長文を扱う多くの LLM アプリでそのまま応用しやすい技術です。特に、検索で文書を大量に集める構成や、長い履歴を抱える構成と相性が良いです。

RAG の前処理

もっとも直接的なのは RAG です。検索で 10 件から 30 件の文書を集めると、そのまま渡すには長すぎることが多いです。LongLLMLingua の考え方を使えば、質問に効く文書へ多めの token budget を配り、重要文だけを高密度で残せます。単なる top-k retrieval よりも、検索後の詰め込み方を改善できます。

長いチャット履歴を使うエージェント

エージェントは会話履歴、ツールログ、観測結果、メモリなどで文脈が肥大化しやすいです。そのまま全部入れると遅く高くなります。LongLLMLingua 的な圧縮を使えば、現在のユーザー依頼に関係する履歴だけを濃く残し、周辺情報は薄くする設計ができます。

コード補完やコードレビュー支援

論文の LongBench 結果にはコード補完も含まれています。複数ファイルや長い関数定義を与えるコード支援では、実際に必要なのは関連する定義、直近の呼び出し、インターフェース、エラーメッセージなどです。質問依存の圧縮は、巨大なコード文脈をそのまま渡すより効率的な可能性があります。

長文要約やレポート生成

長い議事録や報告書から要点をまとめる用途でも、まず重要区間を圧縮してから本番モデルへ渡す構成が考えられます。要約自体に別の目的文があるなら、その目的を質問として見立てることで、よりタスク依存の前処理にできます。

API コスト最適化

この論文の実務的な価値は、性能改善だけではなく料金削減にもあります。入力トークン課金のある API では、圧縮そのものがそのまま粗利改善につながります。とくに長文 RAG や社内検索のように利用回数が多いプロダクトでは、前処理コストを払っても全体最適になる余地があります。

開発や事業へのヒント

LongLLMLingua から得られるヒントは、長文対応を「モデル性能の問題」だけで片付けないことです。前処理レイヤーを賢く設計するだけでも、品質とコストの両方を大きく動かせます。

AI アプリを作るならどこに応用できそうか

自分で AI アプリを作るなら、まず RAG パイプラインの retrieval 後に入れる価値があります。検索結果をそのまま連結するのではなく、質問依存で再スコアし、重要文書だけ低圧縮、周辺文書は高圧縮にする構成は実装しやすいです。論文どおりの contrastive perplexity までやらなくても、考え方だけでも効果が見込めます。

既存サービスの改善に使えそうな考え方

既存サービスでも、重要情報を前後に寄せる reordering は比較的導入しやすいです。これは検索順位最適化の話ではなく、LLM に読ませる順番最適化です。長い履歴や文書束を投げるプロダクトであれば、圧縮をしなくても並び替えだけで改善する可能性があります。

小規模プロダクトでも活かせるか

小規模プロダクトでも活かせます。全部を再現しなくても、関連度に応じて token budget を変える発想は十分使えます。たとえば上位 3 件は原文に近く残し、4 件目以降は要約で渡す、といった実装でも本質は近いです。

今後注目しておくべき技術の方向性

今後注目したいのは、検索、圧縮、並べ替え、復元が一体化した長文推論スタックです。長文処理の改善は、コンテキスト長の拡張だけでは足りません。どの情報を残し、どの順番で置き、どこを削っても安全かという前段の最適化が、今後の RAG やエージェント品質を左右しそうです。

限界

LongLLMLingua にも限界はあります。まず、圧縮前処理のための小型モデルが別途必要で、完全に無料ではありません。入力が短いケースでは、圧縮器を回すオーバーヘッドのほうが無駄になる可能性があります。

また、質問依存の圧縮は、質問が曖昧だったり、ユーザーの真意が途中で変わったりするケースに弱いかもしれません。最初の質問に対して重要でないと判断した情報を削るため、後から別観点で必要になっても戻せないことがあります。

実装面でも、文書単位の選別、トークン単位圧縮、並べ替え、回答後復元まで含めるとパイプラインはそれなりに複雑です。特に subsequence recovery は、事実系 QA では有効ですが、自由生成タスクでは扱い方に注意が必要です。

さらに、評価は主に GPT-3.5-Turbo と LongChat-13B-16k で行われています。より新しい長文特化モデルや、もともと長文に強いモデルに対して、同じ改善幅が出るかは追加検証が必要です。論文の結論をそのまま現行モデルへ当てはめるのではなく、自分のワークロードで測る前提で見るべきです。

よくある質問

Q. LongLLMLingua は普通の RAG と何が違うのですか?

A. 普通の RAG は主に「どの文書を取ってくるか」に集中しますが、LongLLMLingua はその後の「取ってきた文書をどう詰めるか」まで扱います。文書選別だけでなく、文書内のトークン圧縮や順番最適化まで含む点が違います。

Q. 既存の LLM API を使っていても導入できますか?

A. はい、考え方としては導入しやすいです。LongLLMLingua 自体はターゲット LLM の前段に置く前処理なので、API を直接改造する必要はありません。ただし、圧縮器用の小型モデルや前処理ロジックは別途実装する必要があります。

Q. 圧縮すると重要な情報を落としてしまいませんか?

A. そのリスクはあります。だからこそ論文では質問依存の重要度推定と subsequence recovery を入れています。特に固有名詞や数値が重要なタスクでは、単純圧縮より復元込みで考えるほうが安全です。

Q. どんなユースケースで特に効果が出やすいですか?

A. 複数文書 QA、長い検索結果を使う RAG、長文履歴を持つエージェント、コード支援のように、入力は長いが本当に重要な情報は一部だけというケースです。逆に短い問い合わせや単一文書タスクでは利得が小さい可能性があります。

Q. この論文から実務で一番学べることは何ですか?

A. 長文対応は「より長いコンテキストを持つモデルを選ぶ」だけではなく、「LLM に渡す前に情報密度を整える」ことで改善できるという点です。RAG の質改善を retrieval 精度だけで考えない、という視点が実務的には大きいです。

今日の学び

この論文は、長文コンテキストで LLM のコストが上がり、遅くなり、しかも重要情報を見失いやすいという課題を扱いました。そこに対して LongLLMLingua は、質問依存の粗粒度・細粒度圧縮、文書並べ替え、回答後復元を組み合わせることで、必要情報の密度を上げながら入力を小さくする方法を示しました。

そこから得られるヒントは、AI アプリの性能改善はモデル本体だけでなく、前段の情報設計でも大きく変わるということです。特に RAG やエージェントでは、「何を取るか」だけでなく「どう残すか、どう並べるか」が差になりそうです。

関連記事

推論最適化

Self-Consistencyとは?複数の推論経路から最終回答を安定化するLLM推論手法

Self-Consistencyは、LLMに複数の推論経路を生成させ、最も一貫した答えを採用する推論時手法です。Chain-of-Thoughtの弱点、仕組み、実験結果、実務での使い道を日本語で解説します。

参照論文:Self-Consistency Improves Chain of Thought Reasoning in Language Models

推論最適化

Token Mergingとは?Vision Transformerを高速化するトークン統合の仕組みと使い道

Token Merging(ToMe)は、Vision Transformerの似たトークンを段階的に統合し、再学習なしでも推論を大きく高速化できる手法です。なぜトークン削減が効くのか、どのように精度低下を抑えるのか、画像・動画・音声や生成AIへどう応用できるのかを解説します。

参照論文:Token Merging: Your ViT But Faster

推論最適化

Mixture-of-Depthsとは?Transformerの計算量を減らしつつ性能を保つ動的トークンルーティングを解説

Mixture-of-Depthsは、Transformerの各層で重要なトークンだけに重い計算を回し、他のトークンは残差経路でスキップさせる技術です。静的な計算グラフを保ちながら計算配分を動的化する仕組みと、推論高速化やモデル設計への使い道を整理します。

参照論文:Mixture-of-Depths: Dynamically allocating compute in transformer-based language models