OpenAI - tiktoken ⏳ | fast BPE tokeniser

文章目录

    • 关于 ⏳ tiktoken
      • 性能表现
      • 安装
      • tiktoken 如何计算 token
      • Encodings
      • Tokenizer libraries 对不同编程语言的支持
      • How strings are typically tokenized
    • 使用
      • 编解码
      • 比较 encodings
      • 计算chat API调用的tokens
      • 拓展 tiktoken


关于 ⏳ tiktoken

tiktoken is a fast BPE tokeniser for use with OpenAI’s models.
初看这个名字,以为是跟 tiktok 相关,没想到是 openai 下面的,这取名还真是有趣呢。

  • github https://github.com/openai/tiktoken
  • openai-cookbook / examples / How_to_count_tokens_with_tiktoken.ipynb
    https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb

性能表现

tiktoken 比其他开源 tokeniser 快 3-6 倍
基于 1GB 文本进行测试,使用 GPT-2 tokeniser,使用 GPT2TokenizerFast from tokenizers==0.13.2, transformers==4.24.0 and tiktoken==0.2.0

在这里插入图片描述


安装

pip install tiktoken 

tiktoken 如何计算 token

给定一个文本字符:"tiktoken is great!",和一个 encoding,比如 "cl100k_base"
一个 tokenizer 可以讲文本字符串分割成一系列 tokens,如: ["t", "ik", "token", " is", " great", "!"]

GPT 模型使用这种类型的 token。
知道文本字符串中有多少令牌,可以告诉你(a)字符串是否太长,文本模型无法处理,以及(b)OpenAI API调用的成本(因为使用是按令牌定价的)。


Encodings

编码指定如何将文本转换为标记。不同的模型使用不同的编码。

OpenAI models 使用 tiktoken 支持下面三种编码:

Encoding nameOpenAI models
cl100k_basegpt-4, gpt-3.5-turbo, text-embedding-ada-002
p50k_baseCodex models, text-davinci-002, text-davinci-003
r50k_base (or gpt2)GPT-3 models like davinci

您可以获取一个模型的编码 ,使用 tiktoken.encoding_for_model() 如下:

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

注意,p50k_baser50k_base 基本类似,对于非代码应用程序,它们通常会给出相同的令牌。


Tokenizer libraries 对不同编程语言的支持

对于 cl100k_basep50k_base encodings:

  • Python: tiktoken
  • .NET / C#: SharpToken

对于 r50k_base (gpt2) encodings, tokenizers are available in many languages.

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

(OpenAI不对第三方库进行背书或保证。)


How strings are typically tokenized

In English, tokens commonly range in length from one character to one word (e.g., "t" or " great"), though in some languages tokens can be shorter than one character or longer than one word. Spaces are usually grouped with the starts of words (e.g., " is" instead of "is " or " "+"is"). You can quickly check how a string is tokenized at the OpenAI Tokenizer.

