שמירת הקשר במטמון

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

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

שמירת הקשר במטמון תומכת גם ב-Gemini 1.5 Pro וגם ב-Gemini 1.5 Flash.

מתי כדאי להשתמש בשמירת הקשר במטמון

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

  • צ'אט בוטים עם הוראות מפורטות למערכת
  • ניתוח חוזר של קובצי וידאו ארוכים
  • שאילתות חוזרות על קבוצות גדולות של מסמכים
  • ניתוח תדיר של מאגר הקוד או תיקון באגים

איך אחסון במטמון מפחית עלויות

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

  1. מספר האסימונים ששמורים במטמון: מספר האסימונים של הקלט ששמורים במטמון, שעבורם מתבצעת חיוב במחיר מוזל כשהם נכללים בהנחיות הבאות.
  2. משך האחסון: משך הזמן שבו טוקנים נשמרים במטמון (TTL). החיוב מתבצע על סמך משך ה-TTL של ספירת הטוקנים במטמון. אין גבולות מינימום או מקסימום ל-TTL.
  3. גורמים אחרים: חלים חיובים אחרים, כמו על אסימוני קלט ואסימוני פלט שלא שמורים במטמון.

פרטי התמחור העדכניים מפורטים בדף התמחור של Gemini API. במאמר מדריך אסימונים מוסבר איך ספציפית מנהלים אסימונים.

איך משתמשים במטמון הקשר

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

יצירת תוכן באמצעות מטמון

בדוגמה הבאה מוסבר איך ליצור תוכן באמצעות הוראה מערכתית וקובץ וידאו שנשמרו במטמון.

import { GoogleGenerativeAI } from '@google/generative-ai';
import {
  FileState,
  GoogleAICacheManager,
  GoogleAIFileManager,
} from '@google/generative-ai/server';

// A helper function that uploads the video to be cached.
async function uploadMp4Video(filePath, displayName) {
  const fileManager = new GoogleAIFileManager(process.env.API_KEY);
  const fileResult = await fileManager.uploadFile(filePath, {
    displayName,
    mimeType: 'video/mp4',
  });

  const { name, uri } = fileResult.file;

  // Poll getFile() on a set interval (2 seconds here) to check file state.
  let file = await fileManager.getFile(name);
  while (file.state === FileState.PROCESSING) {
    console.log('Waiting for video to be processed.');
    // Sleep for 2 seconds
    await new Promise((resolve) => setTimeout(resolve, 2_000));
    file = await fileManager.getFile(name);
  }

  console.log(`Video processing complete: ${uri}`);

  return fileResult;
}

// Download video file
// curl -O https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4
const pathToVideoFile = 'Sherlock_Jr_FullMovie.mp4';

// Upload the video.
const fileResult = await uploadMp4Video(pathToVideoFile, 'Sherlock Jr. video');

// Construct a GoogleAICacheManager using your API key.
const cacheManager = new GoogleAICacheManager(process.env.API_KEY);

// Create a cache with a 5 minute TTL.
const displayName = 'sherlock jr movie';
const model = 'models/gemini-1.5-flash-001';
const systemInstruction =
  'You are an expert video analyzer, and your job is to answer ' +
  "the user's query based on the video file you have access to.";
let ttlSeconds = 300;
const cache = await cacheManager.create({
  model,
  displayName,
  systemInstruction,
  contents: [
    {
      role: 'user',
      parts: [
        {
          fileData: {
            mimeType: fileResult.file.mimeType,
            fileUri: fileResult.file.uri,
          },
        },
      ],
    },
  ],
  ttlSeconds,
});

// Get your API key from https://aistudio.google.com/app/apikey
// Access your API key as an environment variable.
const genAI = new GoogleGenerativeAI(process.env.API_KEY);

// Construct a `GenerativeModel` which uses the cache object.
const genModel = genAI.getGenerativeModelFromCachedContent(cache);

// Query the model.
const result = await genModel.generateContent({
  contents: [
    {
      role: 'user',
      parts: [
        {
          text:
            'Introduce different characters in the movie by describing ' +
            'their personality, looks, and names. Also list the ' +
            'timestamps they were introduced for the first time.',
        },
      ],
    },
  ],
});

console.log(result.response.usageMetadata);

// The output should look something like this:
//
// {
//   promptTokenCount: 696220,
//   candidatesTokenCount: 270,
//   totalTokenCount: 696490,
//   cachedContentTokenCount: 696191
// }

console.log(result.response.text());

הצגת רשימה של מטמונים

אי אפשר לאחזר או להציג תוכן שנשמר במטמון, אבל אפשר לאחזר את המטא-נתונים של המטמון (name,‏ model,‏ displayName,‏ usageMetadata,‏ createTime,‏ updateTime ו-expireTime).

כדי לקבל רשימה של המטא-נתונים של כל המטמון שהועלו, משתמשים ב-GoogleAICacheManager.list():

const listResult = await cacheManager.list();
listResult.cachedContents.forEach((cache) => {
  console.log(cache);
});

עדכון מטמון

אפשר להגדיר ttl או expireTime חדשים למטמון. אין תמיכה בשינוי של פרטים אחרים במטמון.

בדוגמה הבאה מוסבר איך לעדכן את ttl של מטמון באמצעות GoogleAICacheManager.update().

const ttlSeconds = 2 * 60 * 60;
const updateParams = { cachedContent: { ttlSeconds } };
const updatedCache = await cacheManager.update(cacheName, updateParams);

מחיקת מטמון

שירות האחסון במטמון מספק פעולת מחיקה להסרת תוכן מהמטמון באופן ידני. בדוגמה הבאה מוסבר איך למחוק מטמון באמצעות GoogleAICacheManager.delete().

await cacheManager.delete(cacheName);

שיקולים נוספים

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

  • המספר המינימלי של אסימוני הקלט לשמירת הקשר במטמון הוא 32,768, והמספר המקסימלי זהה למספר המקסימלי של המודל הנתון. (מידע נוסף על ספירת אסימונים זמין במדריך בנושא אסימונים).
  • המודל לא מבדיל בין אסימונים שנשמרו במטמון לבין אסימוני קלט רגילים. תוכן ששמור במטמון הוא פשוט קידומת להנחיה.
  • אין מגבלות מיוחדות על קצב או על שימוש בשמירת הקשר במטמון. מגבלות הקצב הרגילות של GenerateContent חלות, ומגבלות האסימונים כוללות אסימונים שנשמרו במטמון.
  • מספר האסימונים שנשמרו במטמון מוחזר ב-usage_metadata מהפעולות create,‏ get ו-list של שירות המטמון, וגם ב-GenerateContent כשמשתמשים במטמון.