कॉन्टेक्स्ट कैश मेमोरी

आम तौर पर, एआई वर्कफ़्लो में किसी मॉडल को एक ही इनपुट टोकन बार-बार पास किया जा सकता है. Gemini API के कॉन्टेक्स्ट को कैश मेमोरी में सेव करने की सुविधा का इस्तेमाल करके, मॉडल को कुछ कॉन्टेंट एक बार पास किया जा सकता है. इसके बाद, इनपुट टोकन को कैश मेमोरी में सेव किया जा सकता है. इसके बाद, अगले अनुरोधों के लिए कैश मेमोरी में सेव किए गए टोकन का रेफ़रंस दिया जा सकता है. कुछ मामलों में, कैश मेमोरी में सेव किए गए टोकन का इस्तेमाल करना, टोकन के एक ही कॉर्पस को बार-बार पास करने की तुलना में कम लागत का होता है.

टोकन का सेट कैश मेमोरी में सेव करने पर, यह चुना जा सकता है कि टोकन अपने-आप मिटने से पहले, कैश मेमोरी में कितने समय तक सेव रहे. कैश मेमोरी में सेव किए जाने की इस अवधि को टाइम टू लिव (टीटीएल) कहा जाता है. अगर यह सेट नहीं किया जाता है, तो टीटीएल डिफ़ॉल्ट रूप से एक घंटे पर सेट हो जाता है. कैश मेमोरी में सेव करने की लागत, इनपुट टोकन के साइज़ और टोकन को सेव रखने की अवधि पर निर्भर करती है.

कॉन्टेक्स्ट कैश मेमोरी सेव करने की सुविधा, डिवाइस के मॉडल के हिसाब से अलग-अलग होती है.

कॉन्टेक्स्ट कैश मेमोरी का इस्तेमाल कब करना चाहिए

संदर्भ कैश मेमोरी का इस्तेमाल उन मामलों में खास तौर पर किया जाता है जहां छोटे अनुरोधों के ज़रिए, शुरुआती संदर्भ का बार-बार रेफ़रंस दिया जाता है. इस्तेमाल के उदाहरणों के लिए, कॉन्टेक्स्ट कैश मेमोरी का इस्तेमाल करें. जैसे:

  • सिस्टम के बारे में ज़्यादा निर्देश देने वाले चैटबॉट
  • लंबी वीडियो फ़ाइलों का बार-बार विश्लेषण करना
  • बड़े दस्तावेज़ सेट के लिए बार-बार की जाने वाली क्वेरी
  • कोड रिपॉज़िटरी का बार-बार विश्लेषण करना या गड़बड़ी ठीक करना

कॉन्टेक्स्ट कैश मेमोरी का इस्तेमाल करने का तरीका

इस सेक्शन में यह माना गया है कि आपने Gemini SDK (या curl) इंस्टॉल किया है और आपने क्विकस्टार्ट में दिखाए गए तरीके से, एपीआई पासकोड कॉन्फ़िगर किया है.

कैश मेमोरी का इस्तेमाल करके कॉन्टेंट जनरेट करना

यहां दिए गए उदाहरण में, कैश मेमोरी बनाने और फिर कॉन्टेंट जनरेट करने के लिए उसका इस्तेमाल करने का तरीका बताया गया है.

वीडियोPDF
wget https://storage.googleapis.com/generativeai-downloads/data/a11.txt
echo '{
  "model": "models/gemini-2.0-flash-001",
  "contents":[
    {
      "parts":[
        {
          "inline_data": {
            "mime_type":"text/plain",
            "data": "'$(base64 $B64FLAGS a11.txt)'"
          }
        }
      ],
    "role": "user"
    }
  ],
  "systemInstruction": {
    "parts": [
      {
        "text": "You are an expert at analyzing transcripts."
      }
    ]
  },
  "ttl": "300s"
}' > request.json

curl -X POST "https://generativelanguage.googleapis.com/v1beta/cachedContents?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d @request.json \
> cache.json

CACHE_NAME=$(cat cache.json | grep '"name":' | cut -d '"' -f 4 | head -n 1)

