一個字等於一個token嗎?

Hikawa Maru, Yokohama, Japan, photo by Sean Yeh

當您踏入這個充滿神秘與未知的大型語言模型LLM世界,可能會被一個不斷出現的名詞所吸引:「Token」。您或許會自問,Token到底是什麼?當您使用像是ChatGPT這樣的AI人工智慧技術時,可能會好奇,如何衡量我們與這個語言模型的對話量?難道不是每一個字都簡單地被計算成一個單位嗎?為什麼一個字並不總是代表一個token?又為什麼我們需要執著於計算這的token數量?

這些問題,就像是隱藏在現代AI人工智慧科技深層的謎團,等待著我們去揭開。在這篇文章中,我們將一起深入這個充滿驚奇的生成式人工智慧世界,像是揭開一層層的迷霧般的解開「Token」這個神秘詞彙背後的秘密。

我們將一步步探索它是如何在這個人工智能時代下運作的。讓我們開始這段旅程,去發現那些隱藏在語言模型背後的奇異與不可思議。

什麼是token?

token是為何物?當我們談論到什麼是token時,實際上就像是在探索一個令人感到神秘而又充滿符號的世界。

在自然語言處理(NLP)的時候,尤其在大型語言模型LLM的世界裡,這些token幫助模型處理您給它的文字。就像把一篇文章中的文字拆分成一個個的詞彙和符號,每一個token都扮演著解開這個語言之謎的關鍵角色。

換言之,當我們向LLM模型輸入一段文字時,這段文字就會先被拆解成一串串的token,就像是一個個獨立的密碼片段。

而在OpenAI的API中,這些token不僅僅是文字處理的基礎單位,它們還是計算成本的關鍵。每一次當您傳送訊息給API,或者API回應您的訊息時,它們都會細心計算使用了多少個token。每一個token都有其價值,而在這場交易中,您的每一個詞語和句子都在被計量其價值。總之,在選用模型時,要特別的注意。

因此,當我們談論token時,我們不僅僅是談論一個技術術語,還是在探索一個在每一次交流中都隱藏著價值和成本的世界。

一個字元不代表一個token

在OpenAI網站的秘密角落裡,有一個名為Tokenizer的頁面。這個頁面,就像是一扇窗,讓我們能一窺文字是如何被轉換成token的神秘過程。

這個網址就在: https://platform.openai.com/tokenizer 位置。

Tokenizer

讓我們來看一個例子:「Hello World, this is my first prompt.」這句話,在轉換過程中,雖然只有38個字元,卻被轉換成了9個token。這就像是施了一個小小的魔法,把看似簡單的文字轉變成了一系列的符號。

38個字元,卻被轉換成了9個token

當我們對Tokenizer頁面輸入一個常見的詞匯,比如「example」時,大型語言模型會將這個詞認作一個獨立的符號,或者說一個「token」。如果讓我們再試試另一個詞匯,比如「Sean」這個名字,在大型語言模型的眼中,它也是一個單獨的token。但是當我們來到另一個看似簡單的詞彙,比如「Subway」時,事情就變得更加有趣了。

example
Sean

雖然在我們的眼中,「Subway」不過是一個簡單的英文單詞,但在LLM大型語言模型的眼中,它卻被拆解成了兩個獨立的符號,即兩個token。

Subway

所以,當我們多次使用Tokenizer頁面輸入文字後,會發現原始的文字和轉換後的結果之間,不存在一個簡單的一對一對應關係。換句話說,每一個字元,都不是簡單的代表一個token,而是背後隱藏著更多的複雜性。

當探索「token」這個概念時,我們發現它與以往所熟知的「單詞」之間存在著微妙且複雜的差異。有趣的是,這些LLM模型經常採用子詞分詞方案,例如Byte-Pair Encoding或WordPiece。在這樣的方案下,以一個像是「 unexpectedly 」一樣看似簡單的單詞,可能就會被拆解為像是 [ ”un”, “expect”, “edly” ] 這樣的多個 tokens。這個方式使模型得以廣泛的處理各種詞彙,包括新詞或不常見的罕見詞彙。面對這些單詞,LLM會將它們拆分成更小、更易於處理的部分,如音節甚至單個字符,使得一個單詞可能對應多個tokens。

不僅如此,tokens的世界還包括了許多特殊符號或標記,這些都是模型用於解讀語言的神秘工具。它們可以是標示句子的開始與結束,或是在處理多重文案時作為標記的角色。特別是在中文這樣基於字符的語言,或者德語、土耳其語這些具有複雜形態學的語言中,分詞過程顯得更為複雜。

因此,在LLM的領域裡,單詞與tokens之間的關係不是簡單的一對一對應,而是一種精妙且複雜的映射,其目的在最大化模型在多種語言和文案上的理解和創造能力。

為何要計算的token數量?

答案很簡單,在使用這些模型時,我們會需要清楚了解成本。因為像是大型語言模型(LLM)的OpenAI,如GPT-3.5和GPT-4,這些模型在執行任務時,會根據所使用的token數量來收費。這也是為何要計算的token數量的最根本原因。

