การแคชคำนำหน้าเป็นฟีเจอร์ที่ช่วยลดเวลาในการอนุมานโดยการจัดเก็บและนำสถานะ LLM ระดับกลางของการประมวลผลส่วนคำนำหน้าพรอมต์ที่แชร์และเกิดซ้ำกลับมาใช้ใหม่ หากต้องการเปิดใช้การแคชคำนำหน้า คุณเพียงแค่ต้องแยกคำนำหน้าแบบคงที่ออกจากคำต่อท้ายแบบไดนามิกในคำขอ API
ปัจจุบันการแคชคำนำหน้ารองรับเฉพาะอินพุตที่เป็นข้อความเท่านั้น ดังนั้นคุณจึงไม่ควรใช้ฟีเจอร์นี้หากระบุรูปภาพในพรอมต์
การใช้การแคชคำนำหน้ามี 2 วิธี ได้แก่ แบบไม่ระบุหรือแบบระบุอย่างชัดเจน
- การแคชคำนำหน้าโดยนัย (อัตโนมัติ) เป็นแนวทางที่มีน้ำหนักเบาซึ่งแอปพลิเคชันเพียงแค่ต้องกำหนดส่วนที่แชร์ของพรอมต์เท่านั้น
- การแคชคำนำหน้าอย่างชัดเจน (ด้วยตนเอง) ช่วยให้แอปพลิเคชันควบคุมแคชได้มากขึ้น รวมถึงการสร้าง การค้นหา และการลบแคช
ใช้การแคชคำนำหน้าโดยนัย
หากต้องการเปิดใช้การแคชคำนำหน้า ให้เพิ่มส่วนที่ใช้ร่วมกันของพรอมต์ลงในช่อง 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 วินาที |
ข้อควรพิจารณาเกี่ยวกับพื้นที่เก็บข้อมูล
เมื่อใช้การแคชคำนำหน้าโดยนัย ระบบจะบันทึกไฟล์แคชไว้ในพื้นที่เก็บข้อมูลส่วนตัวของแอปพลิเคชันไคลเอ็นต์ ซึ่งจะเพิ่มการใช้พื้นที่เก็บข้อมูลของแอป ระบบจะจัดเก็บไฟล์แคชที่เข้ารหัสและข้อมูลเมตาที่เกี่ยวข้อง รวมถึงข้อความคำนำหน้าต้นฉบับ โปรดคำนึงถึงข้อควรพิจารณาเกี่ยวกับพื้นที่เก็บข้อมูลต่อไปนี้
- จำนวนแคชจะได้รับการจัดการโดยกลไก 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
}
)
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);