当前位置: 首页 > news >正文

AI大模型应用开发实践:3.使用 tiktoken 计算 token 数量

使用 tiktoken 计算 token 数量

tiktoken是OpenAI开发的一种BPE分词器。

给定一段文本字符串(例如,"tiktoken is great!")和一种编码方式(例如,"cl100k_base"),分词器可以将文本字符串切分成一系列的token(例如,["t", "ik", "token", " is", " great", "!"])。

将文本字符串切分成token非常有用,因为GPT模型看到的文本就是以token的形式呈现的。知道一段文本字符串中有多少个token可以告诉你(a)这个字符串是否对于文本模型来说太长了而无法处理,以及(b)一个OpenAI API调用的费用是多少(因为使用量是按照token计价的)。

编码方式

编码方式规定了如何将文本转换成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)davinci 这样的GPT-3模型

你可以使用 tiktoken.encoding_for_model() 获取一个模型的编码方式,如下所示:

encoding = tiktoken.encoding_for_model('gpt-3.5-turbo')

注意,p50k_baser50k_base 有很大的重叠,对于非代码应用,它们通常会产生相同的token。

不同语言的分词器库

对于 cl100k_basep50k_base 编码方式:

  • Python: tiktoken
  • .NET / C#: SharpToken, TiktokenSharp
  • Java: jtokkit

对于 r50k_base (gpt2) 编码方式,许多语言都提供了分词器。

  • Python: tiktoken (或者另选 GPT2TokenizerFast)
  • JavaScript: gpt-3-encoder
  • .NET / C#: GPT Tokenizer
  • Java: gpt2-tokenizer-java
  • PHP: GPT-3-Encoder-PHP

(OpenAI对第三方库不做任何背书或保证。)

如何进行通常的分词操作

在英语中,token的长度通常在一个字符到一个单词之间变化(例如,"t"" great"),尽管在某些语言中,token可以比一个字符短或比一个单词长。空格通常与单词的开头一起分组(例如," is" 而不是 "is "" "+"is")。你可以快速在 OpenAI分词器 检查一段字符串如何被分词。

0. 安装 tiktoken

!pip install --upgrade tiktoken
Requirement already satisfied: tiktoken in /home/ubuntu/miniconda3/envs/langchain/lib/python3.10/site-packages (0.6.0)
Requirement already satisfied: regex>=2022.1.18 in /home/ubuntu/miniconda3/envs/langchain/lib/python3.10/site-packages (from tiktoken) (2023.12.25)
Requirement already satisfied: requests>=2.26.0 in /home/ubuntu/miniconda3/envs/langchain/lib/python3.10/site-packages (from tiktoken) (2.31.0)
Requirement already satisfied: charset-normalizer<4,>=2 in /home/ubuntu/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (3.3.2)
Requirement already satisfied: idna<4,>=2.5 in /home/ubuntu/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (3.6)
Requirement already satisfied: urllib3<3,>=1.21.1 in /home/ubuntu/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (2.2.1)
Requirement already satisfied: certifi>=2017.4.17 in /home/ubuntu/miniconda3/envs/langchain/lib/python3.10/site-packages (from requests>=2.26.0->tiktoken) (2024.2.2)

1. Import tiktoken

import tiktoken

2. Load an encoding

使用tiktoken.get_encoding()按名称加载编码。

第一次运行时,它将需要互联网连接进行下载。后续运行不需要互联网连接。

encoding = tiktoken.get_encoding("cl100k_base")

使用tiktoken.encoding_for_model()函数可以自动加载给定模型名称的正确编码。

encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")

3. Turn text into tokens with encoding.encode()

The .encode() method converts a text string into a list of token integers.

encoding.encode("tiktoken is great!")
[83, 1609, 5963, 374, 2294, 0]

通过计算.encode()返回的列表的长度来统计token数量。

def num_tokens_from_string(string: str, encoding_name: str) -> 

相关文章:

  • SQL 面试系列(一)【留存率问题】
  • 【论文笔记】Attention is All You Need(NIPS’17)
  • 递增链表去重
  • 【WEEK13】 【DAY3】Shiro第三部分【中文版】
  • SSL证书制作及nginx部署
  • 局域网传文件怎么操作?轻松实现文件共享!
  • 用Python的PyAutoGUI库控制鼠标滚轮
  • 深度学习之基于TensorFlow人脸表情识别
  • 用C语言把一棵普通二叉树安排得明明白白
  • 【重学C++】02 脱离指针陷阱:深入浅出 C++ 智能指针
  • 掌握Edge浏览器的使用技巧
  • HarmonyOS开发之DevEco Studio安装
  • 前端面试项目细节重难点(已工作|做分享)
  • 循环双链表算法库构建
  • 解决 VSCode 编辑器点击【在集成终端中打开】出现新的弹框
  • @jsonView过滤属性
  • Akka系列(七):Actor持久化之Akka persistence
  • Angular2开发踩坑系列-生产环境编译
  • gops —— Go 程序诊断分析工具
  • java8 Stream Pipelines 浅析
  • jdbc就是这么简单
  • JDK 6和JDK 7中的substring()方法
  • LintCode 31. partitionArray 数组划分
  • Map集合、散列表、红黑树介绍
  • MQ框架的比较
  • mysql常用命令汇总
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • npx命令介绍
  • Python学习笔记 字符串拼接
  • socket.io+express实现聊天室的思考(三)
  • 安装python包到指定虚拟环境
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 高度不固定时垂直居中
  • 简单实现一个textarea自适应高度
  • 模仿 Go Sort 排序接口实现的自定义排序
  • 如何设计一个微型分布式架构?
  • ​io --- 处理流的核心工具​
  • ​批处理文件中的errorlevel用法
  • #100天计划# 2013年9月29日
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (arch)linux 转换文件编码格式
  • (C语言)共用体union的用法举例
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)ssm基于web技术的医务志愿者管理系统 毕业设计 100910
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (四)库存超卖案例实战——优化redis分布式锁
  • (文章复现)基于主从博弈的售电商多元零售套餐设计与多级市场购电策略
  • (新)网络工程师考点串讲与真题详解
  • .Net 6.0 处理跨域的方式
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .NET 解决重复提交问题
  • .NET 快速重构概要1
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .net6+aspose.words导出word并转pdf