การแคชบริบท

ในเวิร์กโฟลว์ AI ทั่วไป คุณอาจส่งโทเค็นอินพุตเดียวกันซ้ำๆ ไปยังโมเดล เมื่อใช้ฟีเจอร์การแคชบริบทของ Gemini API คุณสามารถส่งเนื้อหาบางส่วนไปยังโมเดลได้เพียงครั้งเดียว แคชโทเค็นอินพุต แล้วอ้างอิงโทเค็นที่แคชไว้สำหรับคำขอในครั้งต่อๆ ไป ในบางวอลุ่ม การใช้โทเค็นที่แคชไว้จะมีต้นทุนต่ำกว่าการส่งต่อในกลุ่มโทเค็นเดียวกันซ้ำๆ

เมื่อแคชชุดโทเค็น คุณจะเลือกระยะเวลาที่ต้องการให้แคชอยู่ได้ก่อนที่ระบบจะลบโทเค็นโดยอัตโนมัติ ระยะเวลาการแคชนี้เรียกว่า Time to Live (TTL) หากไม่ได้ตั้งค่า TTL ไว้ ระบบจะใช้ค่าเริ่มต้นเป็น 1 ชั่วโมง ค่าใช้จ่ายในการแคชจะขึ้นอยู่กับขนาดของโทเค็นอินพุตและระยะเวลาที่คุณต้องการให้โทเค็นคงอยู่

การแคชบริบทรองรับทั้ง Gemini 1.5 Pro และ Gemini 1.5 Flash

กรณีที่ควรใช้การแคชบริบท

การแคชบริบทเหมาะอย่างยิ่งกับสถานการณ์ที่มีการอ้างอิงบริบทเริ่มต้นจำนวนมากซ้ำๆ โดยคำขอที่สั้นกว่า ลองใช้แคชตามบริบทสําหรับกรณีการใช้งาน เช่น

  • แชทบ็อตที่มีวิธีการของระบบอย่างละเอียด
  • การวิเคราะห์ไฟล์วิดีโอที่มีความยาวซ้ำๆ
  • การค้นหาที่ซ้ำกันกับชุดเอกสารขนาดใหญ่
  • การวิเคราะห์ที่เก็บโค้ดหรือการแก้ไขข้อบกพร่องบ่อยครั้ง

การแคชช่วยลดต้นทุนได้อย่างไร

การแคชบริบทเป็นฟีเจอร์แบบชำระเงินที่ออกแบบมาเพื่อลดต้นทุนในการดำเนินการโดยรวม การเรียกเก็บเงินจะอิงตามปัจจัยต่อไปนี้

  1. จำนวนโทเค็นแคช: จำนวนโทเค็นอินพุตที่แคชไว้ ซึ่งจะเรียกเก็บเงินในอัตราที่ลดลงเมื่อรวมอยู่ในข้อความแจ้งที่ตามมา
  2. ระยะเวลาพื้นที่เก็บข้อมูล: ระยะเวลาที่ระบบจะจัดเก็บโทเค็นที่แคชไว้ (TTL) โดยเรียกเก็บตามระยะเวลา TTL ของจำนวนโทเค็นที่แคชไว้ TTL ไม่มีขีดจำกัดต่ำสุดหรือสูงสุด
  3. ปัจจัยอื่นๆ: จะมีค่าใช้จ่ายอื่นๆ เช่น โทเค็นอินพุตที่ไม่ได้แคชและโทเค็นเอาต์พุต

ดูรายละเอียดราคาล่าสุดได้ที่หน้าราคาของ 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 เมื่อใช้แคช