8月3日、Iván Palomares Carrascosaが「A Guide to Saving Token Usage with Multi-Agent AI」と題した記事を公開した。注目すべきは、意味的に類似したクエリを検出してLLMへのリクエストそのものをゼロにするセマンティックキャッシングだ。マルチエージェントAIのコスト肥大化に対し、アーキテクチャを大幅に変えることなく効く4つの実践的戦略を紹介している。
複数のAIエージェントを連携させる構成は、複雑なワークフローを自動化できる一方で、トークン消費量が雪だるま式に増えるという問題を抱えている。システムプロンプト、メモリログ、ツール仕様——これらすべてがトークンとしてカウントされ、レイテンシの増大とAPIコストの膨張を招く。
著者はこの問題に対して、アーキテクチャを複雑化せずにコストを抑える4つの戦略を紹介している。
1. セマンティックキャッシング——最も即効性の高い手法
4つの戦略の中でも特にエンジニアの関心を引くのが、セマンティックキャッシングだ。
従来のキャッシュは文字列の完全一致を前提とする。しかしセマンティックキャッシングでは、テキストを埋め込みベクトル(embedding)に変換し、過去のクエリとのコサイン類似度を計算する。「ルーターをリセットする方法は?」と「WiFiボックスを再起動する手順は?」は文字列としては異なるが、意味的には同一の質問だ。類似度が閾値(記事のサンプルコードでは0.90)を超えれば、LLMを呼び出さずにキャッシュから回答を返す。
これはLLMへのリクエストそのものをゼロにできるため、トークン削減効果が最大になる。
2. モデルルーティング——タスクの複雑さで使うモデルを振り分ける
すべてのタスクにGPT-4クラスの大型モデルを使う必要はない。タスクの複雑度に応じてモデルを使い分けるのが「タスクエスカレーション(Task Escalation)」の考え方だ。
- シンプルなタスク(テキスト要約、データ整形、意図分類)→ ローカルで動く軽量モデル(コスト:無料〜格安)
- 複雑なタスク(多段階の推論、複数エージェントの統合)→ 大型モデル
アーキテクチャにルーティング層を設けることで、重いモデルの出番を必要最小限に絞れる。
セマンティックキャッシング+モデルルーティングの実装例
記事では、この2つを組み合わせたPythonのサンプルコードが示されている。埋め込みモデルにはsentence-transformersのall-MiniLM-L6-v2を使用しており、追加費用なしでローカル実行できる。
import numpy as np
from sentence_transformers import SentenceTransformer
embedder = SentenceTransformer('all-MiniLM-L6-v2')
semantic_cache = {}
SIMILARITY_THRESHOLD = 0.90
def cosine_similarity(vec1, vec2):
return np.dot(vec1, vec2) / (np.linalg.norm(vec1) * np.linalg.norm(vec2))
def route_and_respond(user_query):
query_vector = embedder.encode(user_query)
# セマンティックキャッシュの確認
for cached_vector, past_response in semantic_cache.values():
if cosine_similarity(query_vector, cached_vector) >= SIMILARITY_THRESHOLD:
return f"[Served from Cache] {past_response}"
# タスク複雑度によるモデルルーティング
if "summarize" in user_query.lower() or len(user_query) < 100:
response = call_free_local_agent(user_query)
else:
response = call_heavy_reasoning_agent(user_query)
semantic_cache[user_query] = (query_vector, response)
return response
call_free_local_agentとcall_heavy_reasoning_agentはコード中で呼び出されている関数だが、サンプル内では実装が省略されている。前者はGroq経由で無料公開されているモデルへのリクエストに、後者はOpenAIやAnthropicの大型モデルAPIへの呼び出しにそれぞれ差し替えることで、実際の推論まで動かせる、と著者は補足している。
また、ルーティングの判定ロジック(summarizeキーワードの有無、または100文字未満)は説明を優先したシンプルな実装だ。実運用では、クエリの意図分類に専用の軽量分類モデルを挟む、あるいは文字数の閾値をユースケースに合わせて調整するなど、より堅牢な設計が必要になる場面も多いだろう。
残り2つの戦略
プレフィックスキャッシング(静的命令のキャッシュ)
LLMは毎ターン同じシステムプロンプトを再読み込みする。プレフィックスキャッシングはKey-Valueペアとして静的な命令をキャッシュし、モデルが毎回全文を処理しなくて済む仕組みだ。AnthropicのClaudeやOpenAIのAPIでも対応が進んでいる機能で、長いシステムプロンプトを使う構成ほど恩恵が大きい。
ジャストインタイムツーリング(遅延ロード)
エージェントが利用可能なすべてのツール仕様をコンテキストウィンドウに詰め込む設計は、トークンの無駄遣いになる。必要なタイミングで必要なツールの詳細だけを取得する「遅延ロード」方式にすることで、プロンプトのノイズを減らせる。
まとめ
4つの戦略を整理すると以下のとおりだ。
| 戦略 | 主な効果 |
|---|---|
| プレフィックスキャッシング | システムプロンプトの再処理コスト削減 |
| セマンティックキャッシング | 類似クエリでLLM呼び出しを丸ごと省略 |
| ジャストインタイムツーリング | コンテキストウィンドウのノイズ削減 |
| タスクエスカレーション | 重いモデルの使用頻度を最小化 |
いずれもアーキテクチャの大幅な変更を要さず、既存のマルチエージェント構成に組み込みやすい。コスト削減の観点では、まずセマンティックキャッシングとモデルルーティングの組み合わせから着手し、そこで得た削減効果を見ながらプレフィックスキャッシングやジャストインタイムツーリングを追加していくのが現実的な進め方だろう。
詳細はA Guide to Saving Token Usage with Multi-Agent AIを参照していただきたい。