现在 Python 的 Vertex AI SDK 提供了本地分词功能。此功能让你可以在向 Gemini 发送请求前,先计算文本输入中的 token 数量。让我们看看这个功能是如何工作的。
🧩 代币是什么?大型语言模型(LLMs)的基本单位是词元。换句话说,它们会处理输入的词元并生成输出的词元。
一个文本令牌可以代表字符、单词或短语。在英文文本中,平均一个标记大约代表四个字符。当你向Gemini发送查询请求时,你的文本输入会被转换成令牌。这一步称为标记化。Gemini生成输出令牌,这些标记会通过反向操作转换回文本。
📦 开始安装 Vertex AI SDK要使用 Gemini 分词器,你需要最新带有 tokenization
扩展的 google-cloud-aiplatform
包。
pip install --upgrade google-cloud-aiplatform[tokenization]
运行此命令以安装和升级包含 tokenization 功能的 google-cloud-aiplatform 包。
确保你安装了 1.57.0
或更高版本。
要检查已安装的包信息,请运行以下命令:
pip show google-cloud-aiplatform
名称: google-cloud-aiplatform
版本号: 1.57.0
...
🧮 本地计数
为你要使用的Gemini模型创建一个分词器,然后对你的输入文本调用count_tokens()
方法。
从vertexai.preview导入tokenization模块
model_name = "gemini-1.5-flash-001"
tokenizer = tokenization.get_tokenizer_for_model(model_name)
contents = "Hello World!"
result = tokenizer计算内容中的token数(contents)
# 打印总token数
print(f"总token数 = {result.total_tokens:,}")
// result的total_tokens属性值为3
现在,我们来试试一个更大的文档吧。
import http.client
import typing
import urllib.request
def download_text_from_url(url: str) -> str:
# 从指定URL下载文本内容并返回
with urllib.request.urlopen(url) as response:
response = typing.cast(http.client.HTTPResponse, response)
encoding = response.headers.get_content_charset() or "utf-8"
return response.read().decode(encoding)
url = "https://storage.googleapis.com/dataflow-samples/shakespeare/hamlet.txt"
contents = download_text_from_url(url)
result = tokenizer.count_tokens(contents)
print(f"总词数为:{result.total_tokens:,}")
结果的总 token 数为 53824
🚀 完美!令牌数几乎是一瞬间计算出来的。
🖼️ # 多种输入方式在测试版(1.57.0)中,本地计数功能仅能处理文本输入。
对于多模态的输入资料(图像、视频、音频、文档),请查阅相关文档了解各种媒体类型的标记数量详情,以了解它们如何计算不同的标记数量。
在所有情况下,您可以像往常一样使用Vertex AI API发送请求。
import vertexai
from vertexai.generative_models import GenerativeModel
# 设置项目ID "PROJECT_ID"
# 设置位置 "us-central1"
# vertexai.init(project=project_id, location=location)
model = GenerativeModel(model_name) # 创建生成模型实例
response = model.count_tokens(contents)
print(f"{response.total_tokens = :,}") # 打印总令牌数
print(f"{response.total_billable_characters = :,}") # 打印总计费字符数
总令牌数为 53,824。
总可计费字符数为 144,443。
🔍 探秘幕后
文本分词器使用一个固定的数据文件,也称为LLM词汇表。这个词汇表决定了如何将文本字符串编码为一系列标记,以及如何将一系列标记解码为文本字符串。
下面咱们来看看幕后发生了什么:
- 当你第一次为你的模型请求分词器时,大型语言模型的词汇表会被下载并本地缓存。在后续调用时,会使用缓存的数据。
- 当你调用
tokenizer.count_tokens(contents)
时,文本会被分词(被转化为一系列的词元),并返回相应的词元数。
需要记住的关键点有:
- 💡 对于 Gemini 1.0 和 1.5 版本,LLM 的词汇表大小仅为大约 4 MB 左右。
- 💡 不同的 Gemini 模型可能使用同一个分词器,但这并不一定。确保你获取到适合你所用模型的分词器。
知道你的文本包含多少token可以帮你做到以下几点:
- ✅ 确定您的文本输入是否会由模型处理。例如,Gemini 1.0 Pro 支持最多 32,760 个输入 token,而 Gemini 1.5 Pro 目前接受最多 2,097,152 个输入 token。
- ✅ 根据 token 计算或估算成本(Gemini 的定价是每 1000 个字符收费)。
- ✅ 在开始接收回复之前,估算处理您的文本输入所需的时间(处理时间大致与处理的 token 数量成正比)。
你现在有了一个新的本地工具,可以在向Gemini发送请求之前管理你的输入数据。
共同学习,写下你的评论
评论加载中...
作者其他优质文章