iT邦幫忙

2024 iThome 鐵人賽

DAY 22
0
生成式 AI

Gemini 多模態大型語言模型大小事系列 第 22

Gemini 多模態大型語言模型大小事 Day22 - 瞭解及計算符記

  • 分享至 

  • xImage
  •  

前言

    程式環境都會用colab 來執行程式,如果要在其他環境執行,請自行修改哦

colab 事前準備:設定專案和 API 金鑰
載入gemini

#pip install -q -U google-generativeai
import google.generativeai as genai

API 金鑰

from google.colab import userdata
API_KEY=userdata.get('GOOGLE_API_KEY')

#genai.configure(api_key="YOUR_API_KEY")

# Configure the client library by providing your API key.
genai.configure(api_key=API_KEY)

關於權杖

符記可以是單一字元 (例如 z) 或完整的字詞 (例如 cat)。詳細字詞 可分為多個符記模型使用的所有符記集 將文字分割成符記的過程 符記化。

Gemini 模型的符記約為 4 個字元。 100 個符記約等於 60 到 80 個英文單字。

啟用帳單功能後,對 Gemini API 的呼叫費用為 有些部分取決於輸入和輸出符記的數量,因此知道 計算符記就能派上用場

上下文視窗

透過 Gemini API 提供的模型具有以標記來衡量的上下文視窗。上下文視窗定義您可以提供多少輸入以及模型可以產生多少輸出。您可以使用 API 或檢視模型文件來確定上下文視窗的大小。

model_info = genai.get_model("models/gemini-1.5-flash")

# Returns the "context window" for the model,
# which is the combined input and output token limits.
print(f"{model_info.input_token_limit=}")
print(f"{model_info.output_token_limit=}")
# ( input_token_limit=30720, output_token_limit=2048 )

回答
model_info.input_token_limit=1000000
model_info.output_token_limit=8192

計算符記數量

所有從 Gemini API 傳入和輸出的內容都會權杖化,包括文字、圖片 檔案以及其他非文字形式的內容

您可以透過下列方式計算符記:

  • 呼叫 count_tokens,並提供 。
    這會傳回含有 可以先進行此呼叫,再將輸入內容傳送至模型 檢查要求大小

  • 呼叫後,在 response 物件上使用 usage_metadata 屬性 generate_content。
    這會傳回輸入內容和輸出內容中的分詞總數: total_token_count。
    也會分別傳回輸入和輸出內容的符記數量: prompt_token_count (輸入符記) 和 candidates_token_count (輸出符記)。

計算文字符記數量

如果透過純文字輸入內容呼叫 count_tokens,則會傳回符記數量 則用於輸入內容 (total_tokens)。你可以先撥打這通電話,時間早於 呼叫 generate_content 檢查要求大小。

另一種方式是呼叫 generate_content,然後使用 usage_metadata response 物件的屬性,就能取得下列資訊:

  • 輸入內容的個別符記數量 (prompt_token_count) 輸出內容 (candidates_token_count)
  • 輸入內容和輸出內容中的分詞總數 (total_token_count)
model = genai.GenerativeModel("models/gemini-1.5-flash")

prompt = "敏捷的棕色狐狸跳過了那隻懶狗。"

# Call `count_tokens` to get the input token count (`total_tokens`).
print("total_tokens: ", model.count_tokens(prompt))
# ( total_tokens: 10 )

response = model.generate_content(prompt)

# On the response for `generate_content`, use `usage_metadata`
# to get separate input and output token counts
# (`prompt_token_count` and `candidates_token_count`, respectively),
# as well as the combined token count (`total_token_count`).
print(response.usage_metadata)
# ( prompt_token_count: 11, candidates_token_count: 73, total_token_count: 84 )

回答
total_tokens: total_tokens: 12

prompt_token_count: 13
candidates_token_count: 116
total_token_count: 129

計算多輪 (聊天) 符記數量

如果透過即時通訊記錄呼叫 count_tokens,會傳回總權杖 即時通訊中每個角色的文字數量 (total_tokens)。