在英语中,tokens的长度通常从一个字符到一个单词(例如,tgreat ),尽管在一些语言中,tokens 可以短于一个字符或长于一个单词。
空格通常以单词的开头分组(例如, is 而不是 is + is
您可以在[OpenAI Tokenizer]快速检查字符串是如何tokenize的。

OpenAI Tokenizer : https://beta.openai.com/tokenizer


在这里插入图片描述


使用

编解码

import tiktoken
# 使用名字加载 encoding
# 第一次运行时,可能需要连接互联网来下载;下一次不需要联网
encoding = tiktoken.get_encoding("cl100k_base")# 对于给定的模型名,自动加载正确的 encoding 
encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")# 将文本转化为 tokens 列表
encoding.encode("tiktoken is great!")
# [83, 1609, 5963, 374, 2294, 0]
# 计算 encode 返回列表的长度
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
num_tokens_from_string("tiktoken is great!", "cl100k_base")  # 6

# 将 tokens 转化为 文本
encoding.decode([83, 1609, 5963, 374, 2294, 0])
# 'tiktoken is great!'

警告:尽管 .decode() 可以应用于单个令牌,但要注意,对于不在utf-8边界上的令牌,它可能会有损耗。
对于单个 tokens,.decode_single_token_bytes() 方法安全地将单个整数令牌转换为它所代表的字节。

[encoding.decode_single_token_bytes(token) for token in [83, 1609, 5963, 374, 2294, 0]]
# [b't', b'ik', b'token', b' is', b' great', b'!']

(字符串前面的 b 表示字符串是字节字符串。)


比较 encodings

不同的编码在拆分单词、组空格和处理非英语字符的方式上各不相同。使用上面的方法,我们可以比较几个示例字符串的不同编码。

def compare_encodings(example_string: str) -> None:"""Prints a comparison of three string encodings."""# print the example stringprint(f'\nExample string: "{example_string}"')# for each encoding, print the # of tokens, the token integers, and the token bytesfor encoding_name in ["gpt2", "p50k_base", "cl100k_base"]:encoding = tiktoken.get_encoding(encoding_name)token_integers = encoding.encode(example_string)num_tokens = len(token_integers)token_bytes = [encoding.decode_single_token_bytes(token) for token in token_integers]print()print(f"{encoding_name}: {num_tokens} tokens")print(f"token integers: {token_integers}")print(f"token bytes: {token_bytes}")

compare_encodings("antidisestablishmentarianism")
Example string: "antidisestablishmentarianism"gpt2: 5 tokens
token integers: [415, 29207, 44390, 3699, 1042]
token bytes: [b'ant', b'idis', b'establishment', b'arian', b'ism']p50k_base: 5 tokens
token integers: [415, 29207, 44390, 3699, 1042]
token bytes: [b'ant', b'idis', b'establishment', b'arian', b'ism']cl100k_base: 6 tokens
token integers: [519, 85342, 34500, 479, 8997, 2191]
token bytes: [b'ant', b'idis', b'establish', b'ment', b'arian', b'ism']

compare_encodings("2 + 2 = 4")
Example string: "2 + 2 = 4"gpt2: 5 tokens
token integers: [17, 1343, 362, 796, 604]
token bytes: [b'2', b' +', b' 2', b' =', b' 4']p50k_base: 5 tokens
token integers: [17, 1343, 362, 796, 604]
token bytes: [b'2', b' +', b' 2', b' =', b' 4']cl100k_base: 7 tokens
token integers: [17, 489, 220, 17, 284, 220, 19]
token bytes: [b'2', b' +', b' ', b'2', b' =', b' ', b'4']

compare_encodings("お誕生日おめでとう")
Example string: "お誕生日おめでとう"gpt2: 14 tokens
token integers: [2515, 232, 45739, 243, 37955, 33768, 98, 2515, 232, 1792, 223, 30640, 30201, 29557]
token bytes: [b'\xe3\x81', b'\x8a', b'\xe8\xaa', b'\x95', b'\xe7\x94\x9f', b'\xe6\x97', b'\xa5', b'\xe3\x81', b'\x8a', b'\xe3\x82', b'\x81', b'\xe3\x81\xa7', b'\xe3\x81\xa8', b'\xe3\x81\x86']p50k_base: 14 tokens
token integers: [2515, 232, 45739, 243, 37955, 33768, 98, 2515, 232, 1792, 223, 30640, 30201, 29557]
token bytes: [b'\xe3\x81', b'\x8a', b'\xe8\xaa', b'\x95', b'\xe7\x94\x9f', b'\xe6\x97', b'\xa5', b'\xe3\x81', b'\x8a', b'\xe3\x82', b'\x81', b'\xe3\x81\xa7', b'\xe3\x81\xa8', b'\xe3\x81\x86']cl100k_base: 9 tokens
token integers: [33334, 45918, 243, 21990, 9080, 33334, 62004, 16556, 78699]
token bytes: [b'\xe3\x81\x8a', b'\xe8\xaa', b'\x95', b'\xe7\x94\x9f', b'\xe6\x97\xa5', b'\xe3\x81\x8a', b'\xe3\x82\x81', b'\xe3\x81\xa7', b'\xe3\x81\xa8\xe3\x81\x86']

计算chat API调用的tokens

ChatGPT models like gpt-3.5-turbo and gpt-4 use tokens in the same way as older completions models, but because of their message-based formatting, it’s more difficult to count how many tokens will be used by a conversation.

Below is an example function for counting tokens for messages passed to gpt-3.5-turbo-0301 or gpt-4-0314.

Note that the exact way that tokens are counted from messages may change from model to model. Consider the counts from the function below an estimate, not a timeless guarantee.

gpt-3.5-turbogpt-4 这样的ChatGPT模型使用tokens 的方式与旧的完成模型相同,但由于它们基于消息的格式,很难计算会话将使用多少tokens。
下面是一个示例函数,用于对传递到 gpt-3.5-turbo-0301gpt-4-0314 的消息的tokens进行计数。
请注意,从消息中计算tokens的确切方式可能会因模型而异。将函数中的计数视为一个估计值,而不是一个永恒的保证。


def num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301"):"""Returns the number of tokens used by a list of messages."""try:encoding = tiktoken.encoding_for_model(model)except KeyError:print("Warning: model not found. Using cl100k_base encoding.")encoding = tiktoken.get_encoding("cl100k_base")if model == "gpt-3.5-turbo":print("Warning: gpt-3.5-turbo may change over time. Returning num tokens assuming gpt-3.5-turbo-0301.")return num_tokens_from_messages(messages, model="gpt-3.5-turbo-0301")elif model == "gpt-4":print("Warning: gpt-4 may change over time. Returning num tokens assuming gpt-4-0314.")return num_tokens_from_messages(messages, model="gpt-4-0314")elif model == "gpt-3.5-turbo-0301":tokens_per_message = 4  # every message follows <|start|>{role/name}\n{content}<|end|>\ntokens_per_name = -1  # if there's a name, the role is omittedelif model == "gpt-4-0314":tokens_per_message = 3tokens_per_name = 1else:raise NotImplementedError(f"""num_tokens_from_messages() is not implemented for model {model}. See https://github.com/openai/openai-python/blob/main/chatml.md for information on how messages are converted to tokens.""")num_tokens = 0for message in messages:num_tokens += tokens_per_messagefor key, value in message.items():num_tokens += len(encoding.encode(value))if key == "name":num_tokens += tokens_per_namenum_tokens += 3  # every reply is primed with <|start|>assistant<|message|>return num_tokens

# let's verify the function above matches the OpenAI API responseimport openaiexample_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.",},
]for model in ["gpt-3.5-turbo-0301", "gpt-4-0314"]:print(model)# example token count from the function defined aboveprint(f"{num_tokens_from_messages(example_messages, model)} prompt tokens counted by num_tokens_from_messages().")# example token count from the OpenAI APIresponse = openai.ChatCompletion.create(model=model,messages=example_messages,temperature=0,max_tokens=1  # we're only counting input tokens here, so let's not waste tokens on the output)print(f'{response["usage"]["prompt_tokens"]} prompt tokens counted by the OpenAI API.')print()

