关于 token 你应该了解……
作者:万能的小七姐(B 站同名)
本节课我们只讲一个知识点:token
今天有位小伙伴来问小七姐,为什么我输入了几轮对话之后,GPT 仿佛“失忆了”,忘记了之前的设定,我再次强调之后,过几轮它又会忘记呢?而这个问题其实在新手时期非常具有代表性,小七姐今天决定把这个问题的幕后元凶 “ token ” 揪出来,里里外外讲个清楚。
本文大概 4200 字,阅读时间 10 分钟,会讲以下几个点:
让我们开始吧~
一、什么是 token
在大语言模型领域,Token 通常用来表示文本数据中的一个单元。在不同的语境下,一个 token 可能代表一个字、一个词,或者是一个句子。在英文中,一个 token 通常是一个词或者是标点符号。在一些汉语处理系统中,一个 token 可能是一个字,也可能是一个词。Token 是处理和理解文本数据的基本单元。
在深度学习的语言模型中,如 Transformer,输入的文本首先被切分成一系列的 tokens。这些 tokens 被转换成向量,然后被输入到神经网络中进行处理。因此,在这种情况下,token 可以被理解为语言模型接收和处理的最小的信息单元。在训练过程中,每个 token 会关联一个预测,这个预测可以是下一个 token 的预测,也可以是该 token 的属性预测,如词性、情感等。
训练 token 的数量会影响模型的性能和准确性。更多的训练 token 通常意味着更多的训练数据,这可能会提升模型的准确性和泛化能力。然而,处理更多的 token 也会增加计算的复杂性和计算资源的需求。
基于上述解释,很多同学把 token 理解为中文语义里的“字节”,对于这种理解,只能说从类比关系上有一定的相似度,因为"字节"是计算机存储和处理数据的基本单元,而 "token" 则是语言模型处理文本信息的基本单元。但这种理解不够准确的地方在于:
"Token" 在语言模型中的作用比"字节"在计算机中的作用更加复杂和多元。在大语言模型中," token " 不仅代表文本数据中的一个单位,而且每个 " token " 都可能携带了丰富的语义信息。比如,在处理一句话时," token " 可能表示一个字,一个词,甚至一个短语,这些都可以被认为是语言的基本单元。同时,每个"token"在模型中都有一个对应的向量表示,这个向量包含了该"token"的语义信息、句法信息等。
所以,尽管 " token " 和"字节"都是基本的处理单位,但是 " token " 在大语言模型中的含义和作用要比"字节"在计算机中的含义和作用更加丰富和复杂。
另外,如果现在正在浏览这篇帖子的你曾经“机翻”过一些文档的话,你会经常看到 “ token ” 被自动翻译工具翻译为“令牌”,我不知道你是否对于这一翻译感到过疑惑,我感到过,所以我问了:
为什么会有 token
这部分内容引用了知乎作者 卡卡罗特 的专栏文章:ChatGPT 实用指南(一) - 知乎 (zhihu.com) 内容过于学术所以只做了节选,特别感兴趣的同学也可以点进去查阅完整文章,写的是非常好的。
GPT 的输入和输出都是到中文字的粒度吗?注意,GPT 不仅仅能处理中文,它还能处理几乎世界上所有流行的自然语言。所以这告诉我们 GPT 实际的输入和输出并不是像我们想象的样子。
因此,我们需要引入 token 的概念。token 是自然语言处理的最细粒度。简单点说就是,GPT 的输入是一个个的 token,输出也是一个个的 token。
GPT 不是适用于某一门语言的大型语言模型,它适用于几乎所有流行的自然语言。所以 GPT 的 token 需要 兼容 几乎人类的所有自然语言,那意味着 GPT 有一个非常全的 token 词汇表,它能表达出所有人类的自然语言。如何实现这个目的呢?
答案是通过 unicode 编码。
Unicode(统一码、万国码、单一码)是一种在计算机上使用的字符编码。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
例如中文中的 你
字对应如下 unicode 编码:
\u4F60
\u
表示后面是一个 unicode 编码,它用 16 进制数表示。4F60
转换成 10 进制对应 20320 ,20320 表示在 unicode 编码中,第 20320 个编码对应的是字是 你
。最后将 20320 转换为 2 进制,得到如下结果:
0100 1111 0110 0000
有意思的是,unicode 不仅有自然语言,实际上也包含 emoji 等自然语言之外的符号。这也是为什么 ChatGPT 能理解和回复 emoji 的原因。
所以,GPT 实际是将我们输入的文字转换成 token,然后通过 GPT 模型预测 token,再将 token 转换成文字,最后再输出给我们。
通过 token 的学习,我们能感觉到 ChatGPT 理解文本的方式和人类并不相同,它在以自己的方式理解这个世界。
二、现在我们使用的大模型 token 有哪些限制
从官方文档可以看到我们目前使用的模型有哪些,以及每个模型的 token 限制。
除此之外,最直观能感受到各类模型 token 限制的其实是 poe :
在这里我们看到的 16K、32K、100K 就是指 token 上限。
- Claude-2-100 k 模型的上下文上限是 100k Tokens,也就是 100000 个 token
- ChatGPT-16 k 模型的上下文上限是 16k Tokens,也就是 16000 个 token
- ChatGPT-4-32 k 模型的上下文上限是 32k Tokens,也就是 32000 个 token
但似乎很多小伙伴不理解这个限制具体影响在哪些方面。所以我替你们问了一下 GPT(真不懂你们为什么不自己问/手动狗头)
从回答可以看出,这个 token 限制是同时对下述两者生效的:
1、一次性输入
2、一次对话的总体上下文长度,值得注意的是这个长度不是达到上限就停止对话,而是遗忘最前面的对话,你可以理解为鱼的记忆只有 7 秒,第 8 秒的时候他会忘记第 1 秒的事,第 9 秒的时候……(某些同学是不是恍然大悟了)
三、怎么看我使用了多少 token
如果我们想要直观的查看 GPT 是如何切分 token 的话,我们可以打开:https://platform.openai.com/tokenizer
在下图可以看到实时生成的 tokens 消耗和对应字符数量(基于 GPT3)
在这里值得注意的是,英文的 token 占用相对于中文是非常少的,这也是为什么很多中文长 prompt 会被建议翻译成英文设定,中文输出的原因。
请注意,这个网站仅用于 gpt3 对于 token 的计算,方便我们理解概念。而目前我们所使用的 3.5 和 4.0 采用的已经是另一种编码方式,通过下面这个工具测算的结果不一定准确,所以不能把它当做目前的 token 计算工具来 100% 参考。(GPT3 用的编码是 p50k/r50k,GPT3.5 是 cl100K_base)
基于这个需求,我找到了官方的开源计算方式:
https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
在本地部署之后可以精确计算目前 4.0 的 token 消耗:
可以进行准确的计算。
四、token 限制对 prompt 编写有什么影响
当你理解了前面的一、二、三之后,这个问题的答案应该已经在你脑子里有雏形了:
- 理解 token 限制,形成“当前消耗了多少 token ”的自然体感,显然会有利于你在连续对话的时候把握一次有效记忆的长度。这样你就不会傻乎乎在超过 9000 token 的时候还在继续问最初的问题,然后得到一个失忆的回答,自己也很懵。
- 编写 prompt 的时候你需要珍惜你的 tokens,尽可能秉承奥卡姆剃刀原理,能不多说一句废话就不多说一句,句子、措辞,都值得精简。尤其是在连续多轮对话中,精简有效的表达习惯是非常重要的。
五、基于上述原理有哪些 tips
- 熟练使用中英文切换。prompt 本身太长了的话,建议用英文设定,要求它用中文输出即可,这样一来可以把省出来的 token 留给更多次数的对话。
- 了解一些本身就自带方法论的英文短语或者句子,很多时候你只要提到这个词,GPT 就知道你指的是什么意思,而不用写一个自然段来描述你需要的这个方法,例如:“ Chain of thought ”
最后:
🤔️ 那你有没有想过,这些公司为什么不把 token 限制放高一点呢?大不了比 GPT-4 API 价格再高一点呗,咱为了良好的体验,也不是不愿意花钱。其实不是 OpenAI、Google 不想,而是他们 不能。
即使 Claude 2.0 声称能接受 10 万 tokens(约等于 5 万汉字),你实际去用就会发现,它其实也记不清 10 万 tokens 那么多。
GPT 本质是文字接龙,根据过往 token 序列推测下一个最有可能的 token 是什么
⬇️ 过往 token 序列太长,会导致计算量过大、计算精度下降
⬇️ OpenAI 为 GPT 模型增加了 token 限制
⬇️ 我们让 GPT 处理长流程、长文本的任务时,不能将整个流程一口气灌输给 GPT
⬇️ 要懂怎么拆解需求、拆解流程,怎么写好提示词
这就是为什么小七姐推荐大家读文档,读文档,还是读文档。
根据传播学理论,那些酷炫的 prompt 案例总是比原理科普文章容易传播。
但别人的案例只是他们学习、思考、实践最后得到的成果。
你不能光看果实长得好不好看,还要看怎么播种、怎么浇水灌溉。
而一切的一切追根溯源,最核心的那颗种子,就是 官方文档、前沿论文、大佬解读。
核心中的核心是文档,读完对某个点有疑问,找论文,论文没太看明白,再去看大佬解读。
这么一个流程下来,专属于你的知识才会生根发芽。
我是 prompt 学习者和实践者小七姐,欢迎链接我交流 prompt 相关知识