El almacenamiento en caché de prefijos es una función que reduce el tiempo de inferencia almacenando y reutilizando el estado intermedio del LLM del procesamiento de 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 entradas 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 memorias caché, incluida la creación, la consulta y la eliminación de la caché.
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, se pasa dynamicSuffix como el contenido principal y promptPrefix se proporciona por separado.
Aumento estimado del rendimiento
Sin almacenamiento en caché de prefijos |
Con acierto de caché de prefijos (Es posible que se produzca un error de caché de prefijos cuando se usa el prefijo por primera vez) |
|
Pixel 9 con un prefijo fijo de 300 tokens y una instrucción de sufijo dinámico de 50 tokens |
0.82 segundos |
0.45 segundos |
Pixel 9 con un prefijo fijo de 1,000 tokens y una instrucción 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 sobre el almacenamiento:
- La cantidad de memorias caché se administra con un mecanismo LRU (usado menos recientemente). Las memorias caché menos usadas se borran automáticamente cuando se supera la cantidad máxima total de caché.
- Los tamaños de la caché de instrucciones dependen de la longitud del prefijo.
Para borrar todas las memorias caché creadas a partir del almacenamiento en caché de prefijos, usa el
generativeMode.clearImplicitCaches()método.
Usa la administración de caché explícita
La API de Prompt incluye métodos de administración de caché explícitos para brindar a los desarrolladores un control más preciso sobre cómo se crean, buscan, usan y quitan las memorias caché. Estas operaciones manuales se ejecutan de forma independiente del manejo automático de la caché del sistema.
En este ejemplo, se muestra cómo inicializar la administración de caché explícita 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 memorias caché 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);