生成式人工智慧與機器學習導論(1) - 其實都是文字接龍

生成式人工智慧與機器學習導論

前言

這幾年來 AI 技術發展非常快速,已經到達了連普通人都可以指揮 AI 幫忙做事的地步,尤其是大家所熟悉的 Vibe Coding 就是一個很好的例子,剛好台大的李宏毅老師在 2025 年開辦了一堂生成式 AI 與機器學習課程,就來寫一下這堂課的記錄跟心得吧~

什麼是生成式人工智慧?

首先我們所熟悉的 ChatGPT、Google Gemini、Claude 等,這些都是生成式人工智慧(Generative AI)實作的例子,這些 AI 會依照你輸入的內容產出相對應的內容

ChatGPT

那麼這些生成式 AI 到底是怎麼做到這些事情呢?這邊就要講到它的核心關鍵技術

「大規模語言模型(Large Language Model,簡稱 LLM)」

講 LLM 或者大規模語言模型,應該是滿難懂的,其實它的原理很簡單,就是 「文字接龍」

什麼是文字接龍?

舉例來講,如果我今天想要查詢「台灣的首都是哪裡?」,那麼我就會輸入「台灣的首都是」,接著 AI 就會根據它所學到的知識,幫我接下一個字「」…「」…「」,最後組成完整的句子「台灣的首都是台北市」。

但,這整個過程我們只給了 AI 一個開頭的提示詞「台灣的首都是」,而 AI 在進行回應時,其實是這樣:

1
2
3
4
5
6
7
8
9
10
11
# 接收到的提示詞
[台][灣][的][首][都][是]

# AI 預測下一個字
[台][灣][的][首][都][是][台]

# 接著 AI 把「台灣的首都是台」這個句子當作新的提示詞,繼續預測下一個字
[台][灣][的][首][都][是][台][北]

# 重複這個過程,直到結尾出現結束符號,也就是 [END]
[台][灣][的][首][都][是][台][北][市][END]

但這邊使用者並不會看到這些中間過程,也不會看到 [END] 這個結束符號,使用者只會看到最終的結果「台灣的首都是台北市」。

ㄟ?這不就跟我們小時候玩的文字接龍一樣嗎?沒錯,LLM 就是透過大量的文字資料,學習如何接龍,然後根據我們輸入的內容,幫我們接出合理的下一個字,最後組成完整的句子。

就像當我講「忍」字的時候,你會想到「」、「」、「」等等,這些都是根據你過去所學到的知識,來幫你接出下一個字。

但對於 AI 來講,他是透過你前後的文字,來預測下一個字是什麼,這樣就能夠產生出合理的句子。

而預測的這個字會消耗一個叫做 「Token(代幣)」 的單位,這個 Token 可以是一個字、一個詞,甚至是一個標點符號,具體的定義會根據不同的模型而有所不同,前面的範例為了能夠清楚說明,所以我將每個字都補上 [] 來表示一個 Token。

Note
請注意,輸入跟輸出都會消耗 Token,舉例來講,如果我們輸入「台灣的首都是」這 6 個字,這就會消耗 6 個 Token,而 AI 回應的「台北市」這 3 個字,則會消耗 3 個 Token,所以整個過程總共消耗了 9 個 Token,但不同的模型對於 Token 的定義會有所不同,有些模型會將「台北市」視為 1 個 Token,有些則會視為 3 個 Token,這取決於模型的設計。

而前面我們這些輸入的內容或者是未完成的句子,則稱為 「Prompt(提示詞)」 ,AI 會根據這些提示詞來預測下一個字。

那這時候可能就會好奇了,AI 是怎麼知道要接什麼字呢?這就要來聊聊它的背後運作原理。

語言模型背後的運作原理

那有趣的事情來了,語言模型到底是如何辨別一段句子後面要加上什麼字呢?

舉例來講,底下我們給了語言模型一個 Prompt:

1
[我][愛][吃][蘋]

我們人腦很直覺的接「」,但 AI 怎麼知道要接「」呢?

其實會有一張很大的表格,裡面記錄了「在過去的資料中,有多少次在看到『我愛吃蘋』這個字串後面接著『果』這個字」,以及「有多少次在看到『我愛吃蘋』這個字串後面接著其他字」的次數以及機率。

舉例來講,這張表可能長這樣:

前綴字串 接續字 出現次數 機率(Score)
我愛吃蘋 5000 0.8
我愛吃蘋 1000 0.16
我愛吃蘋 500 0.04
我愛吃蘋 0.00…

所以語言模型真正在做的事情就是將所有的可能接續字的給予一個機率(Score),然後根據這些機率來決定你下一個可能會接什麼字。

那麼有了這個機率分佈之後,為什麼還是會有問 N 次卻有不同的結果呢?因為語言模型會接著拿這個機率分佈去做 「Sampling(抽樣)」 ,也就是說它會根據這些機率,隨機選擇一個字來接續,更通俗一點說法就是擲骰子,機率越高的字就越有可能被選中。

