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