Понимать и считать жетоны

Gemini и другие генеративные модели ИИ обрабатывают ввод и вывод с степенью детализации, называемой токеном .

В этом руководстве объясняется, как получить контекстные окна конкретных моделей , а также как подсчитывать токены для таких вариантов использования, как ввод текста, чат, мультимодальный ввод, а также системные инструкции и инструменты.

О токенах

Токенами могут быть отдельные символы, например z , или целые слова, например cat . Длинные слова разбиваются на несколько токенов. Набор всех токенов, используемых моделью, называется словарем, а процесс разделения текста на токены — токенизацией .

Если включено выставление счетов, стоимость вызова API Gemini частично определяется количеством входных и выходных токенов, поэтому знание того, как подсчитывать токены, может оказаться полезным.

Попробуйте посчитать жетоны в Colab

Посмотреть на ai.google.dev Запустить в Google Colab Посмотреть исходный код на GitHub

Контекстные окна

Модели, доступные через Gemini API, имеют контекстные окна, которые измеряются в токенах. Контекстное окно определяет, какой объем входных данных вы можете предоставить и какой объем выходных данных может сгенерировать модель. Вы можете определить размер контекстного окна с помощью API или просмотрев документацию модели .

В следующем примере вы можете видеть, что модель gemini-1.0-pro-001 имеет ограничение на вход около 30 000 токенов и ограничение на вывод около 2 000 токенов, что означает контекстное окно размером около 32 000 токенов.

model_info = genai.get_model('models/gemini-1.0-pro-001')
(model_info.input_token_limit, model_info.output_token_limit)

# input_token_limit: 30720
# output_token_limit: 2048

Другой пример: если вместо этого вы запросите ограничения токенов для такой модели, как gemini-1.5-flash-001 , вы увидите, что у нее есть контекстное окно размером 2M.

Подсчитайте жетоны

Все входные и выходные данные Gemini API токенизированы, включая текст, файлы изображений и другие нетекстовые модальности.

Подсчитать жетоны можно следующими способами:

  • Вызовите count_tokens с вводом запроса.
    Это возвращает общее количество токенов только во входных данных . Вы можете сделать этот вызов перед отправкой входных данных в модель, чтобы проверить размер ваших запросов.

  • Используйте атрибут usage_metadata в объекте response после вызова generate_content .
    Это возвращает общее количество токенов как на входе, так и на выходе (в частности, prompt_token_count (входные токены) и candidates_token_count (выходные токены)).

Подсчет текстовых жетонов

Вызов count_tokens с текстовым входом возвращает значение total_tokens , которое представляет собой количество токенов текста только во входных данных .

model = genai.GenerativeModel('models/gemini-1.5-flash')
prompt = "The quick brown fox jumps over the lazy dog."

print(model.count_tokens(prompt))

# total_tokens: 10

Если вы вызываете generate_content и используете атрибут usage_metadata в объекте response , вы можете подсчитать общее количество токенов как на входе, так и на выходе . Этот атрибут возвращает как prompt_token_count (входные токены), так и candidates_token_count (выходные токены).

model = genai.GenerativeModel('models/gemini-1.5-flash')
prompt = "The quick brown fox jumps over the lazy dog."

response = model.generate_content(prompt)
print(response.text)
print(response.usage_metadata)

# text output: 'This sentence is an example of a pangram, which is a sentence that contains all of the letters of the alphabet.'
# prompt_token_count: 10
# candidates_token_count: 24

Подсчет многоходовых (чатовых) жетонов

Вызов count_tokens с историей чата возвращает значение total_tokens , которое представляет собой количество токенов текста для каждой роли в чате.

model = genai.GenerativeModel('models/gemini-1.5-flash')
chat = model.start_chat(history=[{'role':'user', 'parts':'Hi my name is Bob'},  {'role':'model', 'parts':'Hi Bob!'}])

model.count_tokens(chat.history)

# total_tokens: 10

Чтобы понять, насколько большим будет ваш следующий диалог, вам нужно добавить его в историю при вызове count_tokens .

