التخزين المؤقت للبادئة هو ميزة تقلّل من وقت الاستنتاج من خلال تخزين وإعادة استخدام حالة نموذج LLM الوسيطة لمعالجة جزء بادئة طلب مشترك ومتكرر. لتفعيل ميزة "التخزين المؤقت للبادئات"، ما عليك سوى فصل البادئة الثابتة عن اللاحقة الديناميكية في طلب البيانات من واجهة برمجة التطبيقات.
لا تتيح ميزة "التخزين المؤقت للبادئة" حاليًا سوى الإدخال النصي فقط، لذا يجب عدم استخدامها إذا كنت تقدّم صورة في طلبك.
هناك طريقتان لتنفيذ التخزين المؤقت للبادئة: ضمنية أو صريحة:
- التخزين المؤقت الضمني (التلقائي) للبادئات هو نهج بسيط لا يتطلب من التطبيق سوى تحديد جزء مشترك من الطلب.
- يتيح التخزين المؤقت الصريح (اليدوي) للبادئات للتطبيقات التحكّم بشكل أكبر في ذاكرة التخزين المؤقت، بما في ذلك إنشاء ذاكرة التخزين المؤقت وطلب البحث عنها وحذفها.
استخدام التخزين المؤقت للبادئة ضمنيًا
لتفعيل ميزة "التخزين المؤقت للبادئة"، أضِف الجزء المشترَك من الطلب إلى حقل promptPrefix، كما هو موضّح في مقتطفات الرموز البرمجية التالية:
Kotlin
val promptPrefix = "Reverse the given sentence: "
val dynamicSuffix = "Hello World"
val result = generativeModel.generateContent(
generateContentRequest(TextPart(dynamicSuffix)) {
promptPrefix = PromptPrefix(promptPrefix)
}
)
جافا
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 ثانية |
نصف ثانية |
اعتبارات التخزين
عند استخدام ميزة "التخزين المؤقت الضمني للبادئة"، يتم حفظ ملفات ذاكرة التخزين المؤقت في مساحة التخزين الخاصة بتطبيق العميل، ما يؤدي إلى زيادة سعة التخزين المطلوب استخدامها في تطبيقك. يتم تخزين ملفات ذاكرة التخزين المؤقت المشفّرة والبيانات الوصفية المرتبطة بها، بما في ذلك نص البادئة الأصلي. يُرجى مراعاة ما يلي بشأن مساحة التخزين:
- تتم إدارة عدد ذاكرات التخزين المؤقت من خلال آلية LRU (الأقل استخدامًا مؤخرًا). يتم حذف ذاكرة التخزين المؤقت الأقل استخدامًا تلقائيًا عند تجاوز الحد الأقصى لإجمالي حجم ذاكرة التخزين المؤقت.
- تعتمد أحجام ذاكرة التخزين المؤقت للطلبات على طول البادئة.
لمحو جميع ذاكرات التخزين المؤقت التي تم إنشاؤها من التخزين المؤقت للبادئة، استخدِم الإجراء
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
}
)
جافا
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)
جافا
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);