Optimiza la velocidad de inferencia con el almacenamiento en caché de prefijos

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:

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);