什么是 tokens,ChatGPT里面的Tokens如何計(jì)數(shù)?

什么是 tokens?
Tokens 可以被認(rèn)為是詞語的片段。在 API 處理提示之前,輸入會被分解成 tokens。這些 tokens 并不會精確地在單詞的開始或結(jié)束處切分 - tokens 可以包含尾隨的空格甚至子詞。以下是一些幫助理解 tokens 長度的經(jīng)驗(yàn)法則:
1 token ~= 英文中的4個(gè)字符
1 token ~= ?個(gè)單詞
100 tokens ~= 75個(gè)單詞
或者
1-2個(gè)句子 ~= 30個(gè)tokens
1段落 ~= 100個(gè)tokens
1,500個(gè)單詞 ~= 2048個(gè)tokens
為了獲取更多關(guān)于tokens如何疊加的上下文,可以考慮以下例子:
韋恩·格雷茨基的名言 "You miss 100% of the shots you don't take" 包含11個(gè)tokens。

單詞如何被分割成 tokens 也取決于語言。例如,'Cómo estás'(西班牙語中的'你好嗎')包含5個(gè) tokens(對應(yīng)10個(gè)字符)。較高的 token 到字符比率可能使得對英語以外的語言實(shí)現(xiàn) API 更加昂貴。

我名字拼音+空格+wetchat+我的微信號"liyuechun wetchat liyc1215" 包含13個(gè)tokens。
飛書、釘釘、企微GPT能力嫁接和AIGC企業(yè)培訓(xùn),聯(lián)系我:liyc1215

”黎躍春“三個(gè)字包含8個(gè)tokens

"付金亮"三個(gè)字包含6個(gè)tokens

如果你想進(jìn)一步探索分詞,你可以使用我們的交互式 工具,它可以讓你計(jì)算 token 的數(shù)量,并查看文本如何被分割成 tokens?;蛘?,如果你想通過編程方式進(jìn)行分詞,可以使用 ,這是一個(gè)專為 OpenAI 模型設(shè)計(jì)的快速 BPE 分詞器。你也可以嘗試探索其他庫,例如 Python 的 transformers 包,或者 node.js 的 gpt-3-encoder 包。
Token 限制
根據(jù)使用的不同,請求中的prompt和completion之間最多可以使用4097個(gè)tokens。如果你的prompt是4000個(gè)tokens,那么你的completion最多可以是97個(gè)tokens。
這個(gè)限制目前是一個(gè)技術(shù)限制,但通常有許多創(chuàng)新的方法可以在這個(gè)限制內(nèi)解決問題,例如壓縮你的prompt,將文本分解成較小的部分等。
Token 定價(jià)
API 提供多種不同價(jià)格點(diǎn)的模型類型。每種模型都有一系列的能力,其中davinci是最強(qiáng)大的,ada是最快的。對這些不同模型的請求定價(jià)不同。你可以在找到關(guān)于token定價(jià)的詳細(xì)信息。
探索 tokens
API會根據(jù)語料庫數(shù)據(jù)中的上下文來處理單詞。GPT-3接受prompt,將輸入轉(zhuǎn)換成一系列的tokens,處理prompt,并將預(yù)測的tokens轉(zhuǎn)換回我們在響應(yīng)中看到的單詞。
在我們看來可能是兩個(gè)相同的單詞,可能會根據(jù)它們在文本中的結(jié)構(gòu)生成不同的tokens??紤]一下API如何根據(jù)文本中的上下文為單詞'red'生成token值:
在上面的第一個(gè)例子中,‘ red’的token "2266"包含一個(gè)尾隨的空格。

帶有前導(dǎo)空格并以大寫字母開頭的‘ Red’的token "2297"與以小寫字母開頭的‘ red’的token "2266"不同。

當(dāng) 'Red' 在句子開頭時(shí),生成的token不包含前導(dǎo)空格。token "7738"與前兩個(gè)單詞的例子不同。
觀察:
token越可能/頻繁,分配給它的token號就越低:
在所有3個(gè)句子中為句號生成的token是相同的("13")。這是因?yàn)椋谡Z境上,句號在語料庫數(shù)據(jù)中的使用相當(dāng)類似。
根據(jù)'red'在句子中的位置,生成的token會有所不同:
在句子中間的小寫:‘ red’ - (token: "2266")
在句子中間的大寫:‘ Red’ - (token: "2297")
在句子開頭的大寫:‘Red’ - (token: "7738")
既然我們知道tokens可以包含尾隨的空格字符,那么記住以空格字符結(jié)束的prompts可能會導(dǎo)致輸出質(zhì)量較低是有幫助的。這是因?yàn)锳PI已經(jīng)在它的tokens字典中包含了尾隨的空格。
使用 logit_bias 參數(shù)
可以在 logit_bias 參數(shù)中為特定的 tokens 設(shè)置偏差,以修改指定 tokens 出現(xiàn)在補(bǔ)全中的可能性。比如,我們正在構(gòu)建一個(gè)對用戶雞蛋過敏問題敏感的 AI 烘焙助手。
當(dāng)我們使用提示 'The ingredients for banana bread are' 運(yùn)行 API 時(shí),回應(yīng)將以26.8%的概率將 'eggs' 包含為第二種原料。

注意:要在 Playground 中查看補(bǔ)全概率,請從 Show Probabilities 下拉菜單中選擇 Full Spectrum。
由于我們的 AI 烘焙助手對雞蛋過敏問題很敏感,我們可以利用我們對 tokens 的了解,在 logit_bias 參數(shù)中設(shè)置偏差,以阻止模型生成包含任何 'egg' 變體的響應(yīng)。
首先,使用這個(gè)分詞器工具來確定我們需要為哪些 tokens 設(shè)置偏差。

Tokens:
尾隨空格的單數(shù)形式:‘ egg’ - “5935”
尾隨空格的復(fù)數(shù)形式:‘ eggs’ - “9653”
為‘Egg’或‘Eggs’生成的子詞token - ‘gg’:“1130”
logit_bias 參數(shù)接受的偏差值范圍是 -100 到 +100,極值結(jié)果導(dǎo)致相關(guān) token 的禁止(-100)或獨(dú)占選擇(100)。
將 logit 偏差加到 prompt 中將修改 'egg'(及其變體)包含在我們的香蕉面包提示的響應(yīng)中的可能性。上述提示生成了一個(gè)不包含任何雞蛋的響應(yīng)!
雖然我們不能保證它會生成最好的無雞蛋香蕉面包配方,但 AI 烘焙助手滿足了對用戶雞蛋過敏問題的考慮需求。
總結(jié)
使用英文對話比較劃算,其他語言包括中文計(jì)算Token時(shí)比較昂貴
英文字母大概四個(gè)字母平均下來等于一個(gè)token
中文漢字,大概一個(gè)漢字平均下來兩個(gè)token
我昨天用GPT寫了7篇高考作文,總字?jǐn)?shù)為
10397
,Tokens 為21,008
個(gè)。

計(jì)算了一下:如果使用GPT3.5的API訪問的話,整個(gè)輸入和輸出總共:21,008 個(gè)token,GPT3.5 的單價(jià)為$0.002/1000tokens,那么這7篇作文的整個(gè)對話花費(fèi)折算成人民幣的價(jià)格為:21008/1000*(0.002*7) = 0.294112元人民幣,GPT4是GPT3.5的60倍價(jià)格,如果使用GPT4的話,此次消費(fèi)為:0.294112 * 60 = 17.64672元。
最后總結(jié):