Кэширование префиксов — это функция, которая сокращает время выполнения запроса за счет хранения и повторного использования промежуточного состояния LLM при обработке общей и повторяющейся части префикса подсказки. Для включения кэширования префиксов достаточно отделить статический префикс от динамического суффикса в вашем API-запросе.
В настоящее время кэширование префиксов поддерживает только текстовый ввод, поэтому не следует использовать эту функцию, если вы указываете изображение в командной строке.
Существует два подхода к реализации кэширования префиксов: неявный или явный:
- Неявное кэширование префиксов — это облегченный подход, при котором приложению нужно определить лишь общую часть приглашения командной строки.
- Явное кэширование с использованием префиксов позволяет приложениям лучше контролировать кэш, включая создание, запрос и удаление данных из кэша.
Используйте кэширование префиксов неявно.
Чтобы включить кэширование префиксов, добавьте общую часть приглашения в поле promptPrefix , как показано в следующих фрагментах кода:
Котлин
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();
В приведенном выше фрагменте в качестве основного содержимого передается dynamicSuffix , а promptPrefix указывается отдельно.
Предполагаемое повышение производительности
Без кэширования префиксов | С префиксом попадания в кэш. (При первом использовании префикса может произойти промах кэша префикса) | |
Pixel 9 с фиксированным префиксом в 300 токенов и динамическим суффиксом в 50 токенов. | 0,82 секунды | 0,45 секунды |
Pixel 9 с фиксированным префиксом в 1000 токенов и динамическим суффиксом в 100 токенов. | 2,11 секунды | 0,5 секунды |
Вопросы хранения
При неявном префиксном кэшировании файлы кэша сохраняются в частном хранилище клиентского приложения, что увеличивает объем используемого приложения хранилища. Сохраняются зашифрованные файлы кэша и связанные с ними метаданные, включая исходный текст префикса. Следует учитывать следующие моменты, касающиеся хранения данных:
- Количество кэшей регулируется механизмом LRU (Least Recently Used — наименее используемые). Наименее используемые кэши автоматически удаляются при превышении максимального общего объема кэша.
- Размер кэша подсказок зависит от длины префикса.
Для очистки всех кэшей, созданных с помощью префиксного кэширования, используйте метод
generativeMode.clearImplicitCaches().
Используйте явное управление кэшем.
API Prompt включает в себя явные методы управления кэшем, позволяющие разработчикам более точно контролировать создание, поиск, использование и удаление кэша. Эти операции, выполняемые вручную, осуществляются независимо от автоматической обработки кэша системой.
Этот пример иллюстрирует, как инициализировать явное управление кэшем и выполнить вывод:
Котлин
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();
В этом примере показано, как запрашивать, получать и удалять явно управляемые кэши с помощью generativeModel.caches :
Котлин
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);