如果用 ChatGPT API 去做问答的话是需要付费的,OpenAI 的收费方式是通过 token 数量进行收费,API 价格根据不同模型有所不同,可以看到 GPT4 最贵,GPT3.5 最便宜。这让我想起以前用 Aliyun 中台,每个 SQL 都有个运行价格,ChatGPT 也有一个计算token 的 API,调用 API 之前可以计算一下token 数量。那么问题来了,这个 token 是怎么算的呢?先看官网怎么定义 token 的:
文本生成和嵌入模型通过称为“令牌(tokens)”的文本块来处理文本。令牌代表经常出现的字符序列。例如,字符串“tokenization”被拆分为“ token”和“ization”,而像“the”这样短小且常见的词则表示为单一令牌。请注意,在句子中,每个词的第一个令牌通常以空格字符开始。您可以查看我们的分词工具,以测试特定字符串并查看它们如何被转换为令牌。作为一个大致的经验法则,1个令牌大约等于4个字符或0.75个英文单词。
需要记住的一个限制是,对于文本生成模型,提示和生成的输出加起来不能超过模型的最大上下文长度。对于嵌入模型(不输出令牌),输入必须短于模型的最大上下文长度。每个文本生成和嵌入模型的最大上下文长度可以在模型说明中找到。
官方提供了一个工具可以检查token 数,我尝试了一下,官网说英文差不多是一个token 对应 0.75 个 word,中文有可能被拆成两个,均下来可能也差不多。由于中文是 unicode,有时可能会被拆成两个 token,显示时就是乱码。
通过 API,检查 token 数量
import tiktoken
enc = tiktoken.encoding_for_model("gpt-4") #按需修改模型名称
len(enc.encode("上午5日游计划")) #返回的也是 8 个
Token 就是对输入进行分词,像 ES 中就有很多分词器。LLM 主要用的是 Subword分词,可以通过Byte-Pair Encoding (BPE), SentencePiece, 或者 WordPiece进行分词,下次可以看看他们都有什么区别。
下面是调用不同模型的价格,假设中文和英文一样的算法,1M 就是差不多 75 万字,GPT Turbo 输出100个字差不多是0.4 美分。如果准确率高的话,也不算贵。