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

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

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

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

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

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

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

איך שמירה במטמון מפחיתה את העלויות

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

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

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

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

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

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

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

import os
import google.generativeai as genai
from google.generativeai import caching
import datetime
import time

# Get your API key from https://aistudio.google.com/app/apikey
# and access your API key as an environment variable.
# To authenticate from a Colab, see
# https://github.com/google-gemini/cookbook/blob/main/quickstarts/Authentication.ipynb
genai.configure(api_key=os.environ['API_KEY'])

# Download video file
# curl -O https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4

path_to_video_file = 'Sherlock_Jr_FullMovie.mp4'

# Upload the video using the Files API
video_file = genai.upload_file(path=path_to_video_file)

# Wait for the file to finish processing
while video_file.state.name == 'PROCESSING':
  print('Waiting for video to be processed.')
  time.sleep(2)
  video_file = genai.get_file(video_file.name)

print(f'Video processing complete: {video_file.uri}')

# Create a cache with a 5 minute TTL
cache = caching.CachedContent.create(
    model='models/gemini-1.5-flash-001',
    display_name='sherlock jr movie', # used to identify the cache
    system_instruction=(
        '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.'
    ),
    contents=[video_file],
    ttl=datetime.timedelta(minutes=5),
)

# Construct a GenerativeModel which uses the created cache.
model = genai.GenerativeModel.from_cached_content(cached_content=cache)

# Query the model
response = model.generate_content([(
    'Introduce different characters in the movie by describing '
    'their personality, looks, and names. Also list the timestamps '
    'they were introduced for the first time.')])

print(response.usage_metadata)

# The output should look something like this:
#
# prompt_token_count: 696219
# cached_content_token_count: 696190
# candidates_token_count: 214
# total_token_count: 696433

print(response.text)

הצגת רשימה של מטמון

לא ניתן לאחזר או להציג תוכן שנשמר במטמון, אבל אפשר לאחזר מטא-נתונים של המטמון (name, model, display_name, usage_metadata, create_time, update_time ו-expire_time).

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

for c in caching.CachedContent.list():
  print(c)

עדכון מטמון

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

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

import datetime

cache.update(ttl=datetime.timedelta(hours=2))

מחיקת מטמון

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

cache.delete()

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

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

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