التخزين المؤقت للسياق

في سير عمل الذكاء الاصطناعي النموذجي، قد تُمرِّر علامات إدخال البيانات نفسها مرارًا وتكرارًا إلى نموذج. باستخدام ميزة التخزين المؤقت للسياق في Gemini API، يمكنك تمرير بعض المحتوى إلى النموذج مرة واحدة وتخزين الرموز المميّزة للدخل مؤقتًا، ثم الرجوع إلى الرموز المميّزة المخزّنة مؤقتًا للطلبات اللاحقة. عند استخدام أعداد معيّنة من الرموز المميّزة، يكون استخدام الرموز المميّزة المخزّنة مؤقتًا أقل تكلفة مقارنةً بإدخال مجموعة الرموز المميّزة نفسها بشكل متكرّر.

عند تخزين مجموعة من الرموز المميّزة في ذاكرة التخزين المؤقت، يمكنك اختيار المدة التي تريد خلالها بقاء ذاكرة التخزين المؤقت متوفّرة قبل حذف الرموز المميّزة تلقائيًا. تُعرف مدة التخزين المؤقت هذه باسم مدة البقاء (TTL). وفي حال عدم ضبطها، تكون مدة البقاء التلقائية هي ساعة واحدة. تعتمد تكلفة التخزين المؤقت على حجم الرمز المميّز الذي يتم إدخاله ومدة الاحتفاظ بالرموز المميّزة.

تتيح ميزة "تخزين السياق في ذاكرة التخزين المؤقت" استخدام كلّ من Gemini 1.5 Pro وGemini 1.5 Flash.

حالات استخدام ميزة "تخزين السياق في ذاكرة التخزين المؤقت"

تُعدّ ميزة "تخزين السياق في ذاكرة التخزين المؤقت" مناسبة بشكلٍ خاص للسيناريوهات التي تتم فيها الإشارة بشكل متكرر إلى سياق أولي أساسي من خلال طلبات أقصر. ننصحك باستخدام التخزين المؤقت للسياق في حالات الاستخدام التالية:

  • روبوتات الدردشة التي تتضمّن تعليمات النظام المفصّلة
  • التحليل المتكرّر لملفات فيديو طويلة
  • الاستعلامات المتكرّرة في مجموعات كبيرة من المستندات
  • تحليل مستودع الرموز البرمجية أو إصلاح الأخطاء بشكل متكرّر

كيفية تقليل ميزة التخزين المؤقت للتكاليف

ميزة "تخزين السياق في ذاكرة التخزين المؤقت" هي ميزة مدفوعة مصمّمة لخفض التكاليف التشغيلية الإجمالية. تستند الفوترة إلى العوامل التالية:

  1. عدد الرموز المميّزة المخزّنة مؤقتًا: عدد الرموز المميّزة التي تم تخزينها مؤقتًا، ويتمّ تحصيل رسومها بسعر منخفض عند تضمينها في طلبات لاحقة.
  2. مدة التخزين: هي المدة التي يتم فيها تخزين الرموز المميّزة المخزّنة مؤقتًا (مدة البقاء)، ويُحصَّل سعرها استنادًا إلى مدة مدة البقاء لعدد الرموز المميّزة المخزّنة مؤقتًا. ما مِن حدود أدنى أو أقصى لوقت الاسترجاع.
  3. عوامل أخرى: يتم تطبيق رسوم أخرى، مثل رسوم الرموز المميّزة للدخل وعدم تخزينها مؤقتًا والرموز المميّزة للإخراج.

للاطّلاع على تفاصيل الأسعار المحدّثة، يُرجى الرجوع إلى صفحة أسعار Gemini API. للتعرّف على كيفية احتساب الرموز المميّزة، اطّلِع على دليل الرموز المميّزة.

كيفية استخدام ميزة "تخزين السياق في ذاكرة التخزين المؤقت"

يفترض هذا القسم أنّك ثبّت حزمة تطوير برامج Gemini SDK (أو ثبّت curl) وأنّك أعددت مفتاح واجهة برمجة التطبيقات، كما هو موضّح في الخطوات المُبسّطة.

إنشاء محتوى باستخدام ذاكرة تخزين مؤقت

يوضّح المثال التالي كيفية إنشاء محتوى باستخدام ملف فيديو وتعليمات نظام مخزّنة مؤقتًا.

import os
import pathlib
import requests
import time

