为了账号安全,请及时绑定邮箱和手机立即绑定

本地计算 Gemini 文本Token数量

A felt toy robot counting tokens

现在 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 数量的好处:了解这些 "token" 的数量能带来什么好处:

知道你的文本包含多少token可以帮你做到以下几点:

  • ✅ 确定您的文本输入是否会由模型处理。例如,Gemini 1.0 Pro 支持最多 32,760 个输入 token,而 Gemini 1.5 Pro 目前接受最多 2,097,152 个输入 token。
  • ✅ 根据 token 计算或估算成本(Gemini 的定价是每 1000 个字符收费)。
  • ✅ 在开始接收回复之前,估算处理您的文本输入所需的时间(处理时间大致与处理的 token 数量成正比)。

你现在有了一个新的本地工具,可以在向Gemini发送请求之前管理你的输入数据。

👋 跟着我, Twitter LinkedIn 了解更多云探索

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消