Präfix-Caching ist eine Funktion, die die Inferenzzeit verkürzt, indem der Zwischenzustand des LLM bei der Verarbeitung eines freigegebenen und wiederkehrenden Prompt-Präfixteils gespeichert und wiederverwendet wird. Wenn Sie das Präfix-Caching aktivieren möchten, müssen Sie in Ihrer API-Anfrage nur das statische Präfix vom dynamischen Suffix trennen.
Das Präfix-Caching unterstützt derzeit nur reine Texteingaben. Sie sollten diese Funktion also nicht verwenden, wenn Sie ein Bild in Ihrem Prompt angeben.
Es gibt zwei Ansätze zur Implementierung des Präfix-Caching: implizit oder explizit:
- Implizites (automatisches) Präfix-Caching ist ein einfacher Ansatz, bei dem die Anwendung nur einen gemeinsamen Teil des Prompts definieren muss.
- Explizites (manuelles) Präfix-Caching ermöglicht Anwendungen mehr Kontrolle über Caches, einschließlich Cache-Erstellung, ‑Abfrage und ‑Löschung.
Präfix-Caching implizit verwenden
Wenn Sie das Präfix-Caching aktivieren möchten, fügen Sie den freigegebenen 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 der dynamicSuffix als Hauptinhalt übergeben und der promptPrefix separat bereitgestellt.
Geschätzte Leistungssteigerung
Ohne Präfix-Caching |
Mit Präfix-Cache-Treffer (Cache-Fehler beim Präfix können auftreten, wenn das Präfix zum ersten Mal verwendet wird) |
|
Pixel 9 mit einem festen Präfix mit 300 Tokens und einem dynamischen Suffix 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 Anwendung erhöht. Verschlüsselte Cache-Dateien und die zugehörigen Metadaten, einschließlich des ursprünglichen Präfixtexts, werden gespeichert. Beachten Sie die folgenden Speicherhinweise:
- 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-Caches hängt von der Länge des Präfixes ab.
Verwenden Sie die Methode
generativeMode.clearImplicitCaches(), um alle Caches zu löschen, die durch das Präfix-Caching erstellt wurden.
Explizite Cache-Verwaltung verwenden
Der direkte Modellzugriff umfasst explizite Methoden zur Cache-Verwaltung, 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-Verarbeitung des Systems ausgeführt.
In diesem Beispiel wird gezeigt, wie Sie die explizite Cache-Verwaltung initialisieren und eine 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);