常見抽樣控制還包括: temperature(溫度)、top-k、top-p(nucleus),用來在『創造力 ↔ 穩定性』間調參。

那麼這張表其實是有一個專有名詞的,就叫做 「Vocabulary(詞彙表)」 ,這張表裡面記錄了所有語言模型所學到的字詞,還有它們在不同前綴字串下的接續機率。

語言模型的詞彙表(vocabulary)通常是幾萬到幾十萬個 Token 等級,透過 BPE/SentencePiece 等切分覆蓋多語言與符號。真正動輒上百億的是參數量(parameters),那才是我們稱其為「大型」語言模型的主因。

這時候可能出現一個疑問,如果語言模型真的是擲骰子的話,那會不會出現莫名其妙的答案?以前面範例來講,如果我們輸入「我愛吃蘋」,結果 AI 回應「我愛吃蘋菜」這種答案,這不就很奇怪嗎?

其實正常來講這個機率是非常低的,因為「我愛吃蘋果」這個字串在過去的資料中出現的次數遠高於「我愛吃蘋菜」,所以 AI 回應「我愛吃蘋果」的機率會非常高。

所以語言模型本質就是一個「文字接龍」的系統,透過大量的文字資料來學習如何接龍,然後根據我們輸入的提示詞,幫我們接出合理的下一個字,最後組成完整的句子。

所以這代表語言模型很笨嗎?不,正好相反,它必須對於人類的語言知識有一定的了解,例如…什麼是名詞、什麼是動詞、什麼是形容詞,還有語法規則、句子結構等等,這樣才能夠接出合理的句子。

有了語言知識,其實還不夠,還需要 世界/常識知識 ,否則就會發生它的名詞、動詞、形容詞都很正確,但內容卻是錯誤的情況,像是水的沸點明明 100 度,結果 AI 卻回答 90 度,這就是缺乏世界/常識知識的例子。

兩種知識其實語言知識是相對容易學習與掌握的,畢竟 Google 搜尋引擎、文法檢查工具等都可以幫助我們學習語言知識,但世界/常識知識就比較困難,這根本接近無窮無盡等級的知識。

以課程舉例來講,水的沸點是 100 度,但如果換成了「在哪一個壓力下水的沸點是 90 度?」這就需要更多的物理知識來回答了。

那麼也可以把語言模型看成一個函式(Function),它會傳入一些參數(Parameters),然後根據這些參數來產生出對應的結果(Output)。

$f(x)=ax+b$

未完成的句子,也就是 Token 在這邊代表的是 x,而通過語言模型輸出後的機率分佈就是 f(x),而這個函式裡面的參數 ab 就是語言模型所學到的知識,這些參數並不是由人工去設定,而是透過大量的資料所訓練自動「學習」而來,所以一個大型語言模型動輒都是百億甚至千億等級的參數。

都講到學習了,那語言模型主要學習途徑有哪些呢?最主要有三個學習來源:

  1. 網路資料:Google、維基百科、電子書等等。
  2. 標注資料:專家標註的資料集。
  3. 使用者回饋:透過使用者的互動來改進模型,也就是 ChatGPT 的按讚、按倒讚功能。

透過這三個學習來源,語言模型能夠不斷地提升自己的能力,變得越來越聰明,能夠更準確地預測下一個字,產生出更合理的句子。

為什麼語言模型會回答問題?

這邊課程也提出一個很有趣的疑問點,也就是「為什麼語言模型會回答問題,而不是繼續反向提問呢?」

例如:

1
2
使用者:台灣的首都是哪裡?
AI:台灣的首都是台北市。

而不是反向提問:

1
2
使用者:台灣的首都是哪裡?
AI:你可以跟我說嗎?

你可能會認為你輸入的是 台灣的首都是哪裡?,但在 AI 眼裡實際看到的則是這樣:

1
2
使用者問:台灣的首都是哪裡?
AI 回答:回答...

所以其實平台會針對使用者的輸入,幫你加上「使用者問:」這個前綴詞,然後在回應的時候也會幫你加上「AI 回答:」這個前綴詞,這個就是所謂的 Chat Template(對話範本),這個範本會告訴語言模型它應該要回答問題,而不是反向提問,真正丟給模型的是:<system>...</system><user>...</user><assistant>...</assistant> 這種格式的內容。

實際使用各種 ChatGPT 平台都是已經被偷偷加料過的,這樣才能夠讓 AI 知道它應該要回答問題,而不是反向提問。

與語言模型如何做到多輪對話?

我們在使用 ChatGPT 的時候,會發現它能夠記住我們之前的對話內容,這是怎麼做到的呢?

多輪對話

這其實是透過 「Context(上下文)」 來實現的,當我們進行多輪對話時,系統會將之前的對話內容一併作為提示詞(Prompt)的一部分,這樣 AI 就能夠根據整個對話歷史來預測下一個字。

