Tìm hiểu và tính mã thông báo


Gemini và các mô hình AI tạo sinh khác xử lý dữ liệu đầu vào và đầu ra ở mức độ chi tiết được gọi là mã thông báo.

Giới thiệu về mã thông báo

Mã thông báo có thể là các ký tự đơn như z hoặc toàn bộ từ như cat. Các từ dài được chia thành nhiều mã thông báo. Tập hợp tất cả các mã thông báo mà mô hình sử dụng được gọi là từ vựng và quy trình phân chia văn bản thành mã thông báo được gọi là mã hoá.

Đối với các mô hình Gemini, một mã thông báo tương đương với khoảng 4 ký tự. 100 mã thông báo tương đương với khoảng 60 đến 80 từ tiếng Anh.

Khi bật tính năng thanh toán, chi phí của một lệnh gọi đến Gemini API sẽ được xác định một phần dựa trên số lượng mã thông báo đầu vào và đầu ra. Vì vậy, việc biết cách đếm mã thông báo có thể hữu ích.

Thử đếm mã thông báo trong Colab

Bạn có thể dùng Colab để thử đếm số lượng mã thông báo.

Xem trên ai.google.dev Dùng thử sổ tay Colab Xem sổ tay trên GitHub

Cửa sổ ngữ cảnh

Các mô hình có sẵn thông qua Gemini API có cửa sổ ngữ cảnh được đo bằng token. Cửa sổ ngữ cảnh xác định lượng dữ liệu đầu vào mà bạn có thể cung cấp và lượng dữ liệu đầu ra mà mô hình có thể tạo. Bạn có thể xác định kích thước của cửa sổ ngữ cảnh bằng cách gọi điểm cuối getModels hoặc bằng cách xem trong tài liệu về các mô hình.

Trong ví dụ sau, bạn có thể thấy rằng mô hình gemini-1.5-flash có giới hạn đầu vào là khoảng 1.000.000 token và giới hạn đầu ra là khoảng 8.000 token, tức là cửa sổ ngữ cảnh là 1.000.000 token.

from google import genai

client = genai.Client()
model_info = client.models.get(model="gemini-2.0-flash")
print(f"{model_info.input_token_limit=}")
print(f"{model_info.output_token_limit=}")
# ( e.g., input_token_limit=30720, output_token_limit=2048 )

Đếm mã thông báo

Tất cả dữ liệu đầu vào và đầu ra từ Gemini API đều được mã hoá thành mã thông báo, bao gồm cả văn bản, tệp hình ảnh và các phương thức không phải văn bản khác.

Bạn có thể đếm mã thông báo theo những cách sau:

Đếm mã thông báo văn bản

from google import genai

client = genai.Client()
prompt = "The quick brown fox jumps over the lazy dog."

# Count tokens using the new client method.
total_tokens = client.models.count_tokens(
    model="gemini-2.0-flash", contents=prompt
)
print("total_tokens: ", total_tokens)
# ( e.g., total_tokens: 10 )

response = client.models.generate_content(
    model="gemini-2.0-flash", contents=prompt
)

# The usage_metadata provides detailed token counts.
print(response.usage_metadata)
# ( e.g., prompt_token_count: 11, candidates_token_count: 73, total_token_count: 84 )

Đếm mã thông báo nhiều lượt (trò chuyện)

from google import genai
from google.genai import types

client = genai.Client()

chat = client.chats.create(
    model="gemini-2.0-flash",
    history=[
        types.Content(
            role="user", parts=[types.Part(text="Hi my name is Bob")]
        ),
        types.Content(role="model", parts=[types.Part(text="Hi Bob!")]),
    ],
)
# Count tokens for the chat history.
print(
    client.models.count_tokens(
        model="gemini-2.0-flash", contents=chat.get_history()
    )
)
# ( e.g., total_tokens: 10 )

response = chat.send_message(
    message="In one sentence, explain how a computer works to a young child."
)
print(response.usage_metadata)
# ( e.g., prompt_token_count: 25, candidates_token_count: 21, total_token_count: 46 )

