אופטימיזציה של מהירות ההסקה באמצעות שמירת קידומות במטמון

שמירה במטמון של קידומות היא תכונה שמקצרת את זמן ההסקה על ידי שמירה ושימוש חוזר במצב הביניים של 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);