NLP(五十四)tiktoken的使用

news2024/11/24 8:36:20

  tiktoken是OpenAI于近期开源的Python第三方模块,该模块主要实现了tokenizer的BPE(Byte pair encoding)算法,并对运行性能做了极大的优化。本文将介绍tiktoken模块的使用。

tiktoken简介

  BPE(Byte pair encoding)算法是NLP中常见的tokenizer方式,关于其介绍和实现原理,读者可参考深入理解NLP Subword算法:BPE、WordPiece、ULM。
  tiktoken已开源至Github,访问网址为:https://github.com/openai/tiktoken,tiktoken会比其它开源的tokenizer库运行快3-6倍,以下是它与hugging face的tokenizer库的性能比较:
不同线程数下tiktoken与hugging face的性能比较
以上结果是使用GPT-2 tokenizer在1G文本上进行的性能测试,使用的GPT2TokenizerFast来源于tokenizers==0.13.2, transformers==4.24.0 , tiktoken==0.2.0

简单使用

  tiktoken的Encodings(编码方式)用于展示文本是如何被转化为token的。不同的模型使用不同类型的编码方式。tiktoken支持如下三种OpenAI模型的编码方式:

编码方式OpenAI模型
cl100k_basegpt-4, gpt-3.5-turbo, text-embedding-ada-002
p50k_baseCodex模型,如 text-davinci-002, text-davinci-003
r50k_base (或gpt2)GPT-3模型,如davinci

可以通过如下代码来获取模型的编码方式:

# -*- coding: utf-8 -*-
import tiktoken

# get encoding name
print(tiktoken.encoding_for_model('gpt-3.5-turbo'))

输出结果为:

<Encoding 'cl100k_base'>

注意,p50k_baser50k_base基本类似,在非代码应用中,它们通常会给出相同的token。
  cl100k_base中的100k代码该编码方式中的词汇表数量大约为100k,词汇表文件为cl100k_base_vocab.json,下载网址为:https://raw.githubusercontent.com/weikang-wang/ChatGPT-Vocabulary/main/cl100k_base_vocab.json,词汇数量为100256,如此庞大的词汇数量使得OpenAI模型在多种语言上都有不俗的表现。

编码与解码

  编码(encode)是指将文本映射为token的数字列表,解码(decode)是指将token的数字列表转化为文本。参看以下的Python代码实现:

# -*- coding: utf-8 -*-
import tiktoken

# simple test
enc = tiktoken.get_encoding("cl100k_base")
print(enc.encode("hello world") == [15339, 1917])
print(enc.decode([15339, 1917]) == "hello world")
print(enc.encode("hello <|endoftext|>", allowed_special="all") == [15339, 220, 100257])

# encode
tokens = enc.encode("tiktoken is great!")
print(tokens)
print(len(tokens))

# decode
print(enc.decode([83, 1609, 5963, 374, 2294, 0]))

# chinese encode
tokens = enc.encode("大模型是什么?")
print(tokens)
print(len(tokens))

# chinese decode
print(enc.decode([27384, 54872, 25287, 21043, 6271, 222, 82696, 11571]))

输出结果如下:

True
True
True
[83, 1609, 5963, 374, 2294, 0]
6
tiktoken is great!
[27384, 54872, 25287, 21043, 6271, 222, 82696, 11571]
8
大模型是什么?

计算token数量

  OpenAI模型中token数量较为关键,毕竟,OpenAI接口调用的收费方式是按照token数量来的。关于OpenAI接口调用的收费方式,可以参考网站:https://openai.com/pricing。
  下面是用tiktoken来计算token数量的Python代码:

# -*- coding: utf-8 -*-
import tiktoken


def num_tokens_from_string(string: str, encoding_name: str) -> int:
    # Returns the number of tokens in a text string.
    encoding = tiktoken.get_encoding(encoding_name)
    num_tokens = len(encoding.encode(string))
    return num_tokens


print(num_tokens_from_string('tiktoken is great!', 'cl100k_base'))
print(num_tokens_from_string('大模型是什么?', 'cl100k_base'))

输出结果为:

6
8

  在hugging face网站上,已经有人实现了tiktoken的token数量计算,访问网站为:https://huggingface.co/spaces/JacobLinCool/tiktoken-calculator ,页面如下:
tiktoken的token数量计算
  在对话补全(chat completion)场景中计算token数量,以模型gpt-3.5-turbo为例,实现Python代码如下:

# -*- coding: utf-8 -*-
import tiktoken
import openai


def num_tokens_from_messages(messages):
    # Returns the number of tokens used by a list of messages.
    encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")
    tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\n
    tokens_per_name = -1  # if there's a name, the role is omitted
    num_tokens = 0
    for message in messages:
        num_tokens += tokens_per_message
        for key, value in message.items():
            num_tokens += len(encoding.encode(value))
            if key == "name":
                num_tokens += tokens_per_name
    num_tokens += 3  # every reply is primed with <|start|>assistant<|message|>
    return num_tokens

