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 almacenando y reutilizando el estado intermedio del LLM de procesamiento de una parte de prefijo de instrucción compartida y recurrente. Para habilitar el almacenamiento en caché de prefijos, solo tienes que 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:

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 dynamicSuffix se pasa como el contenido principal y el promptPrefix se proporciona por separado.

Mejoras de rendimiento estimadas

Sin almacenamiento en caché de prefijos

Con el prefijo cache-hit

(Puede ocurrir 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 en la 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 del almacenamiento de la app. Se almacenan los archivos de caché encriptados y sus metadatos asociados, incluido el texto de prefijo original. Ten en cuenta las siguientes consideraciones de almacenamiento:

  • La cantidad de cachés se administra mediante un mecanismo LRU (menos usado recientemente). Las cachés menos usadas se borran automáticamente cuando se supera el importe máximo total de la 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é

El acceso directo al modelo incluye métodos explícitos de administración de la 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 automatizado de la caché del sistema.

En este ejemplo, se muestra 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);