プレフィックス キャッシュを使用して推論速度を最適化する

プレフィックス キャッシングは、共有され繰り返し使用されるプロンプトのプレフィックス部分を処理する LLM の中間状態を保存して再利用することで、推論時間を短縮する機能です。 プレフィックス キャッシングを有効にするには、API リクエストで静的なプレフィックスと動的なサフィックスを分離するだけです。

現在、プレフィックス キャッシングはテキストのみの入力をサポートしています。プロンプトで画像を提供している場合は、この機能を使用しないでください。

プレフィックス キャッシングを実装するには、暗黙的または明示的な 2 つの方法があります。

プレフィックス キャッシングを暗黙的に使用する

プレフィックス キャッシングを有効にするには、次のコード スニペットに示すように、プロンプトの共有部分を promptPrefix フィールドに追加します。

Kotlin

val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"

val result = generativeModel.generateContent(
  generateContentRequest(TextPart(dynamicSuffix)) {
    promptPrefix = PromptPrefix(promptPrefix)
  }
)

Java

String promptPrefix = "Reverse the given sentence: ";
String dynamicSuffix = "Hello World";

GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(new TextPart(dynamicSuffix))
    .setPromptPrefix(new PromptPrefix(promptPrefix))
    .build())
    .get();

上記のスニペットでは、dynamicSuffix がメイン コンテンツとして渡され、promptPrefix が個別に提供されます。

推定されるパフォーマンスの向上

プレフィックス キャッシングなし

プレフィックス キャッシュ ヒットあり

(プレフィックスを初めて使用する場合はプレフィックス キャッシュ ミスが発生する可能性があります)

300 トークンの固定プレフィックスと 50 トークンの動的サフィックス プロンプトを使用する Google Pixel 9

0.82 秒

0.45 秒

1,000 トークンの固定プレフィックスと 100 トークンの動的 サフィックス プロンプトを使用する Google Pixel 9

2.11 秒

0.5 秒

ストレージに関する考慮事項

暗黙的なプレフィックス キャッシングを使用すると、キャッシュ ファイルがクライアント アプリケーションのプライベート ストレージに保存されるため、アプリのストレージ使用量が増加します。暗号化されたキャッシュ ファイルと、元のプレフィックス テキストなどの関連メタデータが保存されます。ストレージに関する次の考慮事項に留意してください。

  • キャッシュの数は、LRU(Least Recently Used)メカニズムによって管理されます。 キャッシュの合計最大量を超えると、最も使用されていないキャッシュが自動的に削除されます。
  • プロンプト キャッシュのサイズは、プレフィックスの長さによって異なります。
  • プレフィックス キャッシングで作成されたすべてのキャッシュをクリアするには、 generativeMode.clearImplicitCaches() メソッドを使用します。

明示的なキャッシュ管理を使用する

Prompt API には、キャッシュの作成、検索、使用、削除の方法をデベロッパーがより細かく制御できるように、明示的なキャッシュ管理メソッドが含まれています。 これらの手動操作は、システムの自動キャッシュ処理とは独立して実行されます。

この例では、明示的なキャッシュ管理を初期化して推論を実行する方法を示します。

Kotlin

val cacheName = "my_cache"
val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"

// Create a cache
val cacheRequest = createCachedContextRequest(cacheName, PromptPrefix(promptPrefix))
val cache = generativeModel.caches.create(cacheRequest)

// Run inference with the cache
val response = generativeModel.generateContent(
  generateContentRequest(TextPart(dynamicSuffix)) {
    cachedContextName = cache.name
  }
)

Java

String cacheName = "my_cache";
String promptPrefix = "Reverse the given sentence: ";
String dynamicSuffix = "Hello World";

// Create a cache
CachedContext cache = cachesFutures.create(
  new CreateCachedContextRequest.Builder(cacheName, new PromptPrefix(promptPrefix))
  .build())
  .get();

// Run inference with the cache
GenerateContentResponse response = generativeModelFutures.generateContent(
  new GenerateContentRequest.Builder(new TextPart(dynamicSuffix))
  .setCachedContextName(cache.getName())
  .build())
  .get();

この例では、generativeModel.caches を使用して、明示的に管理されるキャッシュのクエリ、取得、削除を行う方法を示します。

Kotlin

val cacheName = "my_cache"

// Query pre-created caches
for (cache in generativeModel.caches.list()) {
  // Do something with cache
}

// Get specific cache
val cache = generativeModel.caches.get(cacheName)

// Delete a pre-created cache
generativeModel.caches.delete(cacheName)

Java

String cacheName = "my_cache";

// Query pre-created caches
for (PrefixCache cache : cachesFutures.list().get()) {
  // Do something with cache
}

// Get specific cache
PrefixCache cache = cachesFutures.get(cacheName).get();

// Delete a pre-created cache
cachesFutures.delete(cacheName);