تحسين سرعة الاستدلال باستخدام التخزين المؤقت للبادئة

التخزين المؤقت للبادئة هو ميزة تقلّل وقت الاستدلال من خلال تخزين وإعادة استخدام الجزء المشترك والمتكرر من بادئة الطلب في الحالة الوسيطة للنموذج اللغوي الكبير. لتفعيل التخزين المؤقت للبادئات، ما عليك سوى فصل البادئة الثابتة عن اللاحقة الديناميكية في طلب واجهة برمجة التطبيقات.

لا تتيح ميزة التخزين المؤقت للبادئة حاليًا سوى إدخال نص فقط، لذا يجب عدم استخدامها إذا كنت تقدّم صورة في طلبك.

هناك طريقتان لتنفيذ التخزين المؤقت للبادئة: ضمنية أو صريحة:

استخدام التخزين المؤقّت للبادئة بشكل ضِمني

لتفعيل التخزين المؤقت للبادئة، أضِف الجزء المشترك من الطلب إلى الحقل 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 ثانية

‫٠,٤٥ ثانية

‫Pixel 9 مع بادئة ثابتة تتضمّن 1,000 رمزًا مميزًا وطلب لاحقة ديناميكية تتضمّن 100 رمز مميز

‫2.11 ثانية

نصف ثانية

اعتبارات مساحة التخزين

باستخدام التخزين المؤقت الضمني للبادئة، يتم حفظ ملفات ذاكرة التخزين المؤقت في مساحة التخزين الخاصة بتطبيق العميل، ما يؤدي إلى زيادة استخدام مساحة التخزين في تطبيقك. يتم تخزين ملفات ذاكرة التخزين المؤقت المشفرة والبيانات الوصفية المرتبطة بها، بما في ذلك نص البادئة الأصلي. يُرجى مراعاة ما يلي بشأن مساحة التخزين:

  • تتم إدارة عدد الذاكرات المؤقتة من خلال آلية LRU (الأقل استخدامًا مؤخرًا). يتم حذف ذاكرات التخزين المؤقت الأقل استخدامًا تلقائيًا عند تجاوز الحد الأقصى لإجمالي حجم ذاكرة التخزين المؤقت.
  • تعتمد أحجام ذاكرة التخزين المؤقت للطلبات على طول البادئة.
  • لمحو جميع ذاكرات التخزين المؤقت التي تم إنشاؤها من التخزين المؤقت للبادئة، استخدِم الطريقة generativeMode.clearImplicitCaches().

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

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

يوضّح هذا المثال كيفية بدء إدارة ذاكرة التخزين المؤقت الصريحة وإجراء الاستدلال:

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);