example_messages = [
    {
        "role": "system",
        "content": "You are a helpful, pattern-following assistant that translates corporate jargon into plain English.",
    },
    {
        "role": "system",
        "name": "example_user",
        "content": "New synergies will help drive top-line growth.",
    },
    {
        "role": "system",
        "name": "example_assistant",
        "content": "Things working well together will increase revenue.",
    },
    {
        "role": "system",
        "name": "example_user",
        "content": "Let's circle back when we have more bandwidth to touch base on opportunities for increased leverage.",
    },
    {
        "role": "system",
        "name": "example_assistant",
        "content": "Let's talk later when we're less busy about how to do better.",
    },
    {
        "role": "user",
        "content": "This late pivot means we don't have time to boil the ocean for the client deliverable.",
    },
]


# example token count from the function defined above
print(f"{num_tokens_from_messages(example_messages)} prompt tokens counted by num_tokens_from_messages().")
# example token count from the OpenAI API
openai.api_key = ""
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=example_messages,
    temperature=0,
    max_tokens=1
)
print(f'{response["usage"]["prompt_tokens"]} prompt tokens counted by the OpenAI API.')

输出结果如下:

127 prompt tokens counted by num_tokens_from_messages().
127 prompt tokens counted by the OpenAI API.

可见,在num_tokens_from_messages中,对于输入messages中的每条message,token数量先加上4,然后对字典中的value值进行token数量统计,如果此时对应的key为name,则token数量减1,因为要忽略role字段的token数量。在模型gpt-3.5-turbo中,num_tokens_from_messages函数与OpenAI对话补全中的token数量计算方式是一致的。

总结

  本文介绍了tiktoken模型和它的简单使用,以及token数量计算方式。

参考文献

  1. 深入理解NLP Subword算法:BPE、WordPiece、ULM: https://zhuanlan.zhihu.com/p/86965595
  2. tiktoken的Github网址:https://github.com/openai/tiktoken
  3. tiktoken-calculator: https://huggingface.co/spaces/JacobLinCool/tiktoken-calculator
  4. How_to_count_tokens_with_tiktoken.ipynb: https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/599835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis系列---Redis网络模型1

我们都知道&#xff0c;redis的高性能是具有多方面的因数&#xff0c;如&#xff1a;运行在内存上&#xff0c;单线程命令&#xff0c;io多路复用技术等&#xff0c;对于redis高性能的探究&#xff0c;就需要深入的研究其工作原理&#xff0c;这就涉及到redis的网络模型了&…

python实现单链表、双链表、反转链表(二)

一、链表概述 链表是有元素组成的数据结构&#xff0c;每个元素都是单独对象&#xff0c;包含数据和指针信息 链表中的每个元素称为节点&#xff0c;如下所示&#xff0c;第一个节点称为Head(头节点)&#xff0c;为链表的入口点&#xff0c;如果链表为空&#xff0c;则Head指…

Vue.js 比较重要知识点总结二

概述 vue3 组合式API生命周期钩子函数有变化吗&#xff1f;Composition API 与 Options API 有什么区别&#xff1f;watch 和 watchEffect 的区别&#xff1f;vue2 如何升级到 vue3 ? vue3 组合式API生命周期钩子函数有变化吗&#xff1f; 选项式API 和 组合式API 生命周期…

Java的继承性

1.为什么要有类的继承性&#xff1f;(继承性的好处&#xff09; ① 减少了代码的冗余&#xff0c;提高了代码的复用性② 便于功能的扩展③ 为之后多态性的使用&#xff0c;提供了前提 2.子类继承父类以后有哪些不同&#xff1f; 2.1体现&#xff1a; 一旦子类A继承父类B以…

汇编基础学习

1. 利用ldr向寄存器里面写较大数据&#xff0c;和设置寄存器的某些位 2. 这个lable 不对呢 验证宏值加载到寄存器里是正确的。 pc 的地址是0x80594 当前pc指针加上宏定义值的地址值。 3 打印字符串 字符串加载了8个字节到寄存器里面&#xff0c; 如何调试打印出来呢&#xff1…

数据库设计的原则有哪些

数据库设计是程序开发的核心部分&#xff0c;标准的数据库设计原则和步骤能有效提高开发进度和效率。 数据库设计(Database Design)是指对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库及其应用系统&#xff0c;使之能够有效地存储数据&#xf…

RK3588平台开发系列讲解(驱动基础篇)中断相关函数

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、获取中断号相关函数二、申请中断函数三、free_irq 函数四、中断处理函数五、中断使能和禁止函数沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 中断有专门的中断子系统,其实现原理很复杂,但是驱…

Git详解——安装、使用、搭建、IDEA集成

