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 os
import google.generativeai as genai
from google.generativeai import caching
import datetime
import time

# Get your API key from https://aistudio.google.com/app/apikey
# and access your API key as an environment variable.
# To authenticate from a Colab, see
# https://github.com/google-gemini/cookbook/blob/main/quickstarts/Authentication.ipynb
genai.configure(api_key=os.environ['API_KEY'])

# Download video file
# curl -O https://storage.googleapis.com/generativeai-downloads/data/Sherlock_Jr_FullMovie.mp4

path_to_video_file = 'Sherlock_Jr_FullMovie.mp4'

# Upload the video using the Files API
video_file = genai.upload_file(path=path_to_video_file)

# Wait for the file to finish processing
while video_file.state.name == 'PROCESSING':
  print('Waiting for video to be processed.')
  time.sleep(2)
  video_file = genai.get_file(video_file.name)

print(f'Video processing complete: {video_file.uri}')

# Create a cache with a 5 minute TTL
cache = caching.CachedContent.create(
    model='models/gemini-1.5-flash-001',
    display_name='sherlock jr movie', # used to identify the cache
    system_instruction=(
        '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.'
    ),
    contents=[video_file],
    ttl=datetime.timedelta(minutes=5),
)

# Construct a GenerativeModel which uses the created cache.
model = genai.GenerativeModel.from_cached_content(cached_content=cache)

# Query the model
response = model.generate_content([(
    'Introduce different characters in the movie by describing '
    'their personality, looks, and names. Also list the timestamps '
    'they were introduced for the first time.')])

print(response.usage_metadata)

# The output should look something like this:
#
# prompt_token_count: 696219
# cached_content_token_count: 696190
# candidates_token_count: 214
# total_token_count: 696433

print(response.text)

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

Bạn không thể truy xuất hoặc xem nội dung được lưu vào bộ nhớ đệm, nhưng có thể truy xuất siêu dữ liệu bộ nhớ đệm (name, model, display_name, usage_metadata, create_time, update_timeexpire_time).

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

for c in caching.CachedContent.list():
  print(c)

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

Bạn có thể đặt một ttl hoặc expire_time 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 CachedContent.update().

import datetime

cache.update(ttl=datetime.timedelta(hours=2))

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 trình bày cách xoá bộ nhớ đệm bằng CachedContent.delete().

cache.delete()

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.