gpt-3.5-turbo-0301
127 prompt tokens counted by num_tokens_from_messages().
127 prompt tokens counted by the OpenAI API.gpt-4-0314
129 prompt tokens counted by num_tokens_from_messages().
129 prompt tokens counted by the OpenAI API.

拓展 tiktoken

您可能希望扩展 tiktoken 以支持新的编码。有两种方法可以做到这一点。
按照您想要的方式创建Encoding对象,然后简单地传递它。

方式一:

cl100k_base = tiktoken.get_encoding("cl100k_base")# In production, load the arguments directly instead of accessing private attributes
# See openai_public.py for examples of arguments for specific encodings
enc = tiktoken.Encoding(# If you're changing the set of special tokens, make sure to use a different name# It should be clear from the name what behaviour to expect.name="cl100k_im",pat_str=cl100k_base._pat_str,mergeable_ranks=cl100k_base._mergeable_ranks,special_tokens={**cl100k_base._special_tokens,"<|im_start|>": 100264,"<|im_end|>": 100265,}
)

方式二:
使用 tiktoken_ext 插件机制 向tiktoken注册Encoding对象。
只有当您需要 tiktoken.get_encoding 来查找您的编码时,这才有用,否则更适合上面方式1。
要做到这一点,您需要在 tiktoken_ext 下创建一个命名空间包。
这样布局你的项目,确保省略 tiktoken_ext/__init__.py文件:

my_tiktoken_extension
├── tiktoken_ext
│   └── my_encodings.py
└── setup.py