curl -X POST "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash-001:generateContent?key=$GEMINI_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
      "contents": [
        {
          "parts":[{
            "text": "Please summarize this transcript"
          }],
          "role": "user"
        },
      ],
      "cachedContent": "'$CACHE_NAME'"
    }'
DOC_URL="https://www.nasa.gov/wp-content/uploads/static/history/alsj/a17/A17_FlightPlan.pdf"
DISPLAY_NAME="A17_FlightPlan"
SYSTEM_INSTRUCTION="You are an expert at analyzing transcripts."
PROMPT="Please summarize this transcript"
MODEL="models/gemini-2.0-flash-001"
TTL="300s"

# Download the PDF
wget -O "${DISPLAY_NAME}.pdf" "${DOC_URL}"

MIME_TYPE=$(file -b --mime-type "${DISPLAY_NAME}.pdf")
NUM_BYTES=$(wc -c < "${DISPLAY_NAME}.pdf")

echo "MIME_TYPE: ${MIME_TYPE}"
echo "NUM_BYTES: ${NUM_BYTES}"

tmp_header_file=upload-header.tmp

# Initial resumable request defining metadata.
# The upload url is in the response headers dump them to a file.
curl "${BASE_URL}/upload/v1beta/files?key=${GOOGLE_API_KEY}" \
  -D upload-header.tmp \
  -H "X-Goog-Upload-Protocol: resumable" \
  -H "X-Goog-Upload-Command: start" \
  -H "X-Goog-Upload-Header-Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Header-Content-Type: ${MIME_TYPE}" \
  -H "Content-Type: application/json" \
  -d "{'file': {'display_name': '${DISPLAY_NAME}'}}" 2> /dev/null

upload_url=$(grep -i "x-goog-upload-url: " "${tmp_header_file}" | cut -d" " -f2 | tr -d "\r")
rm "${tmp_header_file}"

# Upload the actual bytes.
curl "${upload_url}" \
  -H "Content-Length: ${NUM_BYTES}" \
  -H "X-Goog-Upload-Offset: 0" \
  -H "X-Goog-Upload-Command: upload, finalize" \
  --data-binary "@${DISPLAY_NAME}.pdf" 2> /dev/null > file_info.json

file_uri=$(jq ".file.uri" file_info.json)
echo "file_uri: ${file_uri}"

# Clean up the downloaded PDF
rm "${DISPLAY_NAME}.pdf"

# Create the cached content request
echo '{
  "model": "'$MODEL'",
  "contents":[
    {
      "parts":[
        {"file_data": {"mime_type": "'$MIME_TYPE'", "file_uri": '$file_uri'}}
      ],
    "role": "user"
    }
  ],
  "system_instruction": {
    "parts": [
      {
        "text": "'$SYSTEM_INSTRUCTION'"
      }
    ],
    "role": "system"
  },
  "ttl": "'$TTL'"
}' > request.json

# Send the cached content request
curl -X POST "${BASE_URL}/v1beta/cachedContents?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-d @request.json \
> cache.json

CACHE_NAME=$(cat cache.json | grep '"name":' | cut -d '"' -f 4 | head -n 1)
echo "CACHE_NAME: ${CACHE_NAME}"
# Send the generateContent request using the cached content
curl -X POST "${BASE_URL}/${MODEL}:generateContent?key=$GOOGLE_API_KEY" \
-H 'Content-Type: application/json' \
-d '{
      "contents": [
        {
          "parts":[{
            "text": "'$PROMPT'"
          }],
          "role": "user"
        }
      ],
      "cachedContent": "'$CACHE_NAME'"
    }' > response.json

cat response.json

echo jq ".candidates[].content.parts[].text" response.json

कैश मेमोरी की सूची बनाना

कैश मेमोरी में सेव किए गए कॉन्टेंट को वापस पाना या देखना मुमकिन नहीं है. हालांकि, कैश मेमोरी में सेव किए गए मेटाडेटा (name, model, displayName, usageMetadata, createTime, updateTime, और expireTime) को वापस पाया जा सकता है.

curl "https://generativelanguage.googleapis.com/v1beta/cachedContents?key=$GEMINI_API_KEY"

