Blog

  • AI 的原子論:解密大語言模型背後的最小單位 Token

    前言:電腦看不懂「中文」,它只看得懂「數字」

    當你打開 ChatGPT 輸入「請幫我寫一份期末報告大綱」,然後看著螢幕上游標閃爍,一行行流暢的中文像流水一樣湧出來時,你是否曾經好奇過:這個 AI 到底是用什麼單位在閱讀和思考的?

    是「字」嗎?像是「期」、「末」、「報」、「告」?

    還是「詞」?像是「期末」、「報告」?

    或者是整句「句子」?

    如果你的答案是以上皆是,那只答對了一半。在我們的眼中,語言是由字、詞、句組成的;但大語言模型把語言粉碎成一種更小且更抽象的單位,稱之為 Token。將語言轉換成這些單位的過程,就叫做 Tokenization

    把文字 Token 化的技術決定一款 AI 聰不聰明、反應快不快,甚至決定你使用 AI 時要付多少錢。今天,我們就把這個 AI 領域的「原子論」拆解開來,用你熟悉的日常情境,搞懂這個支撐起生成式 AI 浪潮的基石。

    第一章:Token 是 AI 世界的樂高積木

    在大語言模型眼中,Token 是處理文字的最小單位。它不一定是一個完整的單字,也不一定是一個字母。它更像是一個「有意義的碎片」。AI 就是靠著堆疊這些 Token 積木,蓋出「期末報告」這座城堡的。

    Token 的切分方式在不同語言下差異巨大,這也是大家最容易搞混的地方。

    英文世界

    • 通常一個英文單字(Word)會對應到 1 個 Token,例如:”apple” ≈ 1 Token
    • 複雜的長單字會被切開,例如:”Tokenization” 可能會被切成 “Token” + “ization”(2 個 Tokens)

    中文世界

    • 早期模型(如 GPT-3)中,一個中文字通常對應 2 到 3 個 Tokens(因為編碼比較複雜)
    • 近期模型(如 GPT-4),一個常用中文字(如「你」、「我」、「愛」)通常就是 1 個 Token。如果是生僻字或成語,可能還是會佔用多個 Tokens

    簡單的換算公式(粗略估計):

    • 英文: 1,000 Tokens $\approx$ 750 個單字
    • 中文: 1,000 Tokens $\approx$ 400 ~ 700 個中文字(視模型而定)

    第二章:Tokenization

    了解 Token 是積木,那 Tokenization 是什麼?簡單說,就是「把人類寫的文字,切碎並轉換成電腦看得懂的數字 ID」的過程。電腦是看不懂 Hello 這個字的,它只認識 0 和 1。所以,我們需要一個翻譯官。

    1. 運作流程三部曲

    Token 化過程可以簡化為三個步驟

    步驟一、切分 (Splitting)

    輸入句子:「I love AI」

    Tokenization 切分後變成:[“I”, ” love”, ” AI”](注意:空格通常也會被包含在 Token 裡)。

    步驟二、查表 (Mapping / Lookup)

    模型有一本巨大的字典,列出所有它認識的 Token 以及對應 ID,舉例

    • “I” 代表 ID: 40
    • ” love” 代表 ID: 3021
    • ” AI” 代表 ID: 15890

    步驟三、輸入模型

    最後,送進 AI 大腦的不是文字,而是這串數字:[40, 3021, 15890]。

    第三章:切分技術的演進,為什麼不是切字母就好

    你可能會問:「為什麼不乾脆把每個字母(a, b, c…)都當成一個 Token?這樣字典只要 26 個字,豈不是超省空間?」這牽涉到 Tokenization 技術的三種流派演進,讓我們看看為什麼現在的 LLM 選擇了「折衷方案」。

    流派一:Character-level

    把 “Apple” 切成 [‘A’, ‘p’, ‘p’, ‘l’, ‘e’]。

    • 優點:字典超小,絕對不會有不認識的字
    • 缺點:沒有意義,’p’ 本身沒有意義,要拼在一起才有,但是拼湊起來的序列會變得超級長。讓 AI 讀一本書,如果每個字母都是一個 Token,它的記憶體瞬間就會爆掉
    • 比喻: 就像讀書時,必須把每個單字拼出來唸:A-P-P-L-E,效率極低

    流派二:Word-level

    把 “Apple” 切成 [‘Apple’]。

    • 優點:每個 Token 都有完整語意,AI 很好理解
    • 缺點:字典會大到爆炸,英文有幾十萬個單字,還有各種變形(walk, walking, walked, walks)。如果遇到字典裡沒有的字,AI 就會顯示 [UNK](Unknown),直接當機或變笨
    • 比喻:就像你背了一本厚厚的英漢字典,但只要考試出了一個字典沒收錄的潮語(例如「普信男」),你就完全看不懂了

    流派三:Subword-level

    這是目前 LLM的主流技術,它的核心精神是:「常見的字不切,少見的字切開」,這是一種叫做 BPE (Byte Pair Encoding) 的演算法。它保留常見單字的完整性(效率高),又保留把生字拆解成字根字首的能力(靈活性高,不會有不認識的字)。如果遇到超級生僻的字(例如亂碼),它大不了就退化成 Character-level,一個字母一個字母切,保證讀得懂。

    第四章:Token 與成本,中文使用者比較吃虧

    這是一個身為台灣使用者必須知道的殘酷現實:Token 是 AI 的計價貨幣。當你使用 OpenAI 的 API,或是某些付費 AI 服務時,計費標準通常是「每消耗 1,000 Tokens 多少錢」。

    1. 編碼效率的不平等

    目前 BPE 演算法大多是根據大量英文內容訓練而成的,所以 Tokenizer 對英文特別「友善」。

    • The quick brown fox > 4 個單字 > 4 Tokens
    • 這隻敏捷的棕色狐狸 > 9 個字 > 可能高達 6~8 Tokens

    這意味著,表達同樣的意思,中文往往需要消耗更多 Tokens。這導致

    1. 使用中文的成本比較高:處理同樣的任務,中文使用者的 API 帳單可能會比英文使用者貴一倍
    2. 比較慢:生成 1000 個 Tokens 比生成 500 個 Tokens 花更多時間,所以你會覺得 AI 講中文稍微慢一點
    3. 比較佔記憶體:同樣長度的上下文視窗,英文可以塞比較多內容,中文能塞的內容較少

    好消息是新一代的模型正在優化這一點,讓中文字的 Token 壓縮率越來越好。

    第五章:AI 的短期記憶體 Context Window

    了解 Token 後,我們就能解釋另一個關鍵參數:Context Window(上下文視窗)。你會看到模型規格寫著:Context Window = 8k, 32k, 128k Tokens。

    1. 什麼是 Context Window

    這是 AI 在「這一次對話中」能記住的 Token 總量上限,它包含(你現在輸入的 Prompt)+(AI 剛剛生成的回答)+(前面幾輪的對話歷史)

    2. 生活情境:考前衝刺的腦容量

    想像你是一個要考期末考的學生,你的大腦容量有限,只能同時記住 4,000 個字。

    • 如果課本只有 1,000 字: 沒問題,你可以全部記住,考試對答如流
    • 如果課本有 10,000 字: 慘了,你記了後面,前面的就忘記了。這就是為什麼當你跟 ChatGPT 聊太久,它會忘記你一開始設定的規則,因為那個設定已經被擠出 Context Window 之外了

    現在最新的模型支援 128k 甚至 1M Tokens,就像是從金魚腦進化成過目不忘的天才,可以直接把整本《哈利波特》丟進去讓它讀,它都不會忘記

    第六章:AI 如何思考

    最後,我們要回到 LLM 的運作核心。了解 Token 之後,你就會明白為什麼 AI 有時候會一本正經地胡說八道(幻覺)。

    1. 也是一種接龍遊戲

    大語言模型的本質,就是一個預測下一個 Token 機率的機器。當你輸入 [“今”, “天”, “天”, “氣”] 這些 Tokens 給模型,模型內部會進行龐大的矩陣運算,最後輸出一組機率表,預測下一個 Token 是什麼:

    • Token ID 56 (真):機率 70%
    • Token ID 88 (很):機率 20%
    • Token ID 99 (不):機率 10%

    如果 AI 選擇了「真」(ID 56),它會把這個 Token 加回句子裡,變成 [“今”, “天”, “天”, “氣”, “真”],然後再預測下一個字(可能是「好」),這就是所謂的 Autoregressive(自回歸) 生成。

    2. 為什麼會有幻覺

    因為 AI 並不是在「查資料庫」,它是在「玩拼圖」。它是根據看過的海量內容計算哪個 Token 接在後面最合理。如果你問它一個沒看過的冷門知識,它的機率計算可能會出錯,拼出一個「看起來很通順,但內容完全錯誤」的句子。因為對 Token 來說,文法通順的機率很高,但事實正確的機率它無法驗證。

    結語:掌握 Token,就是掌握 AI 的語言

    總結來說,Token 是 AI 時代的基礎貨幣與原子單位。

    1. 它是積木:透過 Tokenization,人類語言被拆解成機器可讀的結構
    2. 它是成本:決定了 API 的費用和運算速度
    3. 它是記憶:決定了模型能讀多長的文章
    4. 它是思考:AI 的生成本質就是不斷預測下一個 Token

    對於大學生來說,理解 Token 不只是為了考試或技術,而是為了更好地使用這個工具。當你知道中文 Token 比較貴、比較佔記憶體時,你就會知道在寫 Prompt(提示詞)時要精簡;當你知道 Context Window 的限制時,你就會知道為什麼要定期開新的對話視窗;當你知道它是透過 Token 預測來生成時,你就會對它的胡說八道保持警惕。

    在這個 AI 普及的時代,看懂 Token,你就不再只是被動的使用者,而是懂原本理的駕駛員。現在,去試試看算算你的 Prompt 到底花了多少 Tokens 吧!

  • AI 時代的創世神話:讀懂《Attention Is All You Need》與 Transformer 的魔法

    前言:那篇改變世界的論文

    當你在用 ChatGPT 寫通識課報告或是用 Midjourney 生成一張科幻圖片時,這一切的「智慧」起源,都可以追溯到 2017 年 Google 團隊發表的一篇論文 Attention Is All You Need。這篇論文公開發表之前,AI 領域還沈浸在另一種架構(Recurrent Neural Network 與 Long Short-Term Memory)。這篇論文的發表就像是一顆核彈徹底炸毀舊有的觀念,並建立一個名為 Transformer 的全新架構。它是現代所有大語言模型的祖師爺,簡單來說,如果沒有這篇論文,就沒有今天的生成式 AI 浪潮。

    這篇論文裡面滿滿的矩陣運算、向量空間,對於非資工系的大學生來說簡直是天書。別擔心,今天我們不談微積分,我們嘗試運用日常情境拆解這個讓電腦學會「讀心術」的秘密。

    第一章:在 Transformer 出現之前

    凸顯為什麼 Transformer 這麼偉大的方式可以先回頭看看以前的 AI 有多笨。

    1. 序列處理的詛咒 (Recurrent Neural Network)

    在 2017 年之前,處理語言的主流技術叫做 RNN(循環神經網路),它的運作方式蠻貼近人類閱讀習慣:從左到右,一個字一個字讀

    情境:期末考前的抱佛腳

    想像你在背課文,必須讀完第一個字,把它記在腦子裡,帶著這個記憶去讀第二個字,然後再帶著前兩個字的記憶去讀第三個字……。這有兩個致命缺點:

    1. 慢: 你不能跳著讀,一定要讀完第 99 個字,才能讀第 100 個字。電腦雖然有強大的 CPU 或 GPU 算力,卻被迫一個字接著另一個字的閱讀方法,效率極低。
    2. 金魚腦: 當句子很長時,讀到最後一個字,往往已經忘了開頭是什麼。
      • 例子:「我出生在台灣……(中間講了三千字廢話)……所以我講一口流利的__」
      • 舊模型讀到最後,已經忘了開頭的「台灣」,可能填上「英語」或「火星語」

    這時候,《Attention Is All You Need》論文跳出來說:「為什麼要一個字一個字讀?我們為什麼不一次把整本書攤開來看?

    第二章:什麼是「注意力 (Attention)」

    這篇論文的核心哲學就是:注意力機制(Attention Mechanism)

    1. 雞尾酒會效應

    想像你在一個吵雜的雞尾酒會,背景音樂很大聲,酒保在搖酒。當心儀對象跟你說話時,你能夠神奇地「過濾」掉所有噪音,只關注他的聲音,這就是 Attention。這隱喻著處理語言時,不是每個字都一樣重要。

    2. 關鍵字之間的紅線

    當 AI 看到這句話:「小明香蕉皮丟在地上,結果滑倒了。」如果要理解最後那個「他」是指誰?

    • 笨 AI 會覺得「他」是指離最近的「地上」或「香蕉皮」
    • Transformer 透過注意力機制,會算出「他」這個字與「小明」的關聯性最高

    這就像是 AI 在讀句子時,手裡拿著一支螢光筆,在字與字之間畫上了無數條連線,並且標註線的粗細(代表著重要程度)。

    第三章:Transformer 的引擎 Self-Attention

    這是論文中最重要的觀念,也是讓 AI 產生「理解力」的關鍵。我們用圖書館找書的例子解釋其中的 Query (Q)、Key (K)、Value (V) 三個參數。在 Transformer 裡,每一個 Token 進入模型後,都會被分裂成三個分身:

    1. Query:查詢向量(我在找什麼?)
    2. Key:索引向量(我是什麼標籤?)
    3. Value:內容向量(我實際的內容是什麼?)

    情境:圖書館檢索系統

    想像你走進一座圖書館尋找一本關於「蘋果」的書。

    1. Query:你手裡拿著一張便條紙,上面寫著:「我想找跟『紅色水果』有關的書」。
    2. Key:架上每一本書的書背上都有標籤。
      • 書 A 的標籤寫著 [卡車、交通]
      • 書 B 的標籤寫著 [蘋果、水果、紅色]
      • 書 C 的標籤寫著 [香蕉、水果、黃色]
    3. 比對 (計算兩個向量的 Dot Product):系統會拿 Query 去跟每一本書的 Key 做比對(計算相似度)。
      • Q vs 書 A:完全不合(權重 0%)
      • Q vs 書 B:超級符合(權重 90%)
      • Q vs 書 C:有點像,但不完全是(權重 10%)
    4. Value:系統根據這些權重,把書的內容加總起來給你。你得到的資訊主要來自書 B,少部分來自書 C。

    回到語言模型

    當模型在處理「銀行」這個字時:

    • 如果上下文是「我把錢存進銀行」,它的 Query 會去尋找跟「金錢、機構」有關的 Key,確認這裡是 Bank (金融機構)。
    • 如果上下文是「我在河岸的銀行散步」,它的 Query 會去尋找跟「河流、邊緣」有關的 Key,確認這裡是 Bank (河岸)。

    透過 Q、K、V 的瘋狂運算,AI 不再是死記硬背,而是根據上下文動態地決定每個字當下的意義,這就是為什麼 ChatGPT 能聽懂雙關語的原因。

    第四章:多頭注意力 Multi-Head Attention

    論文中還提到另一個關鍵技術:Multi-Head Attention。如果只有一組 Q、K、V,可能視角太單一,就像你讀一本書,如果只關注「文法」,你可能會忽略「情感」。

    情境:電影影評團 想像你要分析一部電影,你找了 8 位專家看這部片:

    • 專家 A:專門看文法結構(主詞對應動詞)
    • 專家 B:專門看時間關係(先發生什麼,後發生什麼)
    • 專家 C:專門看代名詞指涉(「它」是指什麼)
    • 專家 D:專門看情感語氣(這句話是諷刺還是讚美)

    最後,Transformer 把這 8 位專家的筆記拼接 起來,經過整理就得到一個對這部電影全方位、多角度的理解。這就是為什麼論文標題說 “Attention Is All You Need”,因為只要有足夠多的 Attention Heads(上述情境的專家就代表一個 Head),你就能捕捉到語言中所有的細節。

    第五章:位置編碼 Positional Encoding

    還記得第一章說 Transformer 不像舊 AI 那樣從左讀到右,而是「一次看整頁」嗎?這帶來了一個新問題:它不知道順序。對於電腦來說,「我愛你」和「你愛我」,如果把這三個字同時丟進去,數學上看起來是一樣的組合。但在愛情裡,這可是天差地遠的悲劇。為了讓 AI 知道順序,論文提出一個天才般的設計:位置編碼(Positional Encoding)

    情境:散落的漫畫頁 你買了一本漫畫,但不小心把書背膠弄斷了,頁面散落一地。因為你是「同時」看著這一堆紙,你根本不知道劇情順序。解決方法是:在每一頁的角落,蓋上一個頁碼章

    • 「我」蓋上 [位置 1] 的章
    • 「愛」蓋上 [位置 2] 的章
    • 「你」蓋上 [位置 3] 的章

    這些「章」不是普通的數字,而是一組特殊的數學向量(正弦波與餘弦波,補充給好奇心爆棚的你)。當這些向量加到文字原本的數值上時,AI 就能在平行運算的同時,依然保留「誰在前、誰在後」的資訊。

    第六章:Encoder 與 Decoder 的分工

    《Attention Is All You Need》原本是為了做「機器翻譯」而設計的,所以它的完整架構包含了兩大部分:Encoder(編碼器)Decoder(解碼器)

    1. Encoder:負責「理解」

    • 任務: 讀取輸入的英文句子(例如 “Hello World”)
    • 動作: 透過 Self-Attention 和 Multi-Head,把這句話徹底消化,分析出它的語意、文法、情感,濃縮成一個高維度的「觀念向量」
    • 譬喻: 試吃員吃了這道菜,把味道、口感、食材全部記在腦海裡,形成一個抽象的「美味概念」

    2. Decoder:負責「生成」

    • 任務: 根據 Encoder 傳來的「觀念」,生成德文句子
    • 動作: 它一方面要看自己已經寫了什麼字,一方面要回頭看 Encoder 給的資訊,逐字產生翻譯
    • 譬喻: 廚師根據試吃員描述的「美味概念」,嘗試做出一道同樣美味,但擺盤風格完全不同的菜

    第七章:為什麼這篇論文很重要

    最後,我們要回答一個問題:為什麼是 Transformer 贏了?

    除了效果好,最關鍵的原因是:它快得驚人

    1. 拆牆與砌牆

    • 舊的 RNN: 就像一個水泥師傅砌牆,他必須砌好第一塊磚,才能疊第二塊。如果你給他 100 個助手,那 99 個人只能在旁邊看戲,因為工作是線性的
    • Transformer: 就像是拼圖,它把整個句子的運算矩陣化。只要你的 GPU 夠大,你可以讓 100 個助手同時處理句子的不同部分

    2. 資料的大爆發

    因為 Transformer 可以平行運算,這意味著我們可以把模型做得超級大,餵給它的資料可以超級多,這導致後來「大模型時代」的來臨。GPT-1、GPT-2、GPT-3 到現在的 GPT-5,本質上就是不斷疊加更厚的 Transformer 層數,餵更多資料,燒更多顯卡。而這一切的基石,就是這篇論文證明了「只要有 Attention,你就能並行處理所有資訊」。

    結語:站在巨人的肩膀上

    《Attention Is All You Need》這篇論文,就像是 AI 界的工業革命蒸汽機圖紙,它把自然語言處理從手工業時代帶入了重工業時代。現在你回頭看 ChatGPT,就會明白它不是魔法。它是由無數個 Head 在觀察你的意圖, 無數個 Q、K、V 在資料庫中檢索關聯,透過 Positional Encoding 記住你說話的順序,最後由 Decoder 一個字一個字地把最可能的回答「接龍」出來。下次當你覺得 AI 很聰明時,記得感謝 2017 年那群 Google 的科學家,是他們發現了:原來,你不需要複雜的記憶結構,你需要是更多的「注意力」。

  • 數位時代的「讀心」魔術師:解構大語言模型 (LLM) 的大腦與靈魂

    前言:從「人工智障」到「人工智慧」的奇點

    回想幾年前,當你打電話給銀行語音客服或者試圖跟早期 Siri 聊天時,那種雞同鴨講的挫折感,時不時會聽到 Siri 說:「對不起,我聽不懂您的意思」。這句話,曾經是我們對 AI 的既定印象。到了 2022 年底,ChatGPT 橫空出世,世界彷彿在一夜之間變了。ChatGPT 不僅聽得懂你說的冷笑話,能幫你寫通識課的期末報告大綱,甚至還會寫寫程式或翻譯古希臘文。許多人都驚呼:「這東西,比我還像個人了吧!」陰謀論者則懷疑,ChatGPT 背後是不是雇用某中亞國家的大量勞動人力,AI 背後其實只是躲著一群過勞的工讀生在打字而已。

    這個被稱為「大語言模型(Large Language Model,簡稱 LLM)」的技術,並不是魔法,而是數學、統計學與龐大算力堆疊出來的工程奇蹟。今天,我們不談複雜的微積分公式,而是用你生活中的日常情境,拆解這個數位大腦到底是如何運作的。

    第一章:它其實只是一個「超級接龍高手」

    要理解 LLM,我們得先打破一個迷思:它並沒有像人類一樣的「意識」或「靈魂」,它也不懂自己在說什麼。

    1. 文字接龍的極致

    想像你在玩「文字接龍」,如果我說:「床前明月」,你腦中會自動跳出什麼字? 99% 的人都會說:「光」。為什麼?因為在你的閱讀經驗裡,「光」接在「床前明月」後面的機率最高。大語言模型本質上就是在做這件事:預測下一個字

    2. 機率分佈:AI 的選字邏輯

    當你拋出一個問題給 LLM 時,它並不是在「思考」,而是在計算機率。假設你輸入:「今天天氣真…」 模型會計算接下來出現各種字的機率:

    • 「好」:40%
    • 「熱」:30%
    • 「糟」:20%
    • 「棒」:10%

    它會根據這些機率選擇一個最合理的字填上去,然後再把這個字加入前面的句子,繼續預測下一個字。就這樣一個字接一個字,最後串成一篇流暢的文章。所以,當你覺得 AI 很有「創意」時,其實是因為它在選擇下一個字時,偶爾不會選機率最高的那個(這在 AI 參數中稱為「溫度」),而是選了一個機率次高但更有趣的字,這就產生了意想不到的文采。

    第二章:為什麼叫「大」?參數與資料的暴力美學

    如果只是文字接龍,為什麼以前的 AI 做不到這麼好?關鍵在於 LLM 中的 “Large”(大)

    1. 參數量:模型的腦細胞

    你可能聽過 GPT-4、Llama 3 有多少「參數」,例如 70B(代表有 700 億個參數)、175B(1,750 億),這些參數代表什麼意思呢?想像一位剛入學的大一新生,對於專門學科技術名詞的認識是一片空白。為了讓他能通過考試,你需要調整他的腦神經連結強度。

    • 參數就像是神經元之間的連接點,或者是機器上可以調節的「旋鈕」
    • 訓練就是不斷調整這幾千億個旋鈕的刻度,直到這個機器能針對任何輸入,都輸出正確的答案

    早期的 AI 只有幾萬個旋鈕,能處理的任務相對簡單。現在的 LLM 擁有數千億個旋鈕,這讓它能捕捉到人類語言中極其細微的邏輯、情感和隱喻。

    2. 訓練資料:吃掉整座圖書館

    為了調整這些旋鈕,我們需要餵給它海量的資料。LLM 的閱讀量是驚人的,它已經讀過網路上幾乎所有的公開文本:維基百科、Reddit 論壇、幾百萬本書籍、論文、程式碼庫。情境比喻:想像你要把一個從沒看過書的外星人,訓練成地球通。你把他關在圖書館裡,強迫他讀完人類歷史上所有的書。雖然他可能不懂「愛」的生理反應,但他讀了幾萬本愛情小說後,他能比任何人都更精準地寫出肉麻的情書。這就是 LLM 的狀態:博學,但沒有體驗

    第三章:靈魂核心 Transformer 與注意力機制

    在 2017 年之前,AI 閱讀長文章的能力很差。它讀到文章這頭,很容易就忘了開頭說什麼。直到 Google 發表一篇名為《Attention Is All You Need》的論文,提出了 Transformer 架構,才改變了一切。這是 LLM 最難懂但也最重要的技術概念,我試著用「雞尾酒會效應」來解釋。

    1. 什麼是注意力機制

    在一個吵雜的雞尾酒會中,雖然周圍充滿了噪音,但你可以專注地聽到你朋友說的話,並忽略背景雜音。當你朋友提到「那部電影」時,你會瞬間聯想到你們五分鐘前聊到的《奧本海默》,這就是注意力機制

    在 Transformer 出現之前,AI 讀句子是線性的:「小明把香蕉皮丟在地上,… (中間參雜 5,000 個文字) …,結果小華踩到它滑倒了。」舊的 AI 讀到最後的「它」時,可能已經忘記前面的「香蕉皮」。 但 Transformer 具有「注意力」,當它處理「它」這個字時,它會回頭去掃描整句話,並算出「它」與「香蕉皮」的關聯性最高,而不是「小明」或「地上」。

    2. 平行處理的能力

    以前的 AI 像是一個字一個字讀書的學生,速度慢且容易忘。Transformer 架構下的 LLM,像是一個速讀天才,它可以同時看到整篇文章的所有字,並瞬間建立字與字之間複雜的關聯網。這讓 AI 能夠理解長篇大論,並且在寫作時保持邏輯連貫。

    第四章:AI 的求學三部曲,它是如何被訓練出來的

    一個 LLM 從出生到能跟你聊天,需要經歷三個階段。

    第一階段:預訓練 (Pre-training) 通識教育

    這是最花錢、最花時間的階段。

    • 目標: 讓 AI 學會「說人話」和「具備世界知識」。
    • 方法: 讓 AI 做大量的「克漏字測驗」,把一句話挖空幾個字,讓 AI 猜,猜錯了就調整參數。
    • 結果: AI 讀完整個網際網路,變成「懂很多的瘋子」。這時候的 AI 雖然知識淵博,但你問它:「如何製作炸彈?」它會興高采烈地給你詳細教學,完全沒有道德觀念;或者你問它「你好」,它可能會接著說「你好嗎?我很好,今天天氣…」開始自言自語,而不是回答你。

    它學會了機率,但還不懂人類的對話模式。

    第二階段:監督式微調 (Supervised Fine-Tuning) 專業必修

    為了讓這個「懂很多的瘋子」變成「有用的助理」,我們需要教它規矩。

    • 目標: 讓 AI 學會「一問一答」的指令跟隨模式。
    • 方法: 人類寫好成千上萬個高品質的「問題 + 正確答案」範例,餵給 AI 看。
      • 問:「請幫我寫一封求職信。」
      • 答:「好的,這是範本…」
    • 結果: AI 學會當你提出請求時,它應該要提供協助,而不是接著寫小說,它順利地從「瘋子」變成一名夠格的「實習生」。

    第三階段:人類回饋強化學習

    這是讓 ChatGPT 如此好用的關鍵祕技。

    • 目標: 讓 AI 的回答符合人類的價值觀(有用、誠實、無害)。
    • 方法:
      1. AI 針對同一個問題生成三個不同的回答。
      2. 人類標註員來評分:「回答 A 有禮貌,回答 B 有種族歧視,回答 C 是廢話。」
      3. 訓練一個「獎勵模型」來模仿人類老師的評分標準。
      4. 用這個獎勵模型去處罰或獎勵 AI。
    • 結果: AI 學會了看臉色,它知道不能教人做壞事,說話要客氣,遇到不懂的要婉轉拒絕,它終於變成了「彬彬有禮的高級助理」。

    第五章:一本正經地胡說八道,關於「幻覺」

    你有沒有遇過一種同學,考試時遇到不會的申論題,因為不想留白,就開始瞎掰,而且寫得頭頭是道、字跡工整,連老師看了都差點信了?這在 AI 領域稱為「幻覺(Hallucination)」。

    為什麼會產生幻覺

    還記得第一章說的嗎?LLM 的本質是「文字接龍」和「機率預測」,它並不是在「查資料庫」,而是在「生成文字」。當你問它一個它沒看過的冷門知識,例如:請介紹台灣 2026 年的大學入學制度,它的神經網路裡找不到確切的連結,但它為了完成「接龍」的任務,就會根據機率拼湊出看起來很像真的句子。

    它不是在說謊,因為它沒有欺騙的意圖;它只是在做夢

    日常生活警示: 如果你用 ChatGPT 寫作業,可能曾經叫它「找文獻引用」。你千萬要檢查這些引用來源的真實性與正確性,因為,它可能會捏造出看起來超像真的論文標題、作者、甚至期刊名,但這些論文根本不存在。

    第六章:Token 是 AI 的計價單位

    在使用 API 或付費版 AI 時,你會常聽到「Token」這個詞。 Token 是 LLM 處理文字的最小單位,它不完全等於一個字(Word)或一個字元(Character)。

    • 英文: 1 個 Token 大約是 0.75 個單字,例如 “Hamburger” 可能是一個 Token,但複雜的字可能被切成 “Ham-bur-ger”。
    • 中文: 1 個中文字通常對應 1 到 2 個 Token(取決於模型的編碼表)。

    情境比喻: 如果 LLM 是計程車司機,Token 就是它的跳表單位。它不是算字數,而是算它用了多少 Token 數。當你丟一篇長論文給它讀時,要小心 Context Window(上下文視窗)的限制,也就是它的「短期記憶」容量。一旦超過 Token 上限,它就會像金魚一樣忘記最前面的內容。

    第七章:未來的挑戰與你們的機會

    了解了 LLM 的原理後,你該如何面對這個技術?

    1. 它不是搜尋引擎

    Google 搜尋是幫你找「真實存在的既有網頁」;LLM 是幫你「生成全新的內容」。 如果你需要 100% 正確的資訊(如法規、歷史年分),請 Google 它。假如你需要創意、整理、摘要、翻譯、寫程式,請找 LLM。

    2. 提示工程(Prompt Engineering)是新的必修課

    既然 LLM 是透過「注意力機制」和「機率」運作的,你給的指令(Prompt)越精確,它就能越好地鎖定相關的知識。

    • 壞指令: 「幫我寫報告。」
    • 好指令: 「你是一位資深的行銷系教授(設定角色),請針對 Z 世代的消費習慣(限定主題),寫一篇 1000 字的分析報告(限定格式),語氣要專業且引用具體數據(設定風格)。」

    這就像是對待一個很有才華但需要明確指令的工讀生。

    3. 批判性思維比以往更重要

    AI 可以幫你產出 90% 的內容,但剩下的 10% (驗證真偽、判斷價值、注入人性溫暖),是它做不到的。在 AI 時代,「問對問題」的能力,比「回答問題」的能力更有價值。

    結語:站在巨人的肩膀上

    大語言模型是人類科技史上的里程碑,它既不是毀滅人類的魔鬼,也不是全知全能的神。它是一面鏡子,反射出人類集體智慧的總和。建議你不要抗拒它,也不要盲目依賴它,但是努力地去理解它的原理 (那數千億個參數是如何流動?注意力機制是如何聚焦?)。

    當你理解它是如何運作的,你就不會被它取代,而是能夠駕馭它,讓這位數位時代最強大的助手,成為你探索未來的噴射引擎。下次,當你打開 ChatGPT 時,試著對它說聲謝謝,雖然它沒有感情,但這背後代表無數科學家與工程師對「智慧」的極致追求。

  • 告別「加號」地獄:JavaScript 字串革命與 Template Literals 的魔法

    前言:關於「拼貼」的惡夢

    假想你正坐在小學時的美勞課教室裡,美術老師發給全班每位同學各一張畫紙,並且要求製作一張「自我介紹」的海報。內容的製作方式規定用最原始的剪貼方法完成,海報內容的製作過程大概是這樣的:

    1. 先在報紙找到並剪下「我」這個字
    2. 拿起膠水把「我」這個字貼到畫紙
    3. 接著再剪下「叫做」這個字,貼上去
    4. 找不到合適的字,就改用彩色筆寫上自己的名字「王小明」
    5. 然後繼續剪下「,今年」這幾個字……

    這種製作過程鐵定弄得滿手都是膠水不說,如果不小心貼歪了、或者字與字中間忘記留空白,整張海報就毀了。在 2015 年之前的 JavaScript 世界(ES5 時代),程式設計師處理文字(String)的方式,就很類似這種原始的剪貼方式,這種技巧被稱之為「字串串接(String Concatenation)」。

    自從 ES6 版本發布後,JavaScript 獲得一項神級裝備:Template Literals(樣板字面值),俗稱樣板字串。它就像是一張設計好的「數位表單」,你只需要在空格裡填字,其他的格式電腦自動幫你處理好。我們就用大學生的日常情境,來聊聊這個讓 Web 開發者從地獄飛升到天堂的語法。

    第一章:認識新朋友「反引號」

    1. 鍵盤上的邊緣人

    首先,我們要尋找開啟魔法的鑰匙。 低頭看看鍵盤左上角 Esc 鍵的下面、數字 1 鍵的左邊,有一個長得像毛毛蟲的符號 ~,在那個鍵上,還存在著一個不起眼的小撇號 `。這個小撇號有個英文名字叫做 Backtick,中文則叫它「反引號」。

    • 舊時代的字串:使用單引號 ‘ ‘ 或雙引號 ” “
    • 新時代的樣板字串:必須使用反引號 ` ` 包起來

    2. 為什麼要換符號

    我自己當初是蠻好奇:「單引號用得好好的,幹嘛多學一個符號?」深入研究才逐漸地理解因為單引號和雙引號在處理「文字裡的引號」時很痛苦,假設你要在螢幕上印出這句話:I’m a student at “NTU”.

    如果你用單引號寫:

    JavaScript
    
    // 錯誤示範
    let str = 'I'm a student...'; // 程式爆掉!

    電腦讀到 I 後面的單引號,就會以為字串結束了,後面的 m 會被當成亂碼。你必須用反斜線 \ 來轉譯(Escape),寫成 ‘I\’m a student…’。

    但如果你用反引號

    JavaScript
    
    // 完美示範
    let str = `I'm a student at "NTU".`;

    在反引號的世界裡,單引號和雙引號都是普通的文字,完全不需要特殊處理。這就像是給了文字一個專屬的 VIP 包廂,外面怎麼吵都影響不了裡面。

    第二章:填空遊戲的藝術「變數嵌入 (Interpolation) 」

    這是 Template Literals 最強大的功能,也是它被稱為「樣板」的原因。

    1. 舊時代的「加號」地獄

    假設你在寫一則社群網站的歡迎訊息,內容包含兩個變數:name 和 count(代表通知數量)。

    舊寫法:

    JavaScript
    
    const name = "傑哥";
    const count = 5;
    
    // 注意那個 '+' 和裡面無數個引號
    const msg = "哈囉," + name + "!您目前有 " + count + " 則新通知。";

    這種寫法有幾個致命缺點:

    1. 容易寫錯: 你很容易忘記加空格,變成 哈囉,傑哥!您目前有5則新通知。(黏在一起)
    2. 閱讀困難: 程式碼被切得支離破碎,很難一眼看出這句話原本長怎樣
    3. 手很酸: 你要一直按 Shift 鍵輸入雙引號或加號

    2. 新時代的 ${} 魔法

    讓我們看看樣板字串怎麼做?其實有點像是在玩填字遊戲。

    新寫法:

    JavaScript
    
    const name = "傑哥";
    const count = 5;
    
    // 乾淨、直觀
    const msg = `哈囉,${name}!您目前有 ${count} 則新通知。`;

    看到那個 ${} 了嗎?這就是魔法所在。

    • 規則: 在反引號 `…` 的範圍內,只要看到 ${…},電腦就會自動把花括號裡面的變數「算出來」,然後把結果填進去。

    這就像是你在寫一張邀請卡:「親愛的 ________,誠摯邀請您參加…」,你不需要把紙剪開再黏貼名字,只需要在橫線上填寫名字就好。這讓程式碼的可讀性提升了一個檔次,你寫的程式碼長得就跟輸出的結果一模一樣。

    第三章:詩人的救贖「多行字串 (Multi-line Strings) 」

    1. 舊時代的 \n

    想像你要在網頁上印出一首唐詩或者一段分行的地址。在以前,JavaScript 的字串是不允許直接換行的。如果你在程式碼裡按下 Enter 鍵,程式會報錯,你必須使用特殊的換行符號 \n (Newline):

    JavaScript
    
    // 舊寫法:醜陋且難以排版
    const poem = "床前明月光,\n" +
                 "疑是地上霜。\n" +
                 "舉頭望明月,\n" +
                 "低頭思故鄉。";

    這種用法就像從使用打字機寫詩保留下來的習慣,每次換行都要手動推一下機器,非常不直覺。

    2. 新時代:想換行就換行

    Template Literals 完全保留程式碼中的排版,如果你在反引號裡按下了 Enter,輸出的字串裡就會真的有一個 Enter。

    JavaScript
    
    // 新寫法:所見即所得
    const poem = `
      床前明月光,
      疑是地上霜。
      舉頭望明月,
      低頭思故鄉。
    `;

    這對於程式開發者寫 HTML 結構或是 SQL 查詢語句時非常有用,你可以把程式碼排版得漂漂亮亮,不用擔心被擠成一坨。

    第四章:字串裡的微型計算機「表達式嵌入」

    還記得剛剛說的 ${} 嗎?它不只能放變數,其實也可以放任何 JavaScript 的表達式(Expression)

    1. 什麼是表達式

    簡單來說,只要能「算出一個值」的東西,都叫表達式,舉例:

    • 1 + 1 是表達式(算出 2)
    • age >= 18 是表達式(算出 true 或 false)
    • Math.max(10, 20) 是表達式(算出 20)

    2. 在字串裡算數學

    假設你從網路買了 3 本書,每本 200 元,你想印出總價。

    JavaScript
    
    const price = 200;
    const quantity = 3;
    
    // 直接在 ${} 裡面做乘法!
    const total = `您購買了 ${quantity} 本書,總金額是 ${price * quantity} 元。`;
    
    console.log(total); // 印出:您購買了 3 本書,總金額是 600 元。

    你不需要先在外面宣告一個 let sum = price * quantity,直接在字串裡算就好,這就像是你的收據紙上內建了一台計算機。

    3. 字串裡的邏輯判斷「三元運算子 (Ternary Operator) 」

    三元運算子是一種進階撰寫技巧,在 Web 開發超級常用。假設你要顯示使用者的登入狀態,

    JavaScript
    
    const isLogin = true;
    // 如果 isLogin 是 true,顯示「歡迎回來」;否則顯示「請先登入」
    const status = `系統訊息:${ isLogin ? "歡迎回來" : "請先登入" }`;

    這讓你的文字具有了「智慧」,能根據狀況自動改變內容,而不用寫一大堆 if…else。

    第五章:前端開發的神器「HTML 樣板」

    HTML 樣板大概是 Template Literals 對 Web 開發貢獻最大的地方,假設你是系學會網站的管理員,打算把「幹部名單」顯示在網頁上。如果不使用現代網頁開發框架,只用原生 JavaScript 撰寫網頁的程式碼,你極有可能會寫到想哭出來。

    舊寫法(字串拼接地獄):

    JavaScript
    
    const member = { name: "小華", job: "公關長" };
    const html = "<div class='card'>" +
                 "  <h2>" + member.name + "</h2>" +
                 "  <p>" + member.job + "</p>" +
                 "</div>";
    // 只要少一個引號,網頁就破圖

    新寫法(樣板字串):

    JavaScript
    
    const member = { name: "小華", job: "公關長" };
    
    // 就像在寫真的 HTML 一樣!
    const html = `
      <div class="card">
        <h2>${member.name}</h2>
        <p>${member.job}</p>
      </div>
    `;

    看到差別了嗎?新寫法不僅保留 HTML 的縮排結構,讓我們一眼就能看出網頁長什麼樣子。而且,變數插入的位置也一目了然,這對於初學者理解「JavaScript 如何控制網頁」是非常好的寫作方法。

    第六章:進階魔法「標籤樣板字面值 (Tagged Templates) 」

    最後,我們來介紹一個聽起來很學術,但其實很有趣的功能:Tagged Templates。 這有點像是你把字串丟進一座「加工廠」裡,出來的東西會變不一樣,它的語法長這樣:

    JavaScript
    
    function highlight(strings, ...values) {
      // 這裡可以寫邏輯來處理字串...
      // 例如把變數都加上紅色的 HTML 標籤
    }
    
    const name = "小明";
    const action = "睡過頭";
    // 注意!highlight 後面直接接反引號,沒有括號!
    const result = highlight`昨天 ${name} 又 ${action} 了`;

    雖然初學者可能暫時用不到這個,但如果你未來學習 React 這個熱門框架,你會看到一個很有名的套件叫 styled-components,它就是用這種魔法來寫 CSS 樣式的。

    結語:從工具看見思維的轉變

    JavaScript 的 Template Literals 不僅僅是一種「新語法」,也代表程式語言設計思維的轉變:從「配合電腦」轉向「配合人類」

    • 以前: 我們為了配合電腦的邏輯,把一句完整的話拆得支離破碎,用一堆加號黏起來。
    • 現在: 電腦配合我們的閱讀習慣,讓我們用最自然的語氣、最直觀的排版來撰寫程式碼。

    對於開發者來說,這就像是從手寫筆記進化到使用 Notion 或 iPad 筆記一樣。內容本質可能沒變,但工具的便捷性會讓你更願意去創作、去開發。下一次,當你在寫 JavaScript 或者試著做自己的個人網站時,看到那個要按 Shift 才能打出來的 + 號,請停下來想一想: 「是不是該按下鍵盤左上角的那個魔法鍵 ` 了?」

    擁抱 Template Literals,讓你的程式碼像詩一樣優雅吧!

  • 程式碼的「拆禮物」哲學:一次搞懂 JavaScript 的解構賦值 (Destructuring)

    前言:從網購包裹說起

    在網路上大買特買一番的幾天後,物流寄來一個巨大紙箱,裝著你買的新球鞋、一件帽 T,還有一組藍牙耳機。每次要聽音樂時,你會把整個大紙箱揹在身上,把頭伸進紙箱裡找耳機嗎?當然不會!你會做的是「開箱」:把球鞋放到鞋櫃、帽 T 掛進衣櫥、耳機拿出來放在桌上,簡言之,你把原本都在「同一個箱子」裡的東西,拿出來變成「獨立」的物品,方便你隨手取用。

    2015 年之前的 JavaScript 世界裡(稱為 ES5 時代),Web 設計師就像是揹著大紙箱的人,每次要用資料,都要輸入一長串的路徑去「箱子」裡撈。自從 ES6 版本發布後,JavaScript 引入一個革命性的語法:Destructuring Assignment(解構賦值),它就像是一把美工刀,讓我們能優雅地劃開資料的膠帶,把裡面的數值「瞬間」拿出來變成獨立的變數。今天,我們就用大學生活的日常拆解這個讓所有 Web 開發者都愛不釋手的語法糖。

    第一章:為什麼我們需要「解構」

    我們先來看看「沒有解構」的世界有多麻煩。

    1. 痛苦的點名時間

    假設你在寫一個社團成員的網頁,伺服器傳來一份社員資料,這是一個「物件(Object)」,部分內容如下:

    JavaScript
    
    // 這是我們拿到的一個資料包(Object)
    const student = {
      name: "王小明",
      age: 20,
      department: "資管系",
      gpa: 3.8
    };

    在 ES5 時代,如果想把這個同學的資訊印在螢幕上,必須這樣寫:

    JavaScript
    
    // ES5 時代寫法
    const name = student.name;
    const age = student.age;
    const dept = student.department;
    console.log(name + " 是 " + dept + " 的學生");

    發現了嗎?你一直重複寫 student.、student.、student.。這就像是每叫一次王小明,都要連名帶姓加上就讀科系喊一遍:「資管系的王小明請回答」、「資管系的王小明今年幾歲」。這種用法不僅累人,程式碼看起來也很雜亂。

    2. 解構賦值的魔法

    我們用「解構賦值」重寫這段程式碼,這就是把東西從箱子裡「拿出來」的瞬間:

    JavaScript
    
    // 新時代的寫法:解構!
    const { name, department } = student;
    console.log(name + " 是 " + department + " 的學生");

    這行 const { name, department } = student; 做了什麼事?它告訴電腦:「請去 student 這個箱子裡,找到標籤寫著 name 和 department 的東西,然後把它們拿出來,直接變成兩個獨立變數,名字也叫 name 和 department。」

    就這樣,一行搞定。這就是解構的核心精神:DRY (Don’t Repeat Yourself),別做重複的事。

    第二章:陣列解構 (Array Destructuring) 

    JavaScript 裡有兩種最主要的資料容器:陣列 (Array)物件 (Object),解構這兩種容器的邏輯稍有不同,先從比較簡單的「陣列」講起。

    1. 陣列就像「排隊」

    陣列裡的資料是有順序的,就像你去學生餐廳的自助餐買便當時,店員會依序幫你夾菜:第一格是飯,第二格是青菜,第三格是雞腿,最後附上一瓶養樂多。

    JavaScript
    
    // 一個陣列,代表今天的便當
    const lunchBox = ["白飯", "高麗菜", "炸雞腿", "養樂多"];

    2. 依序領取

    如果我們要用解構的方式把便當裡的東西拿出來,必須使用 方括號 [](注意,這裡的方括號在等號左邊,代表解構,不是創造新陣列)。

    JavaScript
    
    // 陣列解構
    const [staple, vegetable, meat, drink] = lunchBox;
    console.log(meat); // 印出:炸雞腿

    這裡的邏輯是「對號入座」:

    • 變數 staple 對應到 lunchBox 的第 1 個位置(Index 0)。
    • 變數 vegetable 對應到第 2 個位置。
    • 以此類推。

    重要觀念: 在陣列解構中,變數的名字不重要,順序才重要。 你高興的話,可以把雞腿取名為 myLove:

    JavaScript
    
    const [item1, item2, myLove] = lunchBox;
    console.log(myLove); // 還是印出:炸雞腿

    3. 跳過不想吃的菜

    假設今天你不想吃菜,只想要飯和雞腿,怎麼辦?我們可以用「留白」的方式跳過中間的項目。

    JavaScript
    
    // 使用逗號跳過中間的元素
    const [rice, , chicken] = lunchBox;
    console.log(rice);    // 白飯
    console.log(chicken); // 炸雞腿
    // 高麗菜就這樣被忽略了,不會產生變數佔用記憶體

    這在 Web 開發中很常見,有時候網頁網址分割後會產生一堆片段,我們只需要第一段和最後一段,中間的就可以用這種方式略過。

    第三章:物件解構 (Object Destructuring)

    接下來是 Web 開發中最常使用的 物件解構

    1. 物件就像「工具箱」

    物件裡的資料沒有順序,但是有名字(Key)。這就像筆袋或工具箱,你找原子筆不是看它在「左邊數來第三支」,而是看它是不是原子筆。

    JavaScript
    
    const iphone = {
      model: "iPhone 17",
      storage: "256GB",
      color: "Black",
      price: 29900
    };

    2. 認名不認人

    物件解構使用的是 花括號 {}

    JavaScript
    
    // 物件解構
    const { price, model } = iphone;
    console.log(model); // iPhone 17
    console.log(price); // 29900

    注意到什麼了嗎?我在解構的時候,把 price 寫在 model 前面。 沒關係,完全不影響! 因為物件解構是看「標籤名稱」,電腦會去 iphone 物件裡找 price 這個屬性,找到後塞給變數 price,順序怎麼換都沒差。

    3. 幫變數取綽號(Renaming)

    有時候伺服器傳回來的資料名字很爛,或者跟你的程式碼衝突。例如,伺服器給你的資料叫 class,但在 JavaScript 裡 class 是保留字(不能當變數名),這時候我們可以在解構的當下幫它改名

    JavaScript
    
    const user = {
      id: 9527,
      name: "唐伯虎",
      class: "高級伴讀書僮" // 假設後端傳來這個爛名字
    };
    
    // 語法: { 原本的名字 : 新的名字 }
    const { name, class: jobTitle } = user;
    console.log(jobTitle); // 印出:高級伴讀書僮
    
    // console.log(class); // 這會報錯,因為 class 變數不存在,它已經被改名成 jobTitle 了

    這招在串接 API時超級好用,例如 Google Maps API 可能回傳 lat,但你的程式碼習慣用 latitude,你就可以寫 const { lat: latitude } = location;。

    第四章:進階技巧

    程式開發跟人生一樣,充滿了意外。有時候你以為箱子裡有東西,打開卻是空的,解構賦值提供了一些機制來處理這些狀況。

    1. 預設值 (Default Values) —— 備案計畫

    假設你在做一個抽獎系統,有些會員資料裡有填「暱稱」,有些沒有。

    JavaScript
    
    const memberA = { id: 1, nickname: "超級瑪利歐" };
    const memberB = { id: 2 }; // 這位懶惰的會員沒填暱稱
    
    // 設定預設值
    const { nickname = "路人甲" } = memberB;
    console.log(nickname); // 印出:路人甲

    語法 { nickname = “路人甲” } 的意思是:

    1. 先去物件裡找 nickname。
    2. 如果有找到值,就用那個值。
    3. 如果是 undefined(找不到),就用 “路人甲” 當作值。

    這就像是去買便當,如果你沒說要什麼飲料,阿姨就「預設」給你養樂多,這能有效防止你的網頁因為讀不到資料而變成一片空白(或出現恐怖的 undefined)。

    2. 巢狀解構 (Nested Destructuring) —— 箱中之箱

    現實生活中的資料通常很複雜,像是「使用者的地址」可能又包含「城市」和「街道」。

    JavaScript
    
    const userProfile = {
      name: "阿呆",
      address: {
        city: "台北市",
        street: "羅斯福路",
        zip: 100
      }};

    如果你只想拿到 city,要怎麼做?

    JavaScript
    
    // 一層一層剝開洋蔥
    const { address: { city } } = userProfile;
    console.log(city); // 台北市

    這行程式碼的意思是:「去 userProfile 找 address,但不要把 address 拿出來,請進去 address 裡面再找 city,把 city 拿出來。」 所以執行完後,你會有 city 變數,但不會有 address 變數。

    第五章:實戰情境

    這可能是解構賦值在 Web 開發(特別是 React 框架)中,最最最重要的應用。

    情境:手搖杯的客製化

    想像你要寫一個函式來處理手搖杯訂單,一杯飲料可能有很多參數:甜度、冰塊、加料、尺寸、要不要袋子…

    如果不使用解構,你的函式可能會長這樣:

    JavaScript
    
    // 舊寫法:參數順序必須死記硬背
    function orderTea(teaName, sugar, ice, topping, size) {
      console.log(`你要一杯 ${teaName},${sugar},${ice}...`);
    }
    
    // 呼叫的時候很痛苦,如果不加料還要傳 null 佔位子
    orderTea("珍珠奶茶", "半糖", "少冰", null, "大杯");

    這簡直是惡夢,如果你忘記第 3 個參數是冰塊還是甜度怎麼辦?

    解構參數的優雅寫法

    現在,我們把所有選項打包成一個「物件」傳進去,並在函式接收端直接解構:

    JavaScript
    
    // 新寫法:接收一個物件,並直接解構出需要的屬性
    // 還可以順便設定預設值!
    
    function orderTea({ teaName, sugar = "全糖", ice = "去冰", topping = "無" }) {
      console.log(`訂單:${teaName}, ${sugar}, ${ice}, 加料:${topping}`);
    }
    
    // 呼叫的時候:
    // 1. 不需要管順序
    // 2. 參數清楚明瞭
    // 3. 沒寫的就會用預設值
    orderTea({ 
      teaName: "四季春", 
      ice: "微冰", 
      sugar: "無糖" 
    });

    這在現代 Web 開發中極為常見,當你看到 function Component({ title, color }) 這樣的寫法時,請記得,它其實就是把傳進來的那個大物件,當場拆解成 title 和 color 兩個變數給函式內部使用。

    第六章:那些讓你看起來很厲害的酷招式

    最後,介紹兩個大學生在寫作業或專題時,可以用來耍帥(同時也很實用)的小技巧。

    1. 變數交換 (Swapping Variables)

    在學習程式基礎(如 C 語言或 Java)時,如果要交換兩個變數的值,通常需要一個「暫存變數(temp)」,例如要交換 A 和 B 的飲料:

    1. 先把 A 倒進空杯 C。
    2. 把 B 倒進 A。
    3. 把 C 倒進 B。

    但在 JavaScript 裡,有了解構,你可以像變魔術一樣:

    JavaScript
    
    let a = "可樂";
    let b = "雪碧";
    
    // 左邊是解構,右邊是創造陣列
    // 瞬間交換!
    [a, b] = [b, a];
    
    console.log(a); // 雪碧
    console.log(b); // 可樂

    這就像是雙手交叉瞬間交換手上的東西,非常帥氣且節省程式碼。

    2. 其餘運算符 (Rest Operator)

    有時候你只想拿走便當裡的雞腿,剩下的菜你想全部打包給室友吃,這時候可以用 …(三個點,稱為 Rest Operator)。

    JavaScript
    
    const team = ["隊長", "副隊長", "隊員A", "隊員B", "隊員C"];
    const [captain, ...others] = team;
    console.log(captain); // 隊長
    console.log(others);  // ["副隊長", "隊員A", "隊員B", "隊員C"]

    這裡的 …others 意思就是:「剩下的所有東西,幫我打包成一個陣列,放進 others 變數裡」,這在處理不確定數量的資料時非常有用。

    結語:從「整理」開始的程式美學

    恭喜你!你已經學會了現代 JavaScript 中最強大的語法之一:解構賦值

    回顧一下重點:

    1. 物件解構 {}:像是在工具箱找標籤,不看順序,只看名字。
    2. 陣列解構 []:像是在自助餐排隊,只看順序,變數名字隨你取。
    3. 預設值 =:防止資料缺漏的備案。
    4. 函式參數解構:讓你的函式介面更乾淨、更好用。

    解構賦值不僅僅是為了讓程式碼變短,更重要的是讓程式碼的「意圖」變清晰。當你閱讀 const { name } = user 時,你不用看上下文就能知道:「哦,這段程式碼只關心使用者的名字。」在未來的 Web 開發學習路上,不管是 React、Vue 還是 Node.js,你將會每天、每小時都看到解構賦值的身影。它就像是程式設計師的瑞士刀,一旦用習慣了,你就再也回不去那個徒手拆包裹的舊時代了。現在,打開你的瀏覽器開發者工具(按 F12),試著解構一下你身邊的資料吧!

  • Claude 模型總覽

    Claude 模型總覽

    內容重點

    這篇文章將介紹 Claude 的三種模型家族,幫助你在開發 AI Agent 時,了解各模型適用的情境。以下是各模型家族的特色與選擇建議:

    OpusSonnetHaiku
    說明最聰明的模型在回應品質、速度和成本三者間取得最佳平衡提供低成本與快速回應的輕量模型
    成本
    (相對的)反應速度普通快速非常快速
    具備「reasoning」能力
    適用情境1. 進階軟體開發
    2. 長時間運行任務
    3. 需要多步驟策略的複雜問題
    1. 一般軟體開發任務
    2. 文書處理
    3. 內容行銷
    4. 資料分析與視覺化
    5. 影像分析
    6. 流程自動化
    1. 內容過濾
    2. 資料分類
    3. 語言翻譯
    4. 知識庫問答

    你該如何挑選模型

    前面的表格清楚呈現 Claude 各模型的分類與特色,接下來我想和你聊聊:為什麼需要認真思考模型的選擇?

    在我培訓企業員工運用 ChatGPT(或其他生成式 AI 工具)提升工作效率的課程中,「如何挑選模型」是學員最常提出的問題之一。

    chatgpt-models-picker
    chatgpt-models-picker

    上圖擷取自 ChatGPT 的使用者介面。只要是付費用戶,就可以透過選單自行選擇模型;下圖則是 Claude 的模型選擇介面。

    claude-models-picker
    claude-models-picker

    根據我的使用經驗,大多數情況下我會保留系統預設的模型(例如:Claude 預設為 Sonnet 4.5;ChatGPT 預設為 GPT-5)。但當我需要處理複雜且多步驟的任務,特別是包含大量邏輯判斷或深度推理的流程時,我會選擇推理能力較強的模型(例如:Claude 的 Opus 模型;ChatGPT 的 o1 或 o3 模型)。

    至於日常生活或一般工作任務中,我幾乎不會主動選擇成本低、速度快的輕量模型(例如:Claude 的 Haiku 模型;ChatGPT 的 GPT-5-mini 模型)除非在特定的開發場景中。

    程式開發者該如何挑選模型

    AI Agent 開發者更需要重視模型選擇策略,根據每個專案的條件與需求,規劃最適當的模型配置。這裡指的是透過官方 API 大量整合 Claude 功能到應用程式的情境。

    舉例來說:假設你要為公司內部入口網增加 AI 聊天功能,讓員工可以透過對話查詢特休天數、申請請假或處理其他日常事務。

    情境一:高頻次、簡單互動

    公司內部入口網是每位員工的日常起點,使用頻率極高。員工通常帶著明確目的使用入口網:查看最新公告、查詢系統登入方式、報修電腦設備、查詢或申請休假等。

    由於每次使用目的不同,且公司員工人數眾多,這種情境就很適合選擇成本低、反應快的模型。如果你了解 API 的計費方式,就會知道這個入口網每月消耗的 Token 數量相當可觀。公司很難要求員工「節制」或「有效率」地使用,因此 Haiku 模型的快速回應與低成本特性,就非常適合這類高頻次的簡單互動。

    情境二:多步驟、需判斷邏輯的流程

    然而,當員工要「申請休假」時,流程就變得複雜了。系統需要:

    • 查詢剩餘休假天數
    • 判斷可使用的休假類別
    • 送出休假申請
    • 啟動審核流程

    經過合理拆解後,完整的請假流程約需 15~30 個步驟,其中包含多個需要審查、判斷、條件控制的環節。這時候就很適合使用 Sonnet 這種標準模型,而不適合繼續沿用 Haiku 模型。

    結論

    因此,一款應用程式可以針對不同情境,靈活選用不同的 LLM 模型,目的是在控制成本與提升服務品質之間取得平衡,同時優化用戶體驗。如果你想學習 AI Agent 應用程式開發,就必須仔細思考模型選用的策略!

    誠摯邀請你的分享:

    若有任何疑問或建議,也歡迎來信至 contact@mdas.com.tw,我們很樂意與你交流。

    如果你是經驗豐富的 AI Agent 開發者、或已熟悉 Claude API 的使用,歡迎在文章下方留言,與我們分享你的實戰經驗!