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