另一種方式是呼叫 send_message,然後使用 usage_metadata response 物件的屬性,就能取得下列資訊:

  • 輸入內容的個別符記數量 (prompt_token_count) 輸出內容 (candidates_token_count)
  • 輸入內容和輸出內容中的分詞總數 (total_token_count)
    如要瞭解下次對話回合的長度,您需要在 並在呼叫 count_tokens 時納入記錄。
model = genai.GenerativeModel("models/gemini-1.5-flash")

chat = model.start_chat(
    history=[
        {"role": "user", "parts": "嗨,我的名字是凱文"},
        {"role": "model", "parts": "嗨,凱文!"},
    ]
)
# Call `count_tokens` to get the input token count (`total_tokens`).
print(model.count_tokens(chat.history))
# ( total_tokens: 10 )

response = chat.send_message(
    "用一句話向小朋友解釋計算機的工作原理。"
)

# On the response for `send_message`, use `usage_metadata`
# to get separate input and output token counts
# (`prompt_token_count` and `candidates_token_count`, respectively),
# as well as the combined token count (`total_token_count`).
print(response.usage_metadata)
# ( prompt_token_count: 25, candidates_token_count: 21, total_token_count: 46 )

from google.generativeai.types.content_types import to_contents

# You can call `count_tokens` on the combined history and content of the next turn.
print(model.count_tokens(chat.history + to_contents("生命的意義是什麼?")))
# ( total_tokens: 56 )

回答
total_tokens: 14

prompt_token_count: 26
candidates_token_count: 34
total_token_count: 60

total_tokens: 67

計算多模態符記

提供給 Gemini API 的所有輸入內容都會權杖化,包括文字、圖片檔等 非文字形式的組合請注意以下關於權杖化的概略要點 的多模態輸入:

系統會將圖片視為固定大小,因此可耗用一定數量的圖片 符記 (目前 258 個符記),不論其顯示或檔案大小。

影片和音訊檔案會按照下列固定費率轉換為權杖: 每秒有 263 個符記,音訊則每秒 32 個符記

圖片檔
在處理過程中,Gemini API 會將圖片視為固定大小, 使用固定數量的符記 (目前有 258 個符記) 螢幕或檔案大小

如果使用文字和圖片輸入內容呼叫 count_tokens,系統會傳回合併後的 文字和圖像的符記數量僅限輸入內容 (total_tokens)。個人中心 可以先進行此呼叫,再呼叫 generate_content 檢查 要求。您也可以選擇對文字和檔案呼叫 count_tokens 。

另一種方式是呼叫 generate_content,然後使用 usage_metadata response 物件的屬性,就能取得下列資訊:

  • 輸入內容的個別符記數量 (prompt_token_count) 輸出內容 (candidates_token_count)
  • 輸入內容和輸出內容中的分詞總數 (total_token_count)
model = genai.GenerativeModel("models/gemini-1.5-flash")

prompt = "告訴我關於這張圖片的內容"
your_image_file = genai.upload_file(path="/content/moon_text.png")

# Call `count_tokens` to get the input token count
# of the combined text and file (`total_tokens`).
# An image's display or file size does not affect its token count.
# Optionally, you can call `count_tokens` for the text and file separately.
print(model.count_tokens([prompt, your_image_file]))
# ( total_tokens: 263 )

response = model.generate_content([prompt, your_image_file])
response.text
# On the response for `generate_content`, use `usage_metadata`
# to get separate input and output token counts
# (`prompt_token_count` and `candidates_token_count`, respectively),
# as well as the combined token count (`total_token_count`).
print(response.usage_metadata)
# ( prompt_token_count: 264, candidates_token_count: 80, total_token_count: 345 )

回答
total_tokens: 266

prompt_token_count: 267
candidates_token_count: 79
total_token_count: 346

import PIL.Image

model = genai.GenerativeModel("models/gemini-1.5-flash")

prompt = "告訴我關於這張圖片的內容"
your_image_file = PIL.Image.open("/content/moon_text.png")

# Call `count_tokens` to get the input token count
# of the combined text and file (`total_tokens`).
# An image's display or file size does not affect its token count.
# Optionally, you can call `count_tokens` for the text and file separately.
print(model.count_tokens([prompt, your_image_file]))
# ( total_tokens: 263 )

response = model.generate_content([prompt, your_image_file])