Git 看目录&#xff0c;越往后面越重要 目录一、git是什么&#xff1f;二、为什么要使用Git&#xff1f;三、版本控制工具四、git下载安装以及环境配置五、git基本命令六、git项目搭建七、远程仓库怎么搞&#xff1f;git,gitlab,github,gitee区别八、idea集成Git 一、Git是什…

HBase2.2.2安装(单机、伪分布)

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装&#xff08;单机、伪分布&#xff09; Hadoop集群搭建 HBase2.2.2安装&#xff08;单机、伪分布&#xff09; Zookeeper集群搭建 文章目录 系列文章目录前置条件一、HBase2.2.2安装二、配置环境变量1、问题 三、单机模式1、修…

浅谈数字化

一、数字化转型 数字化转型&#xff08;Digital transformation&#xff09;是建立在数字化转换&#xff08;Digitization&#xff09;、数字化升级&#xff08;Digitalization&#xff09;基础上&#xff0c;进一步触及公司核心业务&#xff0c;以新建一种商业模式为目标的高…

仙人掌之歌——权力的游戏(3)

像疯子一样死去 陈速没想到李通是在香山深处一所疗养院里休养&#xff0c;军方的岗位森严&#xff0c;进去还得把身份证押在门卫室。李通穿着病号服悠哉地晃过来把陈速领了进去。 “通哥&#xff0c;这儿真是个好地方啊。” 陈速由衷地赞叹着&#xff0c;望着大院里古树参天&…

九、Spring Cloud—gateway网关

一、引言 每个微服务都需和前端进行通信&#xff0c;解决每个微服务请求时的鉴权、限流、权限校验、跨域等逻辑&#xff0c;放在一个统一的地方进行使用。 在微服务架构中&#xff0c;网关是一个重要的组件&#xff0c;它作为系统的入口&#xff0c;负责接收所有的客户端请求…

Shiro高级及SaaS-HRM的认证授权

Shiro高级及SaaS-HRM的认证授权 Shiro在SpringBoot工程的应用 Apache Shiro是一个功能强大、灵活的&#xff0c;开源的安全框架。它可以干净利落地处理身份验证、授权、企业会话管理和加密。越来越多的企业使用Shiro作为项目的安全框架&#xff0c;保证项目的平稳运行。 在之…

前端042_图表展现_自适应

自适应 当缩小窗口时,饼图和柱状图不会自动自适应,会被遮挡住。因为 ECharts 本身并不是自适应的,当你父级容器的宽度发生变化的时候需要手动调用它的 .resize() 方法。 其中 vue-element-admin项目中已经实现了自适应效果,只要将对应代码拷贝引用即可。将 vue-element-adm…

Java中的this、package、import

this 在Java中&#xff0c;this的作用和其词义很接近。 它在方法内部使用&#xff0c;即这个方法所属对象的引用&#xff1b; 它在构造器内部使用&#xff0c;表示该构造器正在初始化的对象。 this 可以调用类的属性、方法和构造器 什么时候使用this关键字呢&#xff…

使用kettle进行日志分析

分析日志是一个大数据分析中较为常见的场景。在Unix类操作系统里&#xff0c;Syslog广泛被应用于系统或者应用的日志记录中。Syslog通常被记录在本地文件内&#xff0c;比如Ubuntu内为/var/log/syslog文件名&#xff0c;也可以被发送给远程Syslog服务器。Syslog日志内一般包括产…

机构的专属的线上招生 教学小程序搭建教程

小程序已经成为了很多教育机构的招生、推广重要渠道之一。相比于传统的网站或APP而言&#xff0c;小程序更加轻量级&#xff0c;更加易于传播和分享。在小程序搭建过程中&#xff0c;无需编写复杂的代码&#xff0c;只需要根据模板进行简单的操作&#xff0c;就可以轻松打造自己…

【Web开发技术】JWT令牌技术(信息安全)

文章目录 一、描述二、依赖三、配置四、java文件中的准备五、开始使用 一、描述 说到JWT令牌技术&#xff0c;就需要提到cookie和session两种技术。这两种技术在跨域问题&#xff08;计算机网络的知识&#xff0c;百度可以搜到&#xff0c;就回归重点&#xff09;上存在一定的局…

《智能新工厂规划白皮书》下 | “四步”规划智能工厂

中国制造业有着最大制造产能、最强配套能力和最大消费市场三个无可比拟的优势&#xff0c;随着产能升级&#xff0c;众企业的新工厂会开展智能工厂规划布局&#xff0c;从而实现降本减耗、提高效益的经营目标&#xff0c;以增强企业市场竞争力。 新工厂规划时&#xff0c;企业…

【GitHub已开源】某博热点事件评论数据分析与用户情感分析平台完整项目

找遍全网无奈只能自己开发某博热点评论数据爬取与用户情感分析平台&#xff0c;这就是技术人的创新&#xff01; 最近想看一下微博热点评论的用户人群情感趋势&#xff0c;想到的就是去爬取某博的评论数据&#xff0c;然后进行一个可视化的情感分析。想想吧&#xff0c;这个项目…