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

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

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

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

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

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

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

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

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

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

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

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

בסעיף הזה נניח שכבר התקנתם את Gemini SDK (או ש-curl מותקן אצלכם) ושהגדרתם מפתח 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, והמספר המקסימלי זהה למספר המקסימלי של המודל הנתון. (מידע נוסף על ספירת אסימונים מופיע במדריך האסימונים).
  • המודל לא מבחין בין אסימונים שנשמרו במטמון לבין אסימוני קלט רגילים. תוכן ששמור במטמון הוא פשוט קידומת להנחיה.
  • אין מגבלות שימוש או קצב מיוחד בשמירה במטמון לפי הקשר. מגבלות הקצב הסטנדרטיות של GenerateContent חלות, ומגבלות האסימונים כוללות אסימונים במטמון.
  • מספר האסימונים שנשמרו במטמון מוחזר ב-usage_metadata מפעולות היצירה, האחזור והרשימה של שירות המטמון, וגם ב-GenerateContent כשמשתמשים במטמון.