from google import genai
from google.genai import types

# Get your API key from https://aistudio.google.com/app/apikey
# Put it in a "GOOGLE_API_KEY" environment variable.
# For more details, see
# https://github.com/google-gemini/cookbook/blob/main/quickstarts/Authentication.ipynb
client = genai.Client()

# Download video file
url = 'https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4'
path_to_video_file = pathlib.Path('Sherlock_Jr_FullMovie.mp4')
if not path_to_video_file.exists():
  with path_to_video_file.open('wb') as wf:
    response = requests.get(url, stream=True)
    for chunk in response.iter_content(chunk_size=32768):
      wf.write(chunk)

# Upload the video using the Files API
video_file = client.files.upload(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 = client.files.get(name=video_file.name)

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

# You must use an explicit version suffix. "-flash-001", not just "-flash".
model='models/gemini-1.5-flash-001'

# Create a cache with a 5 minute TTL
cache = client.caches.create(
    model=model,
    config=types.CreateCachedContentConfig(
      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="300s",
  )
)

# Construct a GenerativeModel which uses the created cache.
response = client.models.generate_content(
  model = model,
  contents= (
    'Introduce different characters in the movie by describing '
    'their personality, looks, and names. Also list the timestamps '
    'they were introduced for the first time.'),
  config=types.GenerateContentConfig(cached_content=cache.name)
)

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 cache in client.caches.list():
  print(cache)

لجلب البيانات الوصفية لكائن ذاكرة التخزين المؤقت، استخدِم get إذا كنت تعرف اسمه:

client.caches.get(name=name)

تعديل ذاكرة تخزين مؤقت

يمكنك ضبط ttl أو expire_time جديدَين لمخزن مؤقت. لا يمكن تغيير أي شيء آخر بشأن ذاكرة التخزين المؤقت.

يوضّح المثال التالي كيفية تعديل ttl لمخزن مؤقت باستخدام client.caches.update().

from google import genai
from google.genai import types

client.caches.update(
  name = cache.name,
  config  = types.UpdateCachedContentConfig(
      ttl='300s'
  )
)

لضبط وقت انتهاء الصلاحية، سيقبل العنصر إما datetime أو سلسلة وقت وتاريخ بتنسيق ISO (dt.isoformat()، مثل 2025-01-27T16:02:36.473528+00:00). يجب أن يتضمّن الوقت منطقة زمنية (لا يُرفِق datetime.utcnow() منطقة زمنية، أما datetime.now(datetime.timezone.utc) فيُرفِق منطقة زمنية).

from google import genai
from google.genai import types
import datetime

# You must use a time zone-aware time.
in10min = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=10)

client.caches.update(
  name = cache.name,
  config  = types.UpdateCachedContentConfig(
      expire_time=in10min
  )
)

حذف ذاكرة تخزين مؤقت

توفّر خدمة التخزين المؤقت عملية حذف لإزالة المحتوى يدوياً من ذاكرة التخزين المؤقت. يوضّح المثال التالي كيفية حذف ذاكرة تخزين مؤقت:

client.caches.delete(cache.name)

اعتبارات أخرى

يجب مراعاة النقاط التالية عند استخدام ميزة "تخزين السياق في ذاكرة التخزين المؤقت":

  • الحد الأدنى لعدد الرموز المميّزة للدخل لتخزين السياق في ذاكرة التخزين المؤقت هو 32,768، والحد الأقصى هو نفسه الحد الأقصى للنموذج المحدّد. (لمزيد من المعلومات عن احتساب الرموز المميّزة، يُرجى الاطّلاع على دليل الرموز المميّزة).
  • لا يُميّز النموذج بين الرموز المخزّنة مؤقتًا والرموز العادية لرموز الإدخال. المحتوى المخزّن مؤقتًا هو مجرد بادئة للطلب.
  • لا تُفرض أي حدود خاصة على معدّل التخزين المؤقت للسياق أو على معدّل الاستخدام، بل تُطبَّق حدود المعدّل العاديGenerateContent، وتشمل حدود الرموز المميّزة الرموز المميّزة المخزّنة مؤقتًا.
  • يتم عرض عدد الرموز المميّزة المخزّنة مؤقتًا في usage_metadata من عمليات إنشاء و"الحصول على" و"عرض" خدمة ذاكرة التخزين المؤقت، وكذلك في GenerateContent عند استخدام ذاكرة التخزين المؤقت.