Token 是什麼?LLM 為何只讀 Token?

前言 上篇講到LLM,這片就來說說裡面很常提到的字「Token」。Token 是語言模型可理解的最小單位,它像積木一樣把長句拆成小塊,讓模型逐一處理。這篇文章用更平易近人的方式解釋什麼是 token、為何 LLM 不直接處理完整的字詞,以及常見的斷詞方法,幫助你輕鬆掌握這個看似陌生卻無所不在的概念。 Token 是什麼?為何要用它? LLM 是數學模型,必須把文字轉成向量才能運算。最簡單的做法是把每個單詞賦予一個向量,但這樣會遇到兩個問題: 無法處理新詞或拼錯字:如果訓練時沒有見過某個單字,模型就不知道如何表示它。 忽略語素結構:許多語言中,一個詞可以拆成詞根和詞綴,例如「running」「runner」都來自「run」。 為了兼顧彈性與效率,LLM 會先把輸入拆解成更小的 token。有人將 token 定義是「字、字元或包含標點的組合」。有些文中也強調,token 是模型用來處理文字的原子單位。透過 token,模型得以把複雜的語言拆成固定大小的向量,並對每個 token 指派唯一編號。 幾種常見的斷詞方法 不同 LLM 可能採用不同的分割策略。以下三種是最常見的斷詞方法: 字級(Word):按空格切割。例如 “unbelievable performance” 被當作兩個 token。優點是數量少,但遇到新詞就無法處理。 字元級(Character):每個字母和空白都是一個 token。它能處理任何輸入,但 token 數大幅增加,效率低下。 子詞級(Subword):介於上述兩者之間,把常見詞根或片段視為 token,是現在主流 LLM 的做法。例如 “unbelievable performance” 可以拆成 ["un", "bel", "iev", "able", "per", "form", "ance"]。 圖中展示同一句話經過三種方法切分後的樣子: 把詞拆成小塊,看出不同斷詞方式產生的 token 數量差異。 簡易 Python 範例:手寫子詞切分 以下程式碼示範如何使用簡單的片段詞表(模擬 BPE 結果)把長詞拆成 token。一樣,雖然不是完整的演算法,但能幫你理解 tokenization 的動作。 # 定義一組常見片段 subwords = ["un", "bel", "iev", "able", "per", "form", "ance"] # 簡易子詞切分函式 def tokenize_subwords(text, subwords): tokens = [] i = 0 while i < len(text): match = None for sw in sorted(subwords, key=len, reverse=True): if text[i:].startswith(sw): match = sw break if match: tokens.append(match) i += len(match) else: tokens.append(text[i]) i += 1 return tokens # 輸入與輸出示範 print(tokenize_subwords("unbelievable performance".replace(" ", ""), subwords)) # 可能輸出: ['un', 'bel', 'iev', 'able', 'per', 'form', 'ance'] 每次優先匹配片段詞表中最長的項目,若無匹配則輸出單個字母,呈現出子詞分割的概念。 ...

2025-12-01 · 1 min · 180 words · KbWen

Google NLP API parsing