以GPT-3.5為例,每1000個token的費用大約是0.002美元,大約約是0.2美分。而目前GPT-4的費用則比較高,達到了每1000個token六美分。值得注意的是,這些模型對於prompt提示也會收費,而這裡的「提示」,或者說所輸入token,通常成本較低。因此,我們目前主要會關注在輸出token的成本。

前面的說明讓我們意識到,單詞與tokens之間的關係不是簡單的一對一對應。以英文單詞來說,理解二者間的關係,我們可以大致把一個token視為英文單詞的三分之二到四分之三。換句話說,如果你想生成大約300個英文單詞的文本,可能需要大概400個token。是以直覺上token的數量與英文單詞數量大致相等,但實際上略多,大概多出了33%。

因此,了解如何計算token的數量不僅有助於預估成本,更能確保我們的應用和開發工作能在預算範圍內進行,從而達成最佳的成本效益平衡。

在OpenAI API中的token表示

在使用OpenAI API時,我們該如何知道token的使用量?在哪裡可以知道這些數字並且控制它?

首先,我們得回顧之前文章中提及的關鍵概念。在使用OpenAI API時,必須在內容(Body Content)中指定「max_tokens」這一設定。這看似簡單的設定,實際上是控制最大Token使用量的關鍵。其設定格式如下:

{
"model": "模型名稱",
"prompt": "提示指令",
"max_tokens": 整數
}

這裡的max_tokens,是以整數形式限制可容許的最大Token使用數量。這個數字不僅是成本控制的關鍵,更是確保效率和資源利用最佳化的重要因素。

而當我們與API進行互動時,OpenAI會以JSON格式回傳資料,其中包括了詳細的token使用情況。這包括了提示詞的token數(prompt_tokens)、回應的token數(completion_tokens),以及總計的token數(total_tokens)。例如:

'usage': {
'prompt_tokens': 10,
'completion_tokens': 9,
'total_tokens': 19
}

這些資料是我們分析與評估每次互動成本和效率的重要指標。理解這些數據的意義,能幫助我們更精準地運用這項強大的技術工具,使我們能夠更加有效率且經濟地達成目標。

如何精確計算token數?

或許每位開發者都面臨著一項關鍵挑戰:如何精確地控制與監測AI模型中的token使用量,以確保程式運作不會超越模型所設定的token限制。面對這項挑戰,OpenAI提供了一個解決方案 — — 「tiktiken」套件。

只需將「tiktiken」整合到您的應用程式中,它便能成為您的助手,助您隨時監控與管理token的使用情況。這不僅提升了應用的效率,也保障了成本的可控性。

讓我們一同來探索「tiktiken」的應用實踐。

安裝套件

首先要安裝「tiktiken」

pip install tiktoken

匯入程式碼

套件安裝在環境中之後,還需要匯入到程式碼中:

 import tiktoken

接著,我們可以透過套件中的 encoding_for_model()方法,取得指定模型中負責切割文字成為token的編碼器。它的用法如下:

token_encoder = tiktoken.encoding_for_model('指定模型')
print(token_encoder.name)

在這裡,「指定模型」這個位置是我們的實驗舞台,我們可以在這裡放入各種模型,如gpt-3.5-turbo或gpt-4,來觀察它們背後的編碼器。當我們執行print命令時,編碼器的名稱(token_encoder.name)便會顯示在我們眼前,就像魔法一般。

測試的結果,不論是使用gpt-3.5-turbo或是gpt-4等模型,它們使用的encoder編碼器都是「cl100k_base」。

cl100k_base

取得編碼器之後,就可以利用編碼器的 encode()方法,從文字轉為token,

tokens = token_encoder.encode(“文字”)
print(tokens)

結果是:

[88435]

或者利用 decode() 反向的將token轉回文字。

tokens = [88435]
print(encoder.decode(tokens))

[88435] 反轉的結果是:

文字

前面的例子:「Hello World, this is my first prompt.」這句話,也可以在Tokenizer的頁面中,一窺文字轉換為token id的樣子。

結語

在我們這趟探索的奇幻之旅中,「token」這個概念就像是一個重要的符號,揭示了文字在數位領域的轉化過程。過程中把我們輸入給模型的每一句話,每一個字,都細致地拆解成token,這是模型處理語言的基礎單位,就像是解開語言密碼的最小單位。

在OpenAI的API世界裡,這些token不僅僅是語言的基本組成部分,它們還是計算成本的基石。不管是我們傳送給API的信息,還是API回傳給我們的回應,所有這些都會以token為單位來計算。

因此,理解token就像是掌握了一把解開現代數字語言之謎的鑰匙。這些小小的符號,不僅是我們與智慧型模型對話的基礎,也是衡量我們在這個智慧型世界中所付出代價的單位。這樣的理解,不僅讓我們更深入地領會這個生成式人工智慧世界的語言,也開啟了我們在這個智慧型未來中更有效率且富有成本意識的旅程。

--

--

Sean Yeh
Python Everywhere -from Beginner to Advanced

# Taipei, Internet Digital Advertising,透過寫作讓我們回想過去、理解現在並思考未來。並樂於分享,這才是最大贏家。