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:
- Das implizite (automatische) Präfix-Caching ist ein einfacher Ansatz, bei dem die Anwendung nur einen gemeinsamen Teil des Prompts definieren muss.
- Das explizite (manuelle) Präfix-Caching ermöglicht Anwendungen mehr Kontrolle über Caches, einschließlich der Erstellung, Abfrage und Löschung 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 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);