他要把公司裡上萬份內部 PDF 文件轉成模型看得懂的格式,先做前處理,再餵進向量資料庫
在語言模型能讀懂一段文字之前,電腦得先做一件事:把這段文字切成一小塊一小塊、模型看得懂的單位,這個步驟叫 tokenization(分詞)把一整段文字拆成模型看得懂的小塊,例如把「我愛AI」拆成「我」「愛」「AI」三小塊,拆出來的每一小塊就叫做 token分詞後的最小單位,語言模型讀文字其實是一塊一塊讀,不是一個字一個字讀。這一步聽起來很基礎,但只要要處理的文字資料量夠大,它就可能變成整條處理流程裡最花時間的一關。
GigaToken 就是專門解決這個瓶頸的一款分詞工具。它最大的賣點是 drop-in replacement(直接替換)不用改動任何呼叫端程式碼,只要把舊的分詞工具換成新工具,其他地方完全不動,也就是說,原本用 HuggingFace 或 OpenAI 的 tiktoken 在跑分詞的程式,幾乎不用改,就能把底層引擎換成 GigaToken。
它能快這麼多,靠的不是什麼魔法,而是紮實的工程功夫:底層用 Rust一種以「快又安全」聞名的程式語言,許多要求極致效能的底層工具都用它寫 實作,並且用 多執行緒(multithreaded)讓程式同時動用電腦裡好幾顆處理器核心一起工作,而不是一次只用一顆 把工作平行分散到所有核心上;它甚至還提供一套原生 API(應用程式介面)一套「你呼叫我、我回你」的固定溝通規則,讓不同程式之間可以互相合作,讓 Rust 直接讀取檔案,省掉跟 Python 來回搬資料的成本。
官方的 benchmark 用 吞吐量(throughput)衡量「單位時間內能處理多少資料量」的指標,這裡用 GB/s,也就是每秒能吃下幾十億位元組的文字 來呈現差距:同樣一份將近 12 GB 的文字資料,HuggingFace 的分詞器一秒只能啃幾十 MB,GigaToken 卻能一秒啃掉超過 20 GB,等於把等待時間從『泡杯咖啡』壓縮到『眨個眼』。
| 模型 | GigaToken 速度 | HuggingFace tokenizers 速度 | 比 HF 快幾倍 |
|---|---|---|---|
| GPT-2 | 24.53 GB/s | 24.8 MB/s | 989× |
| Llama 3 / 3.1 / 3.2 | 22.15 GB/s | 48.5 MB/s | 457× |
| Qwen 3 | 22.16 GB/s | 34.2 MB/s | 648× |
| DeepSeek V3 / R1 / V4 | 19.69 GB/s | 26.2 MB/s | 750× |
這段程式示範怎麼把現有的 HuggingFace 分詞器,幾乎不改呼叫方式地換成 GigaToken 的相容模式
import gigatoken as gthf_tokenizer = AutoTokenizer.from_pretrained('gpt2')tokenizer = gt.Tokenizer(hf_tokenizer).as_hf()tokens = tokenizer.encode_batch(['This is a test string', 'And here is another'])print(len(tokens[0]), len(tokens[1]))這是一個真實小專案:下載(或複製)檔案,照步驟在你電腦上跑起來。
# 比較 HuggingFace 分詞器與 GigaToken 相容模式的處理速度
import time
from pathlib import Path
from transformers import AutoTokenizer
import gigatoken as gt
SAMPLE_TEXT_PATH = Path('sample.txt')
def load_sample_text():
if not SAMPLE_TEXT_PATH.exists():
SAMPLE_TEXT_PATH.write_text('這是一段測試文字。' * 50000, encoding='utf-8')
return SAMPLE_TEXT_PATH.read_text(encoding='utf-8')
def time_tokenizer(name, encode_fn, text):
start = time.perf_counter()
tokens = encode_fn([text])
elapsed = time.perf_counter() - start
token_count = len(tokens[0]) if tokens else 0
print(f'{name}:{elapsed:.3f} 秒,共 {token_count} 個 token')
def main():
text = load_sample_text()
hf_tokenizer = AutoTokenizer.from_pretrained('gpt2')
time_tokenizer(
'HuggingFace tokenizers',
lambda batch: [hf_tokenizer.encode(t) for t in batch],
text,
)
gigatoken_tokenizer = gt.Tokenizer(hf_tokenizer).as_hf()
time_tokenizer(
'GigaToken(相容模式)',
gigatoken_tokenizer.encode_batch,
text,
)
if __name__ == '__main__':
main()