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 Präfix-Caching 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 explizitem Präfix-Caching können Anwendungen Caches besser verwalten, z. B. Caches erstellen, abfragen und löschen.
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 obigen Snippet wird dynamicSuffix als Hauptinhalt übergeben und promptPrefix wird separat bereitgestellt.
Geschätzte Leistungssteigerungen
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 |
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 Gesamtcachemenge überschritten wird.
- Die Größe des Prompt-Cache hängt von der Länge des Präfixes ab.
Wenn Sie alle Caches löschen möchten, die durch das Zwischenspeichern von Präfixen erstellt wurden, verwenden Sie die Methode
generativeMode.clearImplicitCaches().
Explizite Cache-Verwaltung verwenden
Die Prompt API enthält explizite Methoden zur Cacheverwaltung, mit denen Entwickler genauer steuern können, wie Caches erstellt, durchsucht, verwendet und entfernt werden. Diese manuellen Vorgänge werden unabhängig von der automatisierten Cacheverwaltung des Systems ausgeführt.
In diesem Beispiel wird gezeigt, wie die explizite Cache-Verwaltung initialisiert und die Inferenz durchgeführt wird:
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);