エージェント型AIシステムは長らくプロトタイプの域を出ないことが多かったが、大規模言語モデル(LLM)を中心とする技術の進歩によって本番環境への導入が急速に進んでいる。こうしたシステムが実用化されるのに伴い、避けて通れないのがAPIコストの上昇と、時には許容できないほど大きなレイテンシの問題だ。自律エージェントは、計画、アクションの実行、その結果の振り返りを「LLMへの反復呼び出し」で行うため、基盤となるインフラを最適化することは性能向上と持続可能性の両面で欠かせない。
本稿では、この問題に対処する2つの戦略、すなわちプロンプトキャッシングとファインチューニングを対比しながら解説し、場面に応じて組み合わせるための判断基準を示す。
まずプロンプトキャッシングは、以前にモデルと行ったやり取りの情報を再利用する仕組みである。具体的には、過去に送ったプロンプトの出力そのものを保存するか、モデル内部の注意状態、いわゆるKVキャッシュを保存する。これにより、エージェントが以前とほぼ同じプロンプトを送ったときには、ゼロから計算をやり直すことなく保存済みデータを参照して応答を生成できる。利点は明白で、応答が生成され始めるまでの時間であるTime to First Token(TTFT)を大幅に削減でき、大部分が反復的なリクエストの場合はコストをほぼゼロに近づけられる。
記事中の簡略化されたPython実装は、この仕組みを分かりやすく示している。diskcacheを使ってプロンプトをハッシュ化し、キャッシュに存在すればその結果を即座に返す。初回はキャッシュミスになるため通常の待ち時間とコストがかかるが、2回目以降はキャッシュヒットとなり、指定した有効期限の間は実質ゼロコストで同じ応答を受け取れる。実モデルの代わりにモックAPIを使用した例だが、プロンプトキャッシングの本質をうまく表現している。
一方、ファインチューニングはプロンプト側の工夫ではなく、モデルの重み自体を更新する方法だ。特定のエージェントやユーザーの振る舞い、出力フォーマット、専門的な知識などを学習させることで、毎回大量の指示や例をプロンプトに埋め込む必要がなくなる。すべてのパラメータを再訓練するとコストは大きくなるが、現在はParameter-Efficient Fine-Tuning(PEFT)と呼ばれる手法が広く使われており、中でもLoRA(Low-Rank Adaptation)は特に普及している。
例えば、Hugging FaceのTransformersとPEFTライブラリを使用し、TinyLlama-1.1B-Chat-v1.0にLoRAを適用したケースを考えよう。実際に学習されるパラメータは1,126,400個で、全体の1,101,174,784個のわずか0.1023%に過ぎない。つまり、コンピュートコストを抑えたまま、必要な知識や振る舞いだけをモデルに追加できる。このようにLoRAは完全な再学習と比較してはるかに効率的であるため、本番エージェントのカスタマイズに適している。
では、コストとレイテンシを最適化する際に、どちらの戦略を選べばよいだろうか。答えはデータの性質と、システムに求められる振る舞いに依存する。まず、プロンプトキャッシングを重視すべきケースは、巨大なシステムプロンプトを持っている場合、RAG利用のための静的ドキュメントベースや、エージェントが繰り返し要求される標準作業手順がある場合である。それらをプロンプトのプリフィックスとしてキャッシュすれば、トークンコストを大幅に節約できる。また、カスタマーサポートのようにほぼ同じ質問が日常的に発生するアプリケーションでも効果が高く、TTFTや直接的なトークン課金コストを劇的に下げたい場合に最適な選択肢となる。
これに対し、ファインチューニングが適しているのは、厳格なJSONやSQLのような出力フォーマットが要求される場合だ。この方法なら、出力を整えるために毎回大量のfew-shot例を送る必要がなくなる。さらに、モデルに特定のペルソナや文体を定着させたいとき、プロンプト内で常に指示を与え続ける代わりにファインチューニングで表現を学習させればよい。加えて、リクエストごとに必要なコンテキストウインドウを小さくできるため、繰り返しのLLM呼び出しをより高速かつ安価にできるという利点もある。
より堅牢で、現在のベストプラクティスに沿ったアーキテクチャを実現したいのなら、両者をハイブリッドで使うことも有効だ。まず小型でオープンなモデルをファインチューニングし、その後、エージェントのシステム指示や内部的なスクラッチパッドをプロンプトキャッシュに載せる。そうすれば、エージェントが行動と思考を繰り返すループの中で、常に最新のトークンだけを追加計算すればよくなる。
まとめると、プロンプトキャッシングは冗長なコンテキストの繰り返し処理によって生じるコストを削減する優れた手段であり、ファインチューニングは反復的な振る舞いをモデルに定着させる役割を担う。どちらか一方だけに依存するのではなく、両者をどう組み合わせるかを理解することが、高性能で持続可能なエージェントAIシステムへの近道である。