這邊也要注意一件事情,每一個聊天視窗(Chat window)是無法跨視窗記憶的,這是因為每一個視窗都有自己的上下文(Context),所以如果你開了兩個視窗,AI 是無法記住你在另一個視窗的對話內容的。

Note
但 ChatGPT 有一個功能叫做「記憶(Memory)」,這個功能可以讓 AI 記住你在不同視窗的對話內容,這個我們先不提。

所以以前面的範例來講,AI 實際接收到的資訊是長這樣:

1
2
使用者問:台灣的首都是哪裡?
AI 回答:台灣的首都是台北市。

接著第二輪詢問時,AI 實際接收到的資訊是長這樣:

1
2
3
4
使用者問:台灣的首都是哪裡?
AI 回答:台灣的首都是台北市。
使用者問:那台灣的第二大城市是哪裡?
AI 回答:回答...

這樣 AI 就能夠根據整個對話歷史來預測下一個字,這就是多輪對話的原理。

透過上述說明,我們可以知道語言模型真正在做的事情,就是根據我們輸入的提示詞,幫我們接出合理的下一個字,最後組成完整的句子,而這個過程其實就是一個「文字接龍」的過程,這也是為什麼語言模型這麼容易「畫唬爛(亂講話)」的原因,因為它只是根據過去的資料來接龍,並不是真的理解我們的問題。

而這個亂講話而產生的東西,我們就稱之為 「AI 幻覺(AI Hallucination)」 ,與背後的資料庫並沒有關聯,因為語言模型本身就沒有所謂的 「資料庫」 ,它只是根據過去的訓練資料來接龍而已。

Note
當然可以透過 RAG(Retrieval-Augmented Generation) 等技術,讓語言模型能夠參考外部資料庫來回答問題,但這是另外一個話題了,這邊就不多做說明。通常 ChatGPT 這類的生成式 AI 預設都會幫你接上 RAG 功能,這樣才能夠減少 AI 幻覺的發生率。

這邊最經典的 AI 幻覺就是 「今天是幾月幾號?」這個經典問題,由於語言模型本身類似把自己關在一個小房間內,它並不知道外面的世界發生了什麼事情,所以當你問它今天是幾月幾號的時候,它只能隨機接出一個日期給你,盡可能給你一個合理的答案,但這個答案並不一定是正確的,因此讓語言模型正確就是我們人類的責任了。

那麼該如何解決這個經典問題呢?其實很簡單,就是在系統提示詞(System Prompt)中加入「今天是 2025 年 11 月 2 日」這樣的資訊,這樣語言模型就能夠根據這個資訊來回答你的問題了。把輸入給 AI 的資訊給完整,那這個就稱之為 「Context Engineering(上下文工程)」。

模型怎麼生成聲音與圖像?

其實概念與生成文字非常類似,你給了一段 Prompt:

1
一隻可愛的貓咪

接下來 AI 會使用像素(Pixel)或者是聲音波形(Waveform)來進行接龍,最後產生出一張圖片或者是一段聲音,而影片就是多張圖片組合而成的。

AI 生成歌曲或發出聲音其實過程非常有趣,使用的是所謂的「取樣點(Sample Points)」,這些取樣點代表了聲音波形在不同時間點的振幅值,AI 會根據這些取樣點來預測下一個取樣點的值,然後組成完整的聲音波形。

但生成圖像跟聲音是非常的耗費 Token(資源耗費),以 1024x1024 的圖片來講,大約至少要一百萬次的接龍才能夠生成一張圖片,這一百萬次的接龍概念是什麼呢?大約是一本紅樓夢的量。

那 AI 一開始會將圖片做 Encoder,像是將圖片切割成 16x16 的小方塊,然後將這些小方塊轉換成 Token,例如…這個 16x16 被標記為「草地」、這個 16x16 被標記為「天空」,接著當你下了一個 Prompt:「一隻可愛的貓咪在草地上玩耍」,AI 就會根據這個 Prompt 來預測下一個 Token 是什麼,因此剛剛的 「草地」這個 Token 就會被選中,接著 AI 繼續預測下一個 Token 是什麼,直到組成完整的圖片。

反之亦然,生成與辨識圖片都是一樣的行為都會經過一系列的 Encoder 與 Decoder 過程,只不過中間會接著使用語言模型來進行接龍而已,所以流程大致上是這樣:

1
Prompt -> Encoder -> Token -> LLM -> Token -> Decoder -> Image/Sound

因此由此可知,我們萬物皆可以是 Token,無論是文字、圖片、聲音,甚至是影片,都可以被轉換成 Token,然後透過語言模型來進行接龍,最後產生出我們想要的內容。

而以上其實就一直圍繞著一件事情——「文字接龍」,語言模型本身就是一個強大的文字接龍系統,透過大量的資料來學習如何接龍,然後根據我們輸入的提示詞,幫我們接出合理的下一個字,最後組成完整的句子。

參考資料