O armazenamento em cache de prefixos é um recurso que reduz o tempo de inferência armazenando e reutilizando o estado intermediário de LLM do processamento de uma parte de prefixo de comando compartilhada e recorrente. Para ativar o armazenamento em cache de prefixos, basta separar o prefixo estático do sufixo dinâmico na solicitação de API.
No momento, o armazenamento em cache de prefixos só oferece suporte a entradas de texto. Portanto, não use esse recurso se você estiver fornecendo uma imagem no comando.
Há duas abordagens para implementar o armazenamento em cache de prefixos: implícito ou explícito:
- O armazenamento em cache de prefixos implícito (automático) é uma abordagem leve em que o aplicativo só precisa definir uma parte compartilhada do comando.
- O armazenamento em cache de prefixos explícito (manual) permite que os aplicativos tenham mais controle sobre os caches, incluindo a criação, a consulta e a exclusão de caches.
Usar o armazenamento em cache de prefixos implicitamente
Para ativar o armazenamento em cache de prefixos, adicione a parte compartilhada do comando ao campo promptPrefix, conforme mostrado nos snippets de código a seguir:
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();
No snippet anterior, o dynamicSuffix é transmitido como o conteúdo principal, e o promptPrefix é fornecido separadamente.
Ganhos de desempenho estimados
Sem armazenamento em cache de prefixos |
Com acerto de cache de prefixos (A falha de cache de prefixos pode ocorrer quando o prefixo é usado pela primeira vez) |
|
Pixel 9 com prefixo fixo de 300 tokens e um comando de sufixo dinâmico de 50 tokens comando |
0,82 segundo |
0,45 segundo |
Pixel 9 com um prefixo fixo de 1.000 tokens e um comando de sufixo dinâmico de 100 tokens |
2,11 segundos |
0,5 segundo |
Considerações sobre armazenamento
Com o armazenamento em cache de prefixos implícito, os arquivos de cache são salvos no armazenamento particular do aplicativo cliente, o que aumenta o uso do armazenamento do app. Os arquivos de cache criptografados e os metadados associados, incluindo o texto do prefixo original, são armazenados. Lembre-se das seguintes considerações sobre armazenamento:
- O número de caches é gerenciado por um mecanismo LRU (usado há mais tempo). Os caches menos usados são excluídos automaticamente quando excedem o valor máximo total de cache.
- Os tamanhos do cache de comandos dependem do comprimento do prefixo.
Para limpar todos os caches criados no armazenamento em cache de prefixos, use o
generativeMode.clearImplicitCaches()método.
Usar o gerenciamento de cache explícito
A API Prompt inclui métodos de gerenciamento de cache explícito para oferecer aos desenvolvedores um controle mais preciso sobre como os caches são criados, pesquisados, usados e removidos. Essas operações manuais são executadas de forma independente do tratamento automatizado de cache do sistema.
Este exemplo ilustra como inicializar o gerenciamento de cache explícito e realizar a inferência:
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();
Este exemplo demonstra como consultar, recuperar e excluir caches gerenciados explicitamente usando 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);