# You can count tokens for the combined history and a new message.
extra = types.UserContent(
    parts=[
        types.Part(
            text="What is the meaning of life?",
        )
    ]
)
history = chat.get_history()
history.append(extra)
print(client.models.count_tokens(model="gemini-2.0-flash", contents=history))
# ( e.g., total_tokens: 56 )

Đếm mã thông báo đa phương thức

Mọi dữ liệu đầu vào cho Gemini API đều được mã hoá thành mã thông báo, bao gồm cả văn bản, tệp hình ảnh và các phương thức không phải văn bản khác. Hãy lưu ý những điểm chính sau đây về việc mã hoá dữ liệu đầu vào đa phương thức trong quá trình xử lý bằng Gemini API:

  • Với Gemini 2.0, các hình ảnh đầu vào có cả hai chiều <=384 pixel được tính là 258 mã thông báo. Những hình ảnh có kích thước lớn hơn ở một hoặc cả hai chiều sẽ bị cắt và điều chỉnh tỷ lệ thành các ô có kích thước 768x768 pixel, mỗi ô được tính là 258 mã thông báo. Trước Gemini 2.0, hình ảnh sử dụng 258 mã thông báo cố định.

  • Các tệp video và âm thanh được chuyển đổi thành mã thông báo theo các mức cố định sau: video ở mức 263 mã thông báo mỗi giây và âm thanh ở mức 32 mã thông báo mỗi giây.

Tệp hình ảnh

Ví dụ sử dụng hình ảnh được tải lên từ File API:

from google import genai

client = genai.Client()
prompt = "Tell me about this image"
your_image_file = client.files.upload(file=media / "organ.jpg")

print(
    client.models.count_tokens(
        model="gemini-2.0-flash", contents=[prompt, your_image_file]
    )
)
# ( e.g., total_tokens: 263 )

response = client.models.generate_content(
    model="gemini-2.0-flash", contents=[prompt, your_image_file]
)
print(response.usage_metadata)
# ( e.g., prompt_token_count: 264, candidates_token_count: 80, total_token_count: 345 )

Ví dụ cung cấp hình ảnh dưới dạng dữ liệu nội tuyến:

from google import genai
import PIL.Image

client = genai.Client()
prompt = "Tell me about this image"
your_image_file = PIL.Image.open(media / "organ.jpg")

# Count tokens for combined text and inline image.
print(
    client.models.count_tokens(
        model="gemini-2.0-flash", contents=[prompt, your_image_file]
    )
)
# ( e.g., total_tokens: 263 )

response = client.models.generate_content(
    model="gemini-2.0-flash", contents=[prompt, your_image_file]
)
print(response.usage_metadata)
# ( e.g., prompt_token_count: 264, candidates_token_count: 80, total_token_count: 345 )

Tệp video hoặc âm thanh

Mỗi loại âm thanh và video được chuyển đổi thành mã thông báo theo các mức cố định sau:

  • Video: 263 mã thông báo mỗi giây
  • Âm thanh: 32 mã thông báo mỗi giây
from google import genai
import time

client = genai.Client()
prompt = "Tell me about this video"
your_file = client.files.upload(file=media / "Big_Buck_Bunny.mp4")

# Poll until the video file is completely processed (state becomes ACTIVE).
while not your_file.state or your_file.state.name != "ACTIVE":
    print("Processing video...")
    print("File state:", your_file.state)
    time.sleep(5)
    your_file = client.files.get(name=your_file.name)

print(
    client.models.count_tokens(
        model="gemini-2.0-flash", contents=[prompt, your_file]
    )
)
# ( e.g., total_tokens: 300 )

response = client.models.generate_content(
    model="gemini-2.0-flash", contents=[prompt, your_file]
)
print(response.usage_metadata)
# ( e.g., prompt_token_count: 301, candidates_token_count: 60, total_token_count: 361 )

Hướng dẫn và công cụ hệ thống

Các hướng dẫn và công cụ của hệ thống cũng được tính vào tổng số mã thông báo cho đầu vào.

Nếu bạn sử dụng hướng dẫn hệ thống, số lượng total_tokens sẽ tăng lên để phản ánh việc bổ sung system_instruction.

Nếu bạn sử dụng tính năng gọi hàm, số lượng total_tokens sẽ tăng lên để phản ánh việc bổ sung tools.