使用google 提供的API做語意分析。 語意分析(syntactic analysis)能夠提取語言的訊息,把文章拆成句子,句子在拆成更小的每個分詞,做更進一步的分析,Goole NLP API 會給予每個字詞的詞性以及彼此的關係。 Analyzing syntax 進入GCP新增一個API Key 並確認NLP API狀態為enable;詳細的GCP申請操作步驟可以看官方文件。(或是以後有機會寫。) API Enabled 因為這次是介紹,所以使用google cloud shell;在平常使用下可以把某些步驟改成習慣的語言及IDE。 新增環境變數 export API_KEY=<YOUR_KEY> 確認輸入後,增加要丟進API的文字json檔 text.json { "document":{ "type":"PLAIN_TEXT", "content": "Beirut rescuers search the site for possible survivor 30 days after the explosion." }, "encodingType": "UTF8" } 標準的json檔輸入資訊:https://cloud.google.com/natural-language/docs 使用curl post資料 curl "https://language.googleapis.com/v1/documents:analyzeSyntax?key=${API_KEY}" \ -s -X POST -H "Content-Type: application/json" --data-binary @text.json 會得到解析出來的資訊 { "sentences": [ { "text": { "content": "Beirut rescuers search the site for possible survivor 30 days after the explosion.", "beginOffset": 0 } } ], "tokens": [ { "text": { "content": "Beirut", "beginOffset": 0 }, "partOfSpeech": { "tag": "NOUN", "aspect": "ASPECT_UNKNOWN", "case": "CASE_UNKNOWN", "form": "FORM_UNKNOWN", "gender": "GENDER_UNKNOWN", "mood": "MOOD_UNKNOWN", "number": "SINGULAR", "person": "PERSON_UNKNOWN", "proper": "PROPER", "reciprocity": "RECIPROCITY_UNKNOWN", "tense": "TENSE_UNKNOWN", "voice": "VOICE_UNKNOWN" }, "dependencyEdge": { "headTokenIndex": 1, "label": "NN" }, "lemma": "Beirut" }, { "text": { "content": "rescuers", "beginOffset": 7 }, "partOfSpeech": { "tag": "NOUN", "aspect": "ASPECT_UNKNOWN", "case": "CASE_UNKNOWN", "form": "FORM_UNKNOWN", "gender": "GENDER_UNKNOWN", "mood": "MOOD_UNKNOWN", "number": "PLURAL", "person": "PERSON_UNKNOWN", "proper": "PROPER_UNKNOWN", "reciprocity": "RECIPROCITY_UNKNOWN", "tense": "TENSE_UNKNOWN", "voice": "VOICE_UNKNOWN" }, "dependencyEdge": { "headTokenIndex": 2, "label": "NSUBJ" }, "lemma": "rescuer" }, { "text": { "content": "search", "beginOffset": 16 }, "partOfSpeech": { "tag": "VERB", "aspect": "ASPECT_UNKNOWN", "case": "CASE_UNKNOWN", "form": "FORM_UNKNOWN", "gender": "GENDER_UNKNOWN", "mood": "INDICATIVE", "number": "NUMBER_UNKNOWN", "person": "PERSON_UNKNOWN", "proper": "PROPER_UNKNOWN", "reciprocity": "RECIPROCITY_UNKNOWN", "tense": "PRESENT", "voice": "VOICE_UNKNOWN" } } ...... ], "language": "en" } 觀察一下上面的結果 ...

2020-09-04 · 2 min · 233 words · KbWen

Keras IMDb

IMDb是一個電影相關的線上資料庫 這次要利用IMDb的影評文字預測它是正面評價或是負面評價 在深度學習模型中只能接受數字,Keras有提供Tokenizer模組 會依照英文次數進行排序,在給每個單字編號:Keras Tokenizer 在利用Word embedding 將數字list 轉換成向量list,最後丟進去LSTM做學習 (在Keras 使用 RNN LSTM 模型很方便,一行解決) Keras也提供讓我們方便把英文轉成數字的模型 這是model summary 把數字list轉換成64維的向量list,並且用三層的隱藏層來做訓練。 準確率:0.8543 實際使用 進入IMDb網站,抓取Spider-Man: Homecoming評論,檢驗是否正確。 拿了正面評論結果也是顯示正面(1:正面,0:負面) My Github

2017-07-11 · 1 min · 25 words · KbWen

TENSORFLOW 練習4: word2vec

把字詞轉成word embedding 要在字詞中找到他們之間的某種關聯,而不是分散無意義的符號代表 做這個問題的概念是 假設兩個不同句子中的詞上下文相同,則代表兩個詞的語意相同 今天要來使用skip-gram模型,一個類似二分法的方式(像或著不像) 一開始也同之前的問題,先做數據處理 [(most count word1, n1),(second word2, n2)] 計算出現數量 文字轉成向量 The actual code for this tutorial is very short ([the, code], actual), ([actual, for], code), … skip-gram pairs (actual, the), (actual, code), (code, actual), … 在這之間都會給他編號,變成像是 (10,20),(10,30),(30,10),(30,40),.. 的形式 用上nce loss 我還不熟,大概是我們讓目標的機率越高越好,其餘K個數的機率很低,negative samples king - queen = man - woman ==> king - queen + woman = man 給queen加上負號,並取不要的值,我想是這種感覺吧?? 結果 會把相似的詞分的近些 原版 tensorflow 有用上sklearn的TSNE 來做降維,在很多地方都比PCA好,讀了以後可以來試試 My Github ...

2017-05-12 · 1 min · 71 words · KbWen