model.count_tokens(chat.history + [{'role':'user', 'parts':['What is the meaning of life?']}])

# total_tokens: 17

Подсчитайте мультимодальные токены

Все входные данные в Gemini API токенизированы, включая текст, файлы изображений и другие нетекстовые модальности. Обратите внимание на следующие ключевые моменты высокого уровня, касающиеся токенизации мультимодальных входных данных во время обработки Gemini API:

  • Считается, что изображения имеют фиксированный размер, поэтому они потребляют фиксированное количество токенов (в настоящее время 258 токенов), независимо от их отображения или размера файла.

  • Видео- и аудиофайлы конвертируются в токены по следующим фиксированным скоростям: видео — 263 токена в секунду, аудио — 32 токена в секунду.

Файлы изображений

Во время обработки API Gemini считает, что изображения имеют фиксированный размер, поэтому они потребляют фиксированное количество токенов (в настоящее время 258 токенов), независимо от их отображения или размера файла.

Вызов count_tokens с вводом текста и изображения возвращает значение total_tokens , которое представляет собой объединенное количество токенов текста и изображения только во входных данных .

Обратите внимание, что вы получите одно и то же значение total_tokens независимо от того, используете ли вы файл, загруженный с помощью File API, или предоставляете файл как встроенные данные.

Пример использования загруженного изображения из File API:

model = genai.GenerativeModel('models/gemini-1.5-flash')
prompt = "Tell me about this image"
# An image's token count is always 258 tokens (regardless of its display or file size).
your_image_file = genai.upload_file(path="image.jpg")

print(model.count_tokens([prompt, your_image_file]))

# total_tokens: 263

Пример, предоставляющий изображение как встроенные данные:

model = genai.GenerativeModel('models/gemini-1.5-flash')
prompt = "Tell me about this image"
# An image's token count is always 258 tokens (regardless of its display or file size).
your_image_file = # get image ...

model.count_tokens([prompt, your_image_file])

# total_tokens: 263

Видео или аудио файлы

Аудио и видео конвертируются в токены по следующим фиксированным ставкам:

  • Видео: 263 токена в секунду
  • Аудио: 32 токена в секунду

Вызов count_tokens с входным текстом и видео/аудио возвращает значение total_tokens , которое представляет собой объединенное количество токенов текста и видео/аудиофайла только во входных данных .

model = genai.GenerativeModel('models/gemini-1.5-flash')
prompt = "Tell me about this video"
# A video or audio file is converted to tokens at a fixed rate of tokens per second.
your_media_file = genai.upload_file(path="sample.mp4")

print(model.count_tokens([prompt, your_media_file]))

# total_tokens: 83552

Системные инструкции и инструменты

Системные инструкции и инструменты также учитываются при подсчете общего количества токенов для ввода.

В этом примере в запрос включено только текстовое приглашение. Обратите внимание на количество total_tokens .

model = genai.GenerativeModel('models/gemini-1.5-flash')
prompt = "The quick brown fox jumps over the lazy dog."

model.count_tokens(prompt)

# total_tokens: 10

Если вы используете системные инструкции, количество total_tokens увеличивается, отражая добавление system_instruction .

model = genai.GenerativeModel(model_name='gemini-1.5-flash',
                              system_instruction='Talk like a pirate!')
prompt = "The quick brown fox jumps over the lazy dog."

model.count_tokens(prompt)

# total_tokens: 15

Если вы используете вызов функции, счетчик total_tokens увеличивается, отражая добавление tools .

def add(a:float, b:float):
    """returns a + b."""
    return a+b

def subtract(a:float, b:float):
    """returns a - b."""
    return a-b

def multiply(a:float, b:float):
    """returns a * b."""
    return a*b

def divide(a:float, b:float):
    """returns a / b."""
    return a*b

model = genai.GenerativeModel(model_name='gemini-1.5-flash',
                              tools=[add, subtract, multiply, divide])
prompt = "The quick brown fox jumps over the lazy dog."

model.count_tokens(prompt)

# total_tokens: 194

дальнейшее чтение

Дополнительную информацию о подсчете токенов см. в справочнике по API.