# On the response for `generate_content`, use `usage_metadata`
# to get separate input and output token counts
# (`prompt_token_count` and `candidates_token_count`, respectively),
# as well as the combined token count (`total_token_count`).
print(response.usage_metadata)
# ( prompt_token_count: 264, candidates_token_count: 80, total_token_count: 345 )

回答
total_tokens: 266

prompt_token_count: 267
candidates_token_count: 43
total_token_count: 310

影片或音訊檔案

系統每個音訊和影片都會按照下列固定費率轉換為符記:

  • 影片:每秒 263 個符記
  • 音訊:每秒 32 個符記

如果使用文字和影片/音訊輸入內容呼叫 count_tokens,系統會傳回 僅限輸入內容中文字和影片/音訊檔案的綜合符記數量 (total_tokens).您可以先撥打這場通話,再撥號給 generate_content 檢查請求的大小您也可以選擇在以下位置呼叫 count_tokens: 可以分別遷移文字和檔案

另一種方式是呼叫 generate_content,然後使用 usage_metadata response 物件的屬性,就能取得下列資訊:

  • 輸入內容的個別符記數量 (prompt_token_count) 輸出內容 (candidates_token_count)
  • 輸入內容和輸出內容中的分詞總數 (total_token_count)
import time

model = genai.GenerativeModel("models/gemini-1.5-flash")

prompt = "告訴我關於這個影片的內容"
your_file = genai.upload_file(path="/content/Sherlock_Jr_FullMovie.mp4")

# Videos need to be processed before you can use them.
while your_file.state.name == "PROCESSING":
    print("processing video...")
    time.sleep(5)
    your_file = genai.get_file(your_file.name)

# Call `count_tokens` to get the input token count
# of the combined text and video/audio file (`total_tokens`).
# A video or audio file is converted to tokens at a fixed rate of tokens per second.
# Optionally, you can call `count_tokens` for the text and file separately.
print(model.count_tokens([prompt, your_file]))
# ( total_tokens: 300 )

response = model.generate_content([prompt, your_file])

# On the response for `generate_content`, use `usage_metadata`
# to get separate input and output token counts
# (`prompt_token_count` and `candidates_token_count`, respectively),
# as well as the combined token count (`total_token_count`).
print(response.usage_metadata)
# ( prompt_token_count: 301, candidates_token_count: 60, total_token_count: 361 )

回答
processing video...
processing video...
processing video...
processing video...
processing video...
processing video...
processing video...
processing video...
total_tokens: 696168

prompt_token_count: 696169
candidates_token_count: 682
total_token_count: 696851

系統操作說明和工具

系統操作說明和工具也會計入 。

如果您採用系統指令,total_tokens 計數會增加以反映 增加 system_instruction。

model = genai.GenerativeModel(model_name="gemini-1.5-flash")

prompt = "敏捷的棕色狐狸跳過了那隻懶狗。"

print(model.count_tokens(prompt))
# total_tokens: 10

model = genai.GenerativeModel(
    model_name="gemini-1.5-flash", system_instruction="你是一隻貓。你的名字是小灰。"
)

# The total token count includes everything sent to the `generate_content` request.
# When you use system instructions, the total token count increases.
print(model.count_tokens(prompt))
# ( total_tokens: 21 )

回答
total_tokens: 12

total_tokens: 22

如果使用函式呼叫,total_tokens 計數會增加以反映 已新增 tools。

model = genai.GenerativeModel(model_name="gemini-1.5-flash")

prompt = "我有 57 隻貓,每隻貓有 44 隻手套,總共有多少手套?"

print(model.count_tokens(prompt))
# ( total_tokens: 22 )

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(
    "models/gemini-1.5-flash-001", tools=[add, subtract, multiply, divide]
)

# The total token count includes everything sent to the `generate_content` request.
# When you use tools (like function calling), the total token count increases.
print(model.count_tokens(prompt))
# ( total_tokens: 206 )

回答
total_tokens: 26

total_tokens: 210


上一篇
Gemini 多模態大型語言模型大小事 Day21 - 內容快取
下一篇
Gemini 多模態大型語言模型大小事 Day23 - 安全設定
系列文
Gemini 多模態大型語言模型大小事30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言