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

《大語言模型 LLM:其實做的事情比你想像中更單純》

前言 Introduction 如果你最近有用過 ChatGPT、Claude、Gemini,你已經在跟 LLM(Large Language Model)聊天了。這些模型看起來像懂很多、會推理、甚至比朋友還健談,但它們的核心動作其實無比樸實:預測下一個字。 聽起來太簡單?沒錯,但模型規模一大、資料一多、演算法一調整,這個「下一字遊戲」就能演變成看起來像魔法的語言能力。 這篇文章會用工程師看得順、初學者不會暈的方式,把 LLM 的概念、原理與常見應用一次講清楚。 LLM 是什麼? LLM 的任務比你想像的還簡單 從理論上看,LLM 是一種深度學習模型,被訓練去完成一件事情: 在語境下,挑選「最可能出現的下一個 token」。 token 可以是中文字、英文單字的一部分、符號、甚至數字。 當模型知道怎麼選下一個 token,然後不停重複這件事,就能組出一整段看起來像人寫的句子。 為什麼它看起來「懂很多」? 因為它被餵了大量內容:百科、文章、科技文、論壇討論…… 在海量語料裡找模式後,它自然會「講得像很懂」。 我們的感官上就感覺它懂很多、很能理解。 圖 1:LLM 下一字預測核心概念示意圖 LLM 是怎麼「學會」語言的? LLM 的學習流程大致分成四個步驟,其實蠻務實的: 1. 收集大量文本(資料越多,模型越穩) 來源包含書籍、文章、程式碼、論壇、維基百科等。 資料不是越亂越好,但越多越有機會讀懂語言中的隱性規律。 2. 分詞(Tokenization) 模型不直接處理字,而是處理 token。 你可以把它想像成:「把一個蛋糕切成很多比較好吞的碎片」。 3. 預測下一個 token(核心任務) 模型會計算所有候選 token 的機率: 哪個最可能? 哪個跟前文最適合? 哪個不太會讓模型出糗? 機率最高者 → 輸出。 4. 誤差反向調整(Backpropagation) 預測錯了? → 重新調參 → 再預測 → 再調 → 重複幾十億次 這就是 LLM 的訓練人生。 ...

2025-11-23 · 1 min · 179 words · KbWen

Python 爬取每日股價(2)

上篇文章Python 爬取每日股價(1)學會了找到所需資料和爬取的方法。 接下來資料要儲存成xlsx格式。 台灣證券交易所 先安裝pandas和xlsxwriter pip install pandas pip install xlsxwriter 如果是colab,使用!pip install xlsxwriter 藉由上篇找到的資料位置"data9",以及觀察到資料是根據每天做儲存。 因此我們使用基於每天的資料處理方式,把所需要的股票資料、開盤價、收盤價等等存放。 import requests import pandas as pd from pprint import pprint as pprint date = "20210827" url = f"https://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&date={date}&type=ALLBUT0999&_=1630244648174" res = requests.get(url) data = res.json() data_list = data["data9"] columns = data["fields9"] df = pd.DataFrame(data_list, columns=columns) writer = pd.ExcelWriter('twse_data.xlsx', engine='xlsxwriter') df.to_excel(writer, sheet_name=date, index=False) writer.save() # pprint(data_list) f-strings in Python PEP 498 打開儲存的"twse_data.xlsx" 每日收盤行情 我們可以依靠改變日期獲得過去的資料, 存成不同分頁或是檔案。 也可以依據未來需要的使用資料方式來改變儲存格式。

2021-09-06 · 1 min · 70 words · KbWen

How to scrape Yahoo Finance stock data with Python

This time, we are going to learn the hands-on ability to scrape Yahoo financial data. Set-up python environment. Yahoo Finance page. For example, Alphabet Inc. (GOOG). Scrape & parse the page. The page we will be scrape. In the “network” page, we can’t find the json data. You can get all the data from the page source in script. View page source - script - root.App.main from bs4 import BeautifulSoup import re import json import requests response = requests.get("https://finance.yahoo.com/quote/GOOG?p=GOOG&.tsrc=fin-srch") soup = BeautifulSoup(response.text, "html.parser") ## print(soup.prettify()) script = soup.find('script', text=re.compile('root.App.main')).text data = json.loads(re.search("root.App.main\\s+=\\s+({.*})", script).group(1)) stores = data["context"]["dispatcher"]["stores"] print(stores) Response data ...

2021-09-02 · 2 min · 358 words · KbWen

Python 爬取每日股價(1)