कैश मेमोरी अपडेट करना

कैश मेमोरी के लिए, नया ttl या expireTime सेट किया जा सकता है. कैश मेमोरी के बारे में कुछ और बदलाव नहीं किया जा सकता.

यहां दिए गए उदाहरण में, कैश मेमोरी के ttl को अपडेट करने का तरीका बताया गया है.

curl -X PATCH "https://generativelanguage.googleapis.com/v1beta/$CACHE_NAME?key=$GEMINI_API_KEY" \
 -H 'Content-Type: application/json' \
 -d '{"ttl": "600s"}'

कैश मेमोरी मिटाना

कैश मेमोरी की सेवा, कैश मेमोरी से कॉन्टेंट को मैन्युअल तरीके से हटाने के लिए, मिटाने की सुविधा देती है. यहां दिए गए उदाहरण में, कैश मेमोरी मिटाने का तरीका बताया गया है.

curl -X DELETE "https://generativelanguage.googleapis.com/v1beta/$CACHE_NAME?key=$GEMINI_API_KEY"

कैश मेमोरी से लागत में कैसे बचत होती है

कॉन्टेक्स्ट कैश मेमोरी, पैसे चुकाकर ली जाने वाली एक सुविधा है. इसे ऑपरेशन से जुड़ी कुल लागत को कम करने के लिए डिज़ाइन किया गया है. बिलिंग इन बातों पर आधारित होती है:

  1. कैश मेमोरी में सेव किए गए टोकन की संख्या: कैश मेमोरी में सेव किए गए इनपुट टोकन की संख्या. इन टोकन को बाद के प्रॉम्प्ट में शामिल करने पर, कम दर पर बिलिंग की जाती है.
  2. स्टोरेज की अवधि: कैश मेमोरी में सेव किए गए टोकन को सेव रखने का समय (टीटीएल). कैश मेमोरी में सेव किए गए टोकन की संख्या के टीटीएल के आधार पर शुल्क लिया जाता है. टीटीएल के लिए, कम से कम या ज़्यादा से ज़्यादा सीमा तय नहीं की गई है.
  3. अन्य फ़ैक्टर: अन्य शुल्क भी लागू होते हैं. जैसे, कैश मेमोरी में सेव नहीं किए गए इनपुट टोकन और आउटपुट टोकन के लिए.

कीमत की अप-टू-डेट जानकारी के लिए, Gemini API के कीमत वाले पेज पर जाएं. टोकन की गिनती करने का तरीका जानने के लिए, टोकन के बारे में गाइड देखें.

ज़रूरी बातें

कॉन्टेक्स्ट कैश मेमोरी का इस्तेमाल करते समय, इन बातों का ध्यान रखें:

  • कॉन्टेक्स्ट कैश मेमोरी के लिए, इनपुट टोकन की संख्या कम से कम 4,096 होनी चाहिए. साथ ही, ज़्यादा से ज़्यादा संख्या, दिए गए मॉडल के लिए तय की गई संख्या के बराबर होनी चाहिए. (टोकन की गिनती करने के बारे में ज़्यादा जानने के लिए, टोकन गाइड देखें).
  • यह मॉडल, कैश मेमोरी में सेव किए गए टोकन और सामान्य इनपुट टोकन के बीच कोई फ़र्क़ नहीं करता. कैश मेमोरी में सेव किया गया कॉन्टेंट, प्रॉम्प्ट का प्रीफ़िक्स होता है.
  • कॉन्टेक्स्ट कैश मेमोरी पर, दर या इस्तेमाल की कोई खास सीमा नहीं होती. GenerateContent के लिए तय की गई स्टैंडर्ड दर की सीमाएं लागू होती हैं. साथ ही, टोकन की सीमाओं में कैश मेमोरी में सेव किए गए टोकन भी शामिल होते हैं.
  • कैश मेमोरी में सेव किए गए टोकन की संख्या, कैश मेमोरी सेवा के बनाएं, पाएं, और सूची बनाएं ऑपरेशन से usage_metadata में दिखती है. साथ ही, कैश मेमोरी का इस्तेमाल करने पर भी GenerateContent में दिखती है.