프리픽스 캐싱은 공유되고 반복되는 프롬프트 프리픽스 부분을 처리하는 중간 LLM 상태를 저장하고 재사용하여 추론 시간을 줄이는 기능입니다. 프리픽스 캐싱을 사용 설정하려면 API 요청에서 정적 프리픽스를 동적 서픽스와 분리하기만 하면 됩니다.
프리픽스 캐싱은 현재 텍스트 전용 입력만 지원하므로 프롬프트에 이미지를 제공하는 경우 이 기능을 사용하면 안 됩니다.
프리픽스 캐싱을 구현하는 방법에는 암시적 또는 명시적 두 가지가 있습니다.
- 암시적 (자동) 프리픽스 캐싱은 애플리케이션이 프롬프트의 공유 부분만 정의하면 되는 가벼운 접근 방식입니다.
- 명시적 (수동) 프리픽스 캐싱을 사용하면 애플리케이션에서 캐시 생성, 쿼리, 삭제를 포함한 캐시를 더 세부적으로 제어할 수 있습니다.
암시적으로 프리픽스 캐싱 사용
프리픽스 캐싱을 사용 설정하려면 다음 코드 스니펫과 같이 프롬프트의 공유 부분을 promptPrefix 필드에 추가합니다.
Kotlin
val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"
val result = generativeModel.generateContent(
generateContentRequest(TextPart(dynamicSuffix)) {
promptPrefix = PromptPrefix(promptPrefix)
}
)
자바
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는 별도로 제공됩니다.
예상 실적 개선
프리픽스 캐싱 없음 |
프리픽스 캐시 적중 (프리픽스를 처음 사용할 때 프리픽스 캐시 부적중이 발생할 수 있음) |
|
300토큰 고정 프리픽스와 50토큰 동적 서픽스 프롬프트가 있는 Pixel 9 |
0.82초 |
0.45초 |
1,000토큰 고정 프리픽스와 100토큰 동적 서픽스 프롬프트가 있는 Pixel 9 |
2.11초 |
0.5초 |
스토리지 고려사항
암시적 프리픽스 캐싱을 사용하면 캐시 파일이 클라이언트 애플리케이션의 비공개 저장소에 저장되므로 앱의 저장용량 사용량이 증가합니다. 암호화된 캐시 파일과 원본 프리픽스 텍스트를 포함한 관련 메타데이터가 저장됩니다. 다음 스토리지 고려사항에 유의하세요.
- 캐시 수는 LRU (가장 오래 전에 사용된 항목) 메커니즘으로 관리됩니다. 최대 총 캐시 양을 초과하면 가장 적게 사용된 캐시가 자동으로 삭제됩니다.
- 프롬프트 캐시 크기는 프리픽스 길이에 따라 달라집니다.
프리픽스 캐싱에서 생성된 모든 캐시를 지우려면
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
}
)
자바
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);