如何取得每日的股價資訊 進入證交所每日收盤行情,選擇全部(不含…),可以看到有許多選項可點。 找到每日收盤行情 110.08.27每日收盤行情 點擊F12進入開發者環境,再點選Network,觀察我們要的數據資訊 Python及時股價 點選XHR找到傳送數據的Requests import requests url = "https://www.twse.com.tw/exchangeReport/MI_INDEX?response=json&date=20210827&type=ALLBUT0999&_=1630244648174" res = requests.get(url) res.json() 得到Json,並在data9找到全部的股票數據 {'alignsStyle1': [['center', 'center', 'center', 'center', 'center', 'center'], ... ... 'data9': [['0050', '元大台灣50', '16,875,047', '9,673', '2,328,482,421', '136.70', '138.50', '136.45', '138.15', '<p style= color:red>+</p>', '1.15', '138.15', '4', '138.20', '103', '0.00'], ['0051', '元大中型100', '17,810', '63', '1,003,448', '56.20', '56.60', '56.20', '56.60', '<p style= color:red>+</p>', '0.35', '56.55', '1', '56.60', '9', '0.00'], ... ... 'subtitle9': '110年08月27日每日收盤行情(全部(不含權證、牛熊證))'} 幾個重要的數據 ['0050', #股票代號 '元大台灣50', '16,875,047', #成交股數 '9,673', '2,328,482,421', '136.70', #開盤價 '138.50', #最高價 '136.45', #最低價 '138.15', #收盤價 '<p style= color:red>+</p>', '1.15', '138.15', '4', '138.20', '103', '0.00'], 輕鬆完成,在爬取過程中還是非常簡單的, ...

2021-08-29 · 1 min · 96 words · KbWen

python 爬取及時股價

如何取得即時的股價資訊 進入證交所提供的基本市況報導網站,右上方輸入股票代號,以2330為例。 看到當日的最高、最低、成交價量和最佳五檔等等。 此時在網頁上右鍵點選Inspect打開DevTools切換到Network欄位並觀察 爬蟲頁面 發現會一直get某個網址,名稱開頭是getStockInfo,應該就是我們要的資訊了。 import requests url = "https://mis.twse.com.tw/stock/api/getStockInfo.jsp?ex_ch=tse_2330.tw" res = requests.get(url) res.json() 得到一個排列整齊的json {'queryTime': {'stockInfoItem': 4329, 'sessionKey': 'tse_2330.tw_20200908|', 'sessionStr': 'UserSession', 'sysDate': '20200908', 'sessionFromTime': -1, 'stockInfo': 2084673, 'showChart': False, 'sessionLatestTime': -1, 'sysTime': '12:05:35'}, 'referer': '', 'rtmessage': 'OK', 'exKey': 'if_tse_2330.tw_zh-tw.null', 'msgArray': [{'n': '台積電', 'g': '281_174_260_166_385_', 'u': '468.5000', 'mt': '060262', 'o': '428.0000', 'ps': '593', 'tk0': '2330.tw_tse_20200908_B_9998775018', 'a': '430.5000_431.0000_431.5000_432.0000_432.5000_', 'tlong': '1599537930000', 't': '12:05:30', 'it': '12', 'ch': '2330.tw', 'b': '430.0000_429.5000_429.0000_428.5000_428.0000_', 'f': '143_239_162_400_391_', 'w': '383.5000', 'pz': '428.0000', 'l': '427.5000', 'c': '2330', 'v': '16843', 'd': '20200908', 'tv': '-', 'tk1': '2330.tw_tse_20200908_B_9998774678', 'ts': '0', 'nf': '台灣積體電路製造股份有限公司', 'y': '426.0000', 'p': '0', 'i': '24', 'ip': '0', 'z': '-', 's': '-', 'h': '433.0000', 'ex': 'tse'}], 'userDelay': 5000, 'rtcode': '0000', 'cachedAlive': 7891} 在爬取網址時,不要亂刪後面的query parameters,除非你確認過差別是甚麼。 如果不能爬,Request Headers就是你要注意的地方。 理解和實驗精神 比較一下哪個是我們要的資訊。 u: 漲停 v: 跌停 z: 當盤成交價,有時候會沒有 s: 當盤成交量,有時候也會沒有;整理數據時可以根據z和s的有無來過濾。 a: 賣出最佳五檔價 f: 賣出最佳五檔量 l: 當日最低 h: 當日最高 ….. 其他參數可以再自行看看,如果今天你想專注於某支股票的狀態;例如盤中是否有大量,那麼只需重複get url取得json做判斷;若想要得到更多支當下股票資訊以及儲存就需要用到dataframe。下面給個盤中抓取多隻股價的方式。 ...

2020-09-08 · 2 min · 303 words · KbWen