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

プレフィックス キャッシングは、共有され繰り返し使用されるプロンプト プレフィックス部分の処理の中間 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);