Präfix-Caching ist eine Funktion, die die Inferenzzeit verkürzt, indem der Zwischenzustand des LLM bei 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 Zwischenspeichern von Präfixen unterstützt derzeit nur Texteingaben. Sie sollten diese Funktion also nicht verwenden, wenn Sie in Ihrem Prompt ein Bild angeben.
Es gibt zwei Ansätze für die Implementierung des Präfix-Caching: implizit oder explizit:
- Beim impliziten Präfix-Caching muss die Anwendung nur einen gemeinsamen Teil des Prompts definieren.
- Mit Explicit prefix caching (Explizites Präfix-Caching) haben Anwendungen mehr Kontrolle über Caches, einschließlich des Erstellens, Abfragens und Löschens von Caches.
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 bereitgestellt.
Geschätzte Leistungssteigerung
Ohne Präfix-Caching |
Mit dem Präfix „cache-hit“ (Ein Cache-Fehler für das Präfix kann auftreten, wenn das Präfix zum ersten Mal verwendet wird.) |
|
Pixel 9 mit einem festen Präfix von 300 Tokens und einem dynamischen Suffix von 50 Tokens Prompt |
0,82 Sekunden |
0,45 Sekunden |
Pixel 9 mit einem festen Präfix von 1.000 Tokens und einem dynamischen Suffix-Prompt von 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 zur Speicherung:
- Die Anzahl der Caches wird durch einen LRU-Mechanismus (Least Recently Used) verwaltet. Die am wenigsten verwendeten Caches werden automatisch gelöscht, wenn die maximale Gesamtmenge an Cache überschritten wird.
- Die Größe des Prompt-Cache hängt von der Länge des Präfix ab.
Wenn Sie alle Caches löschen möchten, die durch das Präfix-Caching erstellt wurden, verwenden Sie die Methode
generativeMode.clearImplicitCaches().
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 Cacheverwaltung des Systems ausgeführt.
In diesem Beispiel wird gezeigt, wie Sie die explizite Cache-Verwaltung initialisieren und die Inferenz ausfü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);