my_encodings.py 应该是一个包含名为 ENCODING_CONSTRUCTORS 的变量的模块。
这是一个从编码名称到函数的字典,该函数不接受参数,并返回可以传递给 tiktoken.encoding 的参数来构造该编码。
例如,请参阅 tiktoken_ext/openai_public.py。有关详细信息,请参阅 tiktoken/registry.py
你的setup.py 应该是这样的:

from setuptools import setup, find_namespace_packagessetup(name="my_tiktoken_extension",packages=find_namespace_packages(include=['tiktoken_ext*']),install_requires=["tiktoken"],...
)

然后简单地执行 pip install ./my_tiktoken_extension,您应该能够使用自定义编码!请确保不要使用可编辑安装。


2023-03-31(五)

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NLP(五十五)tiktoken的使用

tiktoken是OpenAI于近期开源的Python第三方模块&#xff0c;该模块主要实现了tokenizer的BPE&#xff08;Byte pair encoding&#xff09;算法&#xff0c;并对运行性能做了极大的优化。本文将介绍tiktoken模块的使用。 tiktoken简介 BPE(Byte pair encoding)算法是NLP中常见的…

基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围

原文&#xff1a;基于GPT3.5实现本地知识库解决方案-利用向量数据库和GPT向量接口-实现智能回复并限制ChatGPT回答的范围 - 腾讯云开发者社区-腾讯云 标题有点长&#xff0c;但是基本也说明出了这篇文章的主旨&#xff0c;那就是利用GPT AI智能回答自己设置好的问题 既能实现…

【关于ChatGPT的30个问题】18、ChatGPT对于用户隐私的保护措施如何?/ By 禅与计算机程序设计艺术

18、ChatGPT对于用户隐私的保护措施如何? 目录 18、ChatGPT对于用户隐私的保护措施如何?

c++ 旅行商问题(动态规划)

目录 一、旅行商问题简介旅行商问题问题概述问题由来 二、基本思路三、实现1、状态压缩2、状态转移 四、代码五、复杂度分析 一、旅行商问题简介 旅行商问题 TSP&#xff0c;即旅行商问题&#xff0c;又称TSP问题&#xff08;Traveling Salesman Problem&#xff09;&#xff…

ChatGPT 最佳实践指南之:系统地测试变化

Test changes systematically 系统地测试变化 Improving performance is easier if you can measure it. In some cases a modification to a prompt will achieve better performance on a few isolated examples but lead to worse overall performance on a more representa…

医疗健康大数据:应用实例与系统分析

来源&#xff1a;网络大数据 1 、概述 随着信息技术和物联网技术的发展、个人电脑和智能手机的普及以及社交网络的兴起&#xff0c;人类活动产生的数据正以惊人的速度增长。根据国际数据公司(International DataCorporation&#xff0c;IDC)的报告&#xff0c;仅2011年&#xf…

夏季达沃斯论坛《2023年十大新兴技术报告》正式公布

来源&#xff1a;悦智网 该报告概述了未来3-5年内有望对社会产生积极影响的技术。该报告的范围不仅仅描述了技术及其相关的风险和机遇&#xff0c;还包括了对每项技术如何对人类、地球、繁荣、产业和公平产生影响的定性评估。 在夏季达沃斯论坛&#xff08;世界经济论坛第十四届…

音视频技术开发周刊 | 292

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 谷歌将 AI 芯片团队并入云计算部门 追赶微软和亚马逊 OpenAI推出的ChatGPT获得一定成功&#xff0c;微软是OpenAI的重要投资者&#xff0c;它将ChatGPT植入必应搜索&#…

CollovGPT——人工智能工具颠覆传统室内设计行业

作为线上室内设计领先的平台&#xff0c;Collov一直致力于使用先进的技术重新定义「室内设计」&#xff1a;让室内设计不再是一种奢侈品&#xff0c;而是每一个人都可以享受的生活体验。 经过两年的迭代和开发&#xff0c;我们现在正式上线CollovGPT — 一款基于Stable Diffusi…

扩散模型和Transformer梦幻联动!一举拿下新SOTA

作者丨羿阁 萧箫 来源丨量子位 导读 “U-Net已死&#xff0c;Transformer成为扩散模型新SOTA了&#xff01;” 就在ChatGPT占尽AI圈风头时&#xff0c;纽约大学谢赛宁的图像生成模型新论文横空出世&#xff0c;收获一众同行惊讶的声音。 MILA在读ML博士生Ethan Caballero 论文…

