Lưu ngữ cảnh vào bộ nhớ đệm

Trong quy trình làm việc AI thông thường, bạn có thể truyền đi truyền lại các mã thông báo đầu vào giống nhau cho một mô hình. Khi sử dụng tính năng lưu ngữ cảnh API Gemini vào bộ nhớ đệm, bạn có thể truyền một số nội dung vào mô hình một lần, lưu mã thông báo đầu vào vào bộ nhớ đệm, sau đó tham chiếu đến các mã thông báo đã lưu vào bộ nhớ đệm cho các yêu cầu tiếp theo. Ở một số số lượng nhất định, việc sử dụng mã thông báo đã lưu vào bộ nhớ đệm sẽ có chi phí thấp hơn so với việc truyền nhiều lần trong cùng một tập hợp mã thông báo.

Khi lưu một tập hợp mã thông báo vào bộ nhớ đệm, bạn có thể chọn khoảng thời gian bạn muốn bộ nhớ đệm tồn tại trước khi các mã thông báo đó tự động bị xoá. Khoảng thời gian lưu vào bộ nhớ đệm này được gọi là thời gian tồn tại (TTL). Nếu bạn không đặt giá trị này, TTL sẽ mặc định là 1 giờ. Chi phí lưu vào bộ nhớ đệm phụ thuộc vào kích thước mã thông báo đầu vào và khoảng thời gian bạn muốn mã thông báo tồn tại.

Tính năng lưu ngữ cảnh vào bộ nhớ đệm hỗ trợ cả Gemini 1.5 Pro và Gemini 1.5 Flash.

Trường hợp sử dụng tính năng lưu vào bộ nhớ đệm theo bối cảnh

Việc lưu ngữ cảnh vào bộ nhớ đệm đặc biệt phù hợp với các trường hợp mà một ngữ cảnh ban đầu đáng kể được tham chiếu nhiều lần bằng các yêu cầu ngắn hơn. Hãy cân nhắc sử dụng tính năng lưu vào bộ nhớ đệm theo ngữ cảnh cho các trường hợp sử dụng như:

  • Bot trò chuyện kèm theo hướng dẫn chuyên sâu về hệ thống
  • Phân tích lặp lại các tệp video dài
  • Truy vấn định kỳ đối với các tập hợp tài liệu lớn
  • Thường xuyên phân tích kho lưu trữ mã hoặc sửa lỗi

Việc lưu vào bộ nhớ đệm giúp giảm chi phí như thế nào

Lưu vào bộ nhớ đệm ngữ cảnh là một tính năng có tính phí được thiết kế để giảm tổng chi phí vận hành. Việc thanh toán dựa trên các yếu tố sau:

  1. Số lượng mã thông báo được lưu vào bộ nhớ đệm: Số lượng mã thông báo đầu vào được lưu vào bộ nhớ đệm, được tính phí theo mức giá giảm khi được đưa vào các lời nhắc tiếp theo.
  2. Thời lượng lưu trữ: Khoảng thời gian lưu trữ mã thông báo được lưu vào bộ nhớ đệm (TTL), được tính phí dựa trên thời lượng TTL của số lượng mã thông báo được lưu vào bộ nhớ đệm. Không có giới hạn tối thiểu hoặc tối đa nào trên TTL.
  3. Các yếu tố khác: Có áp dụng các khoản phí khác, chẳng hạn như mã thông báo đầu vào và mã thông báo đầu ra không được lưu vào bộ nhớ đệm.

Để biết thông tin mới nhất về giá, hãy tham khảo trang giá của Gemini API. Để tìm hiểu cách đếm mã thông báo, hãy xem Hướng dẫn về mã thông báo.

Cách sử dụng tính năng lưu vào bộ nhớ đệm ngữ cảnh

Phần này giả định rằng bạn đã cài đặt SDK Gemini (hoặc đã cài đặt curl) và đã định cấu hình khoá API, như trong phần bắt đầu nhanh.

Tạo nội dung bằng bộ nhớ đệm

Ví dụ sau đây cho thấy cách tạo nội dung bằng cách sử dụng tệp video và hướng dẫn được lưu vào bộ nhớ đệm.

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

Liệt kê bộ nhớ đệm

Không thể truy xuất hoặc xem nội dung đã lưu vào bộ nhớ đệm, nhưng bạn có thể truy xuất siêu dữ liệu trong bộ nhớ đệm (name, model, displayName, usageMetadata, createTime, updateTimeexpireTime).

Để liệt kê siêu dữ liệu cho tất cả bộ nhớ đệm đã tải lên, hãy sử dụng GoogleAICacheManager.list():

const listResult = await cacheManager.list();
listResult.cachedContents.forEach((cache) => {
  console.log(cache);
});

Cập nhật bộ nhớ đệm

Bạn có thể đặt ttl hoặc expireTime mới cho bộ nhớ đệm. Không hỗ trợ thay đổi bất kỳ nội dung nào khác về bộ nhớ đệm.

Ví dụ sau đây cho biết cách cập nhật ttl của bộ nhớ đệm bằng cách sử dụng GoogleAICacheManager.update().

const ttlSeconds = 2 * 60 * 60;
const updateParams = { cachedContent: { ttlSeconds } };
const updatedCache = await cacheManager.update(cacheName, updateParams);

Xoá bộ nhớ đệm

Dịch vụ lưu vào bộ nhớ đệm cung cấp thao tác xoá để xoá nội dung khỏi bộ nhớ đệm theo cách thủ công. Ví dụ sau đây cho biết cách xoá bộ nhớ đệm bằng GoogleAICacheManager.delete().

await cacheManager.delete(cacheName);

Các yếu tố cần cân nhắc khác

Hãy lưu ý những điều sau khi sử dụng tính năng lưu vào bộ nhớ đệm ngữ cảnh:

  • Số lượng mã thông báo đầu vào tối thiểu để lưu vào bộ nhớ đệm theo ngữ cảnh là 32.768 và tối đa bằng với số lượng tối đa cho mô hình đã cho. (Để biết thêm thông tin về cách đếm mã thông báo, hãy xem phần Hướng dẫn về mã thông báo).
  • Mô hình này không tạo ra sự khác biệt nào giữa mã thông báo được lưu vào bộ nhớ đệm và mã thông báo đầu vào thông thường. Nội dung được lưu vào bộ nhớ đệm chỉ là tiền tố cho lời nhắc.
  • Không có giới hạn về tốc độ hoặc giới hạn sử dụng đặc biệt đối với việc lưu ngữ cảnh vào bộ nhớ đệm; các giới hạn tốc độ tiêu chuẩn cho GenerateContent sẽ áp dụng và giới hạn mã thông báo bao gồm cả mã thông báo được lưu vào bộ nhớ đệm.
  • Số lượng mã thông báo đã lưu vào bộ nhớ đệm được trả về trong usage_metadata từ các thao tác tạo, lấy và liệt kê của dịch vụ bộ nhớ đệm, cũng như trong GenerateContent khi dùng bộ nhớ đệm.