ในเวิร์กโฟลว์ AI ทั่วไป คุณอาจส่งโทเค็นอินพุตเดียวกันซ้ำๆ ไปยังโมเดล เมื่อใช้ฟีเจอร์การแคชบริบทของ Gemini API คุณสามารถส่งเนื้อหาบางส่วนไปยังโมเดลได้เพียงครั้งเดียว แคชโทเค็นอินพุต แล้วอ้างอิงโทเค็นที่แคชไว้สำหรับคำขอในครั้งต่อๆ ไป ในบางวอลุ่ม การใช้โทเค็นที่แคชไว้จะมีต้นทุนต่ำกว่าการส่งต่อในกลุ่มโทเค็นเดียวกันซ้ำๆ
เมื่อแคชชุดโทเค็น คุณจะเลือกระยะเวลาที่ต้องการให้แคชอยู่ได้ก่อนที่ระบบจะลบโทเค็นโดยอัตโนมัติ ระยะเวลาการแคชนี้เรียกว่า Time to Live (TTL) หากไม่ได้ตั้งค่า TTL ไว้ ระบบจะใช้ค่าเริ่มต้นเป็น 1 ชั่วโมง ค่าใช้จ่ายในการแคชจะขึ้นอยู่กับขนาดของโทเค็นอินพุตและระยะเวลาที่คุณต้องการให้โทเค็นคงอยู่
การแคชบริบทรองรับทั้ง Gemini 1.5 Pro และ Gemini 1.5 Flash
กรณีที่ควรใช้การแคชบริบท
การแคชบริบทเหมาะอย่างยิ่งกับสถานการณ์ที่มีการอ้างอิงบริบทเริ่มต้นจำนวนมากซ้ำๆ โดยคำขอที่สั้นกว่า ลองใช้แคชตามบริบทสําหรับกรณีการใช้งาน เช่น
- แชทบ็อตที่มีวิธีการของระบบอย่างละเอียด
- การวิเคราะห์ไฟล์วิดีโอที่มีความยาวซ้ำๆ
- การค้นหาที่ซ้ำกันกับชุดเอกสารขนาดใหญ่
- การวิเคราะห์ที่เก็บโค้ดหรือการแก้ไขข้อบกพร่องบ่อยครั้ง
การแคชช่วยลดต้นทุนได้อย่างไร
การแคชบริบทเป็นฟีเจอร์แบบชำระเงินที่ออกแบบมาเพื่อลดต้นทุนในการดำเนินการโดยรวม การเรียกเก็บเงินจะอิงตามปัจจัยต่อไปนี้
- จำนวนโทเค็นแคช: จำนวนโทเค็นอินพุตที่แคชไว้ ซึ่งจะเรียกเก็บเงินในอัตราที่ลดลงเมื่อรวมอยู่ในข้อความแจ้งที่ตามมา
- ระยะเวลาพื้นที่เก็บข้อมูล: ระยะเวลาที่ระบบจะจัดเก็บโทเค็นที่แคชไว้ (TTL) โดยเรียกเก็บตามระยะเวลา TTL ของจำนวนโทเค็นที่แคชไว้ TTL ไม่มีขีดจำกัดต่ำสุดหรือสูงสุด
- ปัจจัยอื่นๆ: จะมีค่าใช้จ่ายอื่นๆ เช่น โทเค็นอินพุตที่ไม่ได้แคชและโทเค็นเอาต์พุต
ดูรายละเอียดราคาล่าสุดได้ที่หน้าราคาของ Gemini API โปรดดูวิธีนับโทเค็นที่คำแนะนำเกี่ยวกับโทเค็น
วิธีใช้การแคชบริบท
ส่วนนี้จะถือว่าคุณติดตั้ง Gemini SDK (หรือติดตั้ง Curl ไว้แล้ว) และได้กำหนดค่าคีย์ API ดังที่แสดงในการเริ่มต้นอย่างรวดเร็วแล้ว
สร้างเนื้อหาโดยใช้แคช
ตัวอย่างต่อไปนี้แสดงวิธีการสร้างเนื้อหาโดยใช้วิธีการของระบบที่แคชไว้และไฟล์วิดีโอ
import { GoogleGenerativeAI } from '@google/generative-ai';
import {
FileState,
GoogleAICacheManager,
GoogleAIFileManager,
} from '@google/generative-ai/server';
// A helper function that uploads the video to be cached.
async function uploadMp4Video(filePath, displayName) {
const fileManager = new GoogleAIFileManager(process.env.API_KEY);
const fileResult = await fileManager.uploadFile(filePath, {
displayName,
mimeType: 'video/mp4',
});
const { name, uri } = fileResult.file;
// Poll getFile() on a set interval (2 seconds here) to check file state.
let file = await fileManager.getFile(name);
while (file.state === FileState.PROCESSING) {
console.log('Waiting for video to be processed.');
// Sleep for 2 seconds
await new Promise((resolve) => setTimeout(resolve, 2_000));
file = await fileManager.getFile(name);
}
console.log(`Video processing complete: ${uri}`);
return fileResult;
}
// Download video file
// curl -O https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4
const pathToVideoFile = 'Sherlock_Jr_FullMovie.mp4';
// Upload the video.
const fileResult = await uploadMp4Video(pathToVideoFile, 'Sherlock Jr. video');
// Construct a GoogleAICacheManager using your API key.
const cacheManager = new GoogleAICacheManager(process.env.API_KEY);
// Create a cache with a 5 minute TTL.
const displayName = 'sherlock jr movie';
const model = 'models/gemini-1.5-flash-001';
const systemInstruction =
'You are an expert video analyzer, and your job is to answer ' +
"the user's query based on the video file you have access to.";
let ttlSeconds = 300;
const cache = await cacheManager.create({
model,
displayName,
systemInstruction,
contents: [
{
role: 'user',
parts: [
{
fileData: {
mimeType: fileResult.file.mimeType,
fileUri: fileResult.file.uri,
},
},
],
},
],
ttlSeconds,
});
// Get your API key from https://aistudio.google.com/app/apikey
// Access your API key as an environment variable.
const genAI = new GoogleGenerativeAI(process.env.API_KEY);
// Construct a `GenerativeModel` which uses the cache object.
const genModel = genAI.getGenerativeModelFromCachedContent(cache);
// Query the model.
const result = await genModel.generateContent({
contents: [
{
role: 'user',
parts: [
{
text:
'Introduce different characters in the movie by describing ' +
'their personality, looks, and names. Also list the ' +
'timestamps they were introduced for the first time.',
},
],
},
],
});
console.log(result.response.usageMetadata);
// The output should look something like this:
//
// {
// promptTokenCount: 696220,
// candidatesTokenCount: 270,
// totalTokenCount: 696490,
// cachedContentTokenCount: 696191
// }
console.log(result.response.text());
แสดงรายการแคช
คุณจะเรียกหรือดูเนื้อหาที่แคชไว้ไม่ได้ แต่สามารถดึงข้อมูลเมตาของแคช (name
, model
, displayName
, usageMetadata
, createTime
, updateTime
และ expireTime
)
หากต้องการแสดงรายการข้อมูลเมตาสำหรับแคชที่อัปโหลดทั้งหมด ให้ใช้ GoogleAICacheManager.list()
const listResult = await cacheManager.list();
listResult.cachedContents.forEach((cache) => {
console.log(cache);
});
อัปเดตแคช
คุณตั้งค่า ttl
หรือ expireTime
ใหม่สำหรับแคชได้ ไม่รองรับการเปลี่ยนแปลงอื่นๆ เกี่ยวกับแคช
ตัวอย่างต่อไปนี้แสดงวิธีอัปเดต ttl
ของแคชโดยใช้ GoogleAICacheManager.update()
const ttlSeconds = 2 * 60 * 60;
const updateParams = { cachedContent: { ttlSeconds } };
const updatedCache = await cacheManager.update(cacheName, updateParams);
ลบแคช
บริการแคชมีการดำเนินการลบเพื่อนำเนื้อหาออกจากแคชด้วยตนเอง ตัวอย่างต่อไปนี้แสดงวิธีลบแคชโดยใช้ GoogleAICacheManager.delete()
await cacheManager.delete(cacheName);
ข้อควรพิจารณาเพิ่มเติม
โปรดคำนึงถึงข้อควรพิจารณาต่อไปนี้เมื่อใช้การแคชบริบท
- จํานวนโทเค็นอินพุตขั้นต่ำสําหรับการแคชบริบทคือ 32,768 และสูงสุดจะเท่ากับจํานวนสูงสุดของโมเดลนั้นๆ (โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับโทเค็นการนับที่คำแนะนำเกี่ยวกับโทเค็น)
- โมเดลนี้ไม่ได้แยกความแตกต่างระหว่างโทเค็นที่แคชไว้กับโทเค็นอินพุตปกติ เนื้อหาที่แคชไว้เป็นเพียงคำนำหน้าของพรอมต์
- ไม่มีการจำกัดอัตราหรือการใช้งานพิเศษในการแคชบริบท ระบบจะใช้ขีดจำกัดอัตรามาตรฐานสำหรับ
GenerateContent
และขีดจำกัดโทเค็นจะรวมโทเค็นที่แคชไว้ - ระบบจะแสดงผลจำนวนโทเค็นที่แคชไว้ใน
usage_metadata
จากการดำเนินการสร้าง รับ และแสดงรายการของบริการแคช รวมถึงในGenerateContent
เมื่อใช้แคช