El almacenamiento en caché de prefijos es una función que reduce el tiempo de inferencia, ya que almacena y reutiliza el estado intermedio del LLM que procesa una parte del prefijo de instrucción compartida y recurrente. Para habilitar el almacenamiento en caché de prefijos, solo debes separar el prefijo estático del sufijo dinámico en tu solicitud a la API.
Actualmente, el almacenamiento en caché de prefijos solo admite la entrada de texto, por lo que no debes usar esta función si proporcionas una imagen en tu instrucción.
Existen dos enfoques para implementar el almacenamiento en caché de prefijos: implícito o explícito:
- El almacenamiento en caché de prefijos implícito es un enfoque ligero en el que la aplicación solo necesita definir una parte compartida de la instrucción.
- El almacenamiento en caché de prefijos explícito permite que las aplicaciones tengan más control sobre las cachés, lo que incluye la creación, la consulta y la eliminación de cachés.
Usa el almacenamiento en caché de prefijos de forma implícita
Para habilitar el almacenamiento en caché de prefijos, agrega la parte compartida de la instrucción al campo promptPrefix, como se muestra en los siguientes fragmentos de código:
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();
En el fragmento anterior, el elemento dynamicSuffix se pasa como el contenido principal y el elemento promptPrefix se proporciona por separado.
Mejoras de rendimiento estimadas
Sin almacenamiento en caché de prefijos |
Con acierto de caché de prefijo (Es posible que se produzca un error de caché de prefijo cuando se usa el prefijo por primera vez). |
|
Pixel 9 con un prefijo fijo de 300 tokens y un sufijo dinámico de 50 tokens de instrucción |
0.82 segundos |
0.45 segundos |
Pixel 9 con un prefijo fijo de 1,000 tokens y un mensaje de sufijo dinámico de 100 tokens |
2.11 segundos |
0,5 segundos |
Consideraciones sobre el almacenamiento
Con el almacenamiento en caché de prefijos implícito, los archivos de caché se guardan en el almacenamiento privado de la aplicación cliente, lo que aumenta el uso de almacenamiento de tu app. Se almacenan los archivos de caché encriptados y sus metadatos asociados, incluido el texto del prefijo original. Ten en cuenta las siguientes consideraciones de almacenamiento:
- La cantidad de cachés se administra con un mecanismo de LRU (Least Recently Used). Los cachés menos usados se borran automáticamente cuando se supera la cantidad total máxima de caché.
- Los tamaños de la caché de instrucciones dependen de la longitud del prefijo.
Para borrar todas las cachés creadas a partir del almacenamiento en caché de prefijos, usa el método
generativeMode.clearImplicitCaches().
Usa la administración explícita de la caché
La API de Prompt incluye métodos explícitos de administración de caché para brindarles a los desarrolladores un control más preciso sobre cómo se crean, buscan, usan y quitan las cachés. Estas operaciones manuales se ejecutan de forma independiente del manejo automático de la caché del sistema.
En este ejemplo, se ilustra cómo inicializar la administración explícita de la caché y realizar la inferencia:
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();
En este ejemplo, se muestra cómo consultar, recuperar y borrar cachés administradas de forma explícita con generativeModel.caches:
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);