שמירה במטמון של קידומות היא תכונה שמקצרת את זמן ההסקה על ידי שמירה ושימוש חוזר במצב הביניים של 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 עם הנחיה של 1,000 טוקנים עם קידומת קבועה וסיומת דינמית של 100 טוקנים |
2.11 שניות |
0.5 שנייה |
שיקולים לגבי אחסון
בשיטה הזו, קובצי המטמון נשמרים באחסון הפרטי של אפליקציית הלקוח, ולכן נפח האחסון הנדרש של האפליקציה גדל. קובצי מטמון מוצפנים והמטא-נתונים המשויכים אליהם, כולל טקסט הקידומת המקורי, נשמרים. חשוב לזכור את השיקולים הבאים לגבי אחסון:
- מספר המטמונים מנוהל על ידי מנגנון LRU (Least Recently Used). מטמון שנעשה בו הכי פחות שימוש נמחק אוטומטית כשחורגים מהכמות המקסימלית הכוללת של המטמון.
- גודל המטמון של ההנחיות תלוי באורך הקידומת.
כדי לנקות את כל המטמון שנוצר מקידומת מטמון, משתמשים ב-method
generativeMode.clearImplicitCaches().
שימוש בניהול מטמון מפורש
ה-Prompt API כולל שיטות ניהול מטמון מפורשות כדי לתת למפתחים שליטה מדויקת יותר באופן שבו מטמונים נוצרים, נסרקים, משמשים ומוסרים. הפעולות הידניות האלה מתבצעות בנפרד מהטיפול האוטומטי במטמון של המערכת.
בדוגמה הזו אפשר לראות איך לאתחל ניהול מטמון מפורש ולבצע הסקה:
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);