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

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

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

कॉन्टेक्स्ट कैश मेमोरी, Gemini 1.5 Pro और Gemini 1.5 Flash, दोनों के साथ काम करती है.

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

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

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

कैश मेमोरी में सेव करने से लागत कैसे कम होती है

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

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

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

कॉन्टेक्स्ट कैशिंग की सुविधा इस्तेमाल करने का तरीका

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

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

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

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 सेट किया जा सकता है. कैश मेमोरी के बारे में कोई और बदलाव नहीं किया जा सकता.

यहां दिए गए उदाहरण में, GoogleAICacheManager.update() का इस्तेमाल करके कैश मेमोरी के ttl को अपडेट करने का तरीका बताया गया है.

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 में कैश मेमोरी की सेवा बनाने, पाने, और उसकी सूची बनाने से दिखती है. कैश मेमोरी का इस्तेमाल करते समय, यह संख्या GenerateContent में भी दिखती है.