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

שמירת קידומות במטמון היא תכונה שמקצרת את זמן ההסקה על ידי שמירה ושימוש חוזר במצב הביניים של מודל שפה גדול (LLM) במהלך עיבוד של חלק משותף וחוזר בהנחיה. כדי להפעיל שמירת מטמון של קידומת, צריך רק להפריד בין הקידומת הסטטית לבין הסיומת הדינמית בבקשת ה-API.

בשלב הזה, שמירת קידומות במטמון תומכת רק בקלט טקסט, ולכן לא מומלץ להשתמש בתכונה הזו אם אתם מספקים תמונה בהנחיה.

יש שתי גישות להטמעה של שמירת נתונים במטמון עם קידומת: מרומזת או מפורשת:

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

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