Inferenzgeschwindigkeit mit Präfix-Caching optimieren

Beim Präfix-Caching wird die Inferenzzeit verkürzt, indem der LLM-Zwischenzustand der Verarbeitung eines gemeinsamen und wiederkehrenden Prompt-Präfixteils gespeichert und wiederverwendet wird. Um das Präfix-Caching zu aktivieren, müssen Sie in Ihrer API-Anfrage nur das statische Präfix vom dynamischen Suffix trennen.

Das Präfix-Caching unterstützt derzeit nur Texteingaben. Sie sollten diese Funktion daher nicht verwenden, wenn Sie in Ihrem Prompt ein Bild angeben.

Es gibt zwei Möglichkeiten, das Präfix-Caching zu implementieren: implizit oder explizit:

Präfix-Caching implizit verwenden

Wenn Sie das Präfix-Caching aktivieren möchten, fügen Sie den gemeinsamen Teil des Prompts dem Feld promptPrefix hinzu, wie in den folgenden Code-Snippets gezeigt:

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();

Im vorherigen Snippet wird dynamicSuffix als Hauptinhalt übergeben und promptPrefix wird separat angegeben.

Geschätzte Leistungssteigerungen

Ohne Präfix-Caching

Mit Präfix-Cache-Treffer

(Ein Präfix-Cache-Fehler kann auftreten, wenn das Präfix zum ersten Mal verwendet wird)

Pixel 9 mit einem festen Präfix mit 300 Tokens und einem dynamischen Suffix Prompt mit 50 Tokens

0,82 Sekunden

0,45 Sekunden

Pixel 9 mit einem festen Präfix mit 1.000 Tokens und einem dynamischen Suffix-Prompt mit 100 Tokens

2,11 Sekunden

0,5 Sekunden

Hinweise zum Speicher

Beim impliziten Präfix-Caching werden Cache-Dateien im privaten Speicher der Clientanwendung gespeichert, was die Speichernutzung Ihrer App erhöht. Verschlüsselte Cache-Dateien und die zugehörigen Metadaten, einschließlich des ursprünglichen Präfixtexts, werden gespeichert. Beachten Sie die folgenden Hinweise zum Speicher:

  • Die Anzahl der Caches wird mit einem LRU-Mechanismus (Least Recently Used) verwaltet. Die am wenigsten verwendeten Caches werden automatisch gelöscht, wenn die maximale Gesamtmenge des Caches überschritten wird.
  • Die Größe des Prompt-Caches hängt von der Länge des Präfixes ab.
  • Verwenden Sie die generativeMode.clearImplicitCaches() Methode, um alle Caches zu löschen, die durch das Präfix-Caching erstellt wurden.

Explizite Cache-Verwaltung verwenden

Die Prompt API enthält explizite Cache-Verwaltungsmethoden, mit denen Entwickler genauer steuern können, wie Caches erstellt, durchsucht, verwendet und entfernt werden. Diese manuellen Vorgänge werden unabhängig von der automatischen Cache-Verwaltung des Systems ausgeführt.

In diesem Beispiel wird veranschaulicht, wie Sie die explizite Cache-Verwaltung initialisieren und eine Inferenz durchführen:

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();

In diesem Beispiel wird gezeigt, wie Sie explizit verwaltete Caches mit generativeModel.caches abfragen, abrufen und löschen:

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);