92K Star !AI 都完全不需要咱们人类了?

Auto-GPT 究竟是一个开创性的项目&#xff0c;还是一个被过度炒作的 AI 实验&#xff1f;本文为我们揭开了喧嚣背后的真相&#xff0c;并揭示了 Auto-GPT 不适合实际应用的生产局限性。 作者&#xff1a;Jina AI 创始人兼 CEO 肖涵博士 译者&#xff1a; 新智元编辑部 原文链接…

揭秘 Auto-GPT 喧嚣背后的残酷真相!

Auto-GPT 究竟是一个开创性的项目&#xff0c;还是一个被过度炒作的 AI 实验&#xff1f;本文为我们揭开了喧嚣背后的真相&#xff0c;并揭示了 Auto-GPT 不适合实际应用的生产局限性。 本文来自 Jina 官方投稿&#xff0c;作者为 Jina AI 创始人兼 CEO 肖涵博士&#xff0c;如…

通过ChatGPT使用Mermaid.js生成时间序列图、组织结构图等

1、用mermaid.js 生成京东网站改版时间序列图 以下是使用Mermaid.js生成的京东网站改版时间序列图&#xff1a; gantttitle 京东网站改版时间序列图dateFormat YYYY-MM-DDsection 基础功能改版登录注册界面 :done, 2018-01-15, 10d购物车页面优化 :done, 2018-02-10, 10d商…

淘汰ChatGPT的Auto-GPT是炒作?自己跑代码,不需要人类,GitHub已破5万星

视学算法报道 编辑&#xff1a;编辑部 【导读】Auto-GPT究竟是一个开创性的项目&#xff0c;还是一个被过度炒作的AI实验&#xff1f;这篇文章为我们揭开了喧嚣背后的真相&#xff0c;并揭示了Auto-GPT不适合实际应用的局限性。 这两天&#xff0c;Auto-GPT——一款让最强语言…

AIPRM for ChatGPT 提示词模板扩展工具实践

&#xff08;1&#xff09;基本介绍 AIPRM for ChatGPT是一个Chrome浏览器扩展程序&#xff0c;基于Chromium内核开发的浏览器都可以使用该扩展&#xff0c;比如微软的Edge浏览器等。 在AIPRM的帮助下&#xff0c;我们可以在ChatGPT中一键使用各种专门为网站SEO、SaaS、营销、…

惊!掌握通义千问的关键,从这些必知内容开始!

今年快过半了&#xff0c;要说顶流话题还得是ChatGPT&#xff0c;相关话题的热度居高不下&#xff0c;而其从GPT-3.5到GPT-4的升级&#xff0c;也让我们深刻了解了什么叫一代版本一代神&#xff0c;从GPT-3.5到GPT-4&#xff0c;真的就是一个跨阶级式的升级。 技术内涵 ChatGPT…

讯飞星火大模型申请及测试:诚意满满

“ 大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加&#xff1a;keeepdance&#xff0c;备注&#xff1a;chatgpt&#xff0c;拉你进群。 最近国产大模型跟下饺子似&#xff0c;隔几天就发布一个。厂家发布得起劲&#xf…

拍摄电话?窃听邮件?了解社会工程学攻击和你可能受到的风险

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 社会工程学 社会工程学-渗透测试 社会工程学作用 亦思社会工程学 你注册过哪些网站&…

文心千帆为你而来

1. 前言 3月16号百度率先发布了国内第一个人工智能大语言模型—文心一言。文心一言的发布在业界引起了不小的震动。而文心一言的企业服务则由文心千帆大模型平台提供。文心千帆大模型平台是百度智能云打造出来的一站式大模型开发与应用平台&#xff0c;提供包括文心一言在内的…

第二弹进阶吴恩达 ChatGPT Prompt 技巧

第一弹笔记在这里&#xff1a; 总结吴恩达 ChatGPT Prompt 免费课程 今天分享第二弹&#xff0c;进阶篇。 第一点&#xff0c;任务序列化。 通常看完一篇长文&#xff0c;脑子里往往充满无数疑问。急切想知道所有答案&#xff0c;必须列一个问题清单。对话式问法&#xff0c;对…