प्रीफ़िक्स कैश मेमोरी की मदद से, अनुमान लगाने की प्रोसेस को ऑप्टिमाइज़ करना

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

फ़िलहाल, प्रीफ़िक्स कैश मेमोरी में सेव करने की सुविधा सिर्फ़ टेक्स्ट वाले इनपुट के साथ काम करती है. इसलिए, अगर प्रॉम्प्ट में इमेज दी जा रही है, तो इस सुविधा का इस्तेमाल न करें.

प्रीफ़िक्स कैश मेमोरी को लागू करने के दो तरीके हैं: इंप्लिसिट या एक्सप्लिसिट:

प्रीफ़िक्स कैशिंग का इस्तेमाल अपने-आप होना

प्रीफ़िक्स कैश मेमोरी की सुविधा चालू करने के लिए, प्रॉम्प्ट के शेयर किए गए हिस्से को promptPrefix फ़ील्ड में जोड़ें. इसके लिए, यहां दिए गए कोड स्निपेट देखें:

Kotlin

val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"

val result = generativeModel.generateContent(
  generateContentRequest(TextPart(dynamicSuffix)) {
    promptPrefix = PromptPrefix(promptPrefix)
  }
)

Java

String promptPrefix = "Reverse the given sentence: ";
String dynamicSuffix = "Hello World";

GenerateContentResponse response = generativeModelFutures.generateContent(
    new GenerateContentRequest.Builder(new TextPart(dynamicSuffix))
    .setPromptPrefix(new PromptPrefix(promptPrefix))
    .build())
    .get();

ऊपर दिए गए स्निपेट में, dynamicSuffix को मुख्य कॉन्टेंट के तौर पर पास किया गया है और promptPrefix को अलग से दिया गया है.

परफ़ॉर्मेंस में अनुमानित बढ़ोतरी

प्रीफ़िक्स कैश मेमोरी के बिना

प्रीफ़िक्स कैश-हिट के साथ

(प्रीफ़िक्स का पहली बार इस्तेमाल करने पर, प्रीफ़िक्स कैश-मिस हो सकता है)

Pixel 9 पर 300-टोकन वाले फ़िक्स्ड प्रीफ़िक्स और 50-टोकन वाले डाइनैमिक सफ़िक्स प्रॉम्प्ट के साथ

0.82 सेकंड

0.45 सेकंड

Pixel 9, जिसमें 1,000-टोकन वाला फ़िक्स प्रीफ़िक्स और 100-टोकन वाला डाइनैमिक सफ़िक्स प्रॉम्प्ट है

2.11 सेकंड

0.5 सेकंड

स्टोरेज से जुड़ी ज़रूरी बातें

इंप्लिसिट प्रीफ़िक्स कैशिंग की सुविधा चालू होने पर, कैश मेमोरी में सेव की गई फ़ाइलें क्लाइंट ऐप्लिकेशन के निजी स्टोरेज में सेव होती हैं. इससे आपके ऐप्लिकेशन के स्टोरेज का इस्तेमाल बढ़ जाता है. एन्क्रिप्ट की गई कैश मेमोरी वाली फ़ाइलें और उनसे जुड़ा मेटाडेटा सेव किया जाता है. इसमें ओरिजनल प्रीफ़िक्स टेक्स्ट भी शामिल होता है. स्टोरेज से जुड़ी इन बातों का ध्यान रखें:

  • कैश मेमोरी की संख्या को एलआरयू (हाल ही में सबसे कम इस्तेमाल किया गया) तरीके से मैनेज किया जाता है. कैश मेमोरी की तय सीमा से ज़्यादा डेटा होने पर, सबसे कम इस्तेमाल की गई कैश मेमोरी अपने-आप मिट जाती है.
  • प्रॉम्प्ट कैश मेमोरी का साइज़, प्रीफ़िक्स की लंबाई पर निर्भर करता है.
  • प्रीफ़िक्स कैश मेमोरी से बनाई गई सभी कैश मेमोरी मिटाने के लिए, generativeMode.clearImplicitCaches() तरीके का इस्तेमाल करें.

कैश मेमोरी को साफ़ तौर पर मैनेज करना

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

इस उदाहरण में, साफ़ तौर पर कैश मेमोरी मैनेज करने की सुविधा को शुरू करने और अनुमान लगाने का तरीका बताया गया है:

Kotlin

val cacheName = "my_cache"
val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"

// Create a cache
val cacheRequest = createCachedContextRequest(cacheName, PromptPrefix(promptPrefix))
val cache = generativeModel.caches.create(cacheRequest)

// Run inference with the cache
val response = generativeModel.generateContent(
  generateContentRequest(TextPart(dynamicSuffix)) {
    cachedContextName = cache.name
  }
)

Java

String cacheName = "my_cache";
String promptPrefix = "Reverse the given sentence: ";
String dynamicSuffix = "Hello World";

// Create a cache
CachedContext cache = cachesFutures.create(
  new CreateCachedContextRequest.Builder(cacheName, new PromptPrefix(promptPrefix))
  .build())
  .get();

// Run inference with the cache
GenerateContentResponse response = generativeModelFutures.generateContent(
  new GenerateContentRequest.Builder(new TextPart(dynamicSuffix))
  .setCachedContextName(cache.getName())
  .build())
  .get();

इस उदाहरण में, generativeModel.caches का इस्तेमाल करके, साफ़ तौर पर मैनेज की गई कैश मेमोरी के बारे में क्वेरी करने, उसे वापस पाने, और मिटाने का तरीका बताया गया है:

Kotlin

val cacheName = "my_cache"

// Query pre-created caches
for (cache in generativeModel.caches.list()) {
  // Do something with cache
}

// Get specific cache
val cache = generativeModel.caches.get(cacheName)

// Delete a pre-created cache
generativeModel.caches.delete(cacheName)

Java

String cacheName = "my_cache";

// Query pre-created caches
for (PrefixCache cache : cachesFutures.list().get()) {
  // Do something with cache
}

// Get specific cache
PrefixCache cache = cachesFutures.get(cacheName).get();

// Delete a pre-created cache
cachesFutures.delete(cacheName);