---
# System prepended metadata

title: '[GenAI] [AI] [Youtube] [Hung-yi Lee]【生成式人工智慧與機器學習導論2025】 - 一堂課搞懂生成式人工智慧的原理'
tags: [Hung-yi Lee, GenAI, Youtube, AI]

---

# 課程目標與架構

* 目標：建立對生成式人工智慧（ChatGPT、Gemini、Claude）運作原理的基本認識
* 架構：上半部講原理，下半部做實作與跑開源模型驗證
* 範圍：先聚焦「文字輸入→文字輸出」，之後再談語音與影像

# 語言模型是什麼
![image](https://hackmd.io/_uploads/HJ2WwiEyWg.png)

* 本質：語言模型（LLM）做「文字接龍」
* 工作：給一段未完成的句子（Prompt），預測下一個符號（Token）
* 產出：不斷接龍直到輸出結束符號，形成最終回覆

# Prompt 與 Token
![image](https://hackmd.io/_uploads/HJC4DoV1bl.png)

* Prompt：提供模型的未完成句子／輸入
* Token：模型每一步可輸出的單位（字、詞、符號等）
* 回答流程：把剛產生的 Token 接回 Prompt，再預測下一個 Token，直到結束

# Vocabulary（詞彙表）
![image](https://hackmd.io/_uploads/S1VFPoN1bl.png)

* 定義：模型可用來接龍的所有 Token 集合
* 規模：常見為數十萬級，涵蓋多語言字符與常用符號（如 email 的 @）
* 範例：開源模型（如 Llama）有對應的詞彙表設計

# 機率分佈與取樣
![image](https://hackmd.io/_uploads/SJv9DoN1-e.png)

* 輸出型態：模型對每個 Token 給出「接在 Prompt 後面」的機率
* 取樣方式：依機率分佈擲骰取樣，因此同一 Prompt 可能生成不同答案
* 可靠性：不合理 Token 的機率極低，實務上較少出現荒謬接續

# 回答示例（台灣最高的山）
![image](https://hackmd.io/_uploads/ByKhDiVyWl.png)

* 問題視為 Prompt：「台灣最高的山是哪座？」
* 模型步驟：先產生機率分佈→取樣出「玉」→再取樣出「山」→可能接結束符號
* 多樣化：也可能先取樣「是」→「玉山」等語句再結束

# 為何「文字接龍」不簡單
![image](https://hackmd.io/_uploads/rJ2Juo41bl.png)

* 需要語言知識：文法、詞性搭配、語序等（如「黃色的」後面多接名詞）
* 需要世界知識：事實與常識支撐合理接續（如「水的沸點是攝氏100度」）
* 語言知識較易學：大量文本可讓模型少犯文法錯
* 世界知識難學：範圍無窮，需理解前提變化

# 條件前提對世界知識的影響

* 例子：「在 0.5 大氣壓下水的沸點是多少？」不應再是 100℃
* 重點：相同片語出現於不同前提下，機率最高的答案會改變
* 能力要求：模型需理解條件對事實的影響，調整機率分佈

# 多模態（簡述）

* 輸入輸出可延伸至語音與影像
* 本堂課先聚焦文字，後續再談多模態處理方式

# 模型作為函式的觀點
![image](https://hackmd.io/_uploads/SkfG_iNkZx.png)

* 抽象：f(X)=輸出機率分佈，X 為 Prompt
* 參數：以巨量參數（常見十億到百億）決定輸入與輸出關係
* 規模：「大型」指參數量龐大；十億參數已不算大

# 參數如何獲得

* 方式：非人工設定，透過資料與學習自動獲得
* 細節：機器學習訓練流程與內部運作將在後續課程說明

---

# 語言模型如何學會接龍（概要）
![image](https://hackmd.io/_uploads/B1iQujVk-g.png)

* 三大來源：網路大量文本、自有人類標註、使用者回饋（讚/倒讚）
* 網路文本：每句話提供「前後接續」樣本，用於學習下一個 Token 的機率
* 人類標註：給定問句→標準答案，強化關鍵情境下的正確接續
* 使用者回饋：好答案機率上升、壞答案機率下降，調整取樣分佈

# 為何「只會接龍」卻能回答問題
![image](https://hackmd.io/_uploads/ryBudjEy-l.png)

* 平台加料：實際輸入並非原始問題，而是加上「使用者問：…／AI回答：」等模板
* Chat template：引導模型在「AI回答：」後續必須接出答案而非延續提問
* 不同模型有不同 template；實務上 template 是關鍵工程手段

# 多輪對話的運作
![image](https://hackmd.io/_uploads/S1ynujV1Zx.png)

* 之後訊息的 Prompt 會附帶整段對話歷史（含使用者問／AI答）
* 模型在「長串上下文」上接龍，因此能理解「第二高的呢」指向「第二高的山」
* 對話記憶通常限於同一會話；新對話不保留先前歷史（跨對話記憶另議）

# 幻覺（Hallucination）與其成因
![image](https://hackmd.io/_uploads/rJg-FoEkbg.png)

* 本質：模型以機率接龍生成，每字皆由分佈取樣，可能虛構網址、事實
* 不是「查資料庫」錯誤，而是生成式機制的自然結果
* 問題情境：要求具體事實時更易暴露幻覺

# 降低幻覺：RAG（檢索增強生成）

* 作法：在生成前檢索外部資料並把結果放進 Prompt
* 多數平台預設啟用類似機制；純生成更易出錯
* 有檢索不等於必然正確，但可顯著降低離譜輸出

# 模型的侷限與 Context Engineering
![messageImage_1762076973624](https://hackmd.io/_uploads/BJJrYsVyWg.jpg)


* 模型如「關在黑屋子」只會接龍，無法主動感知現實
* 對「今天日期」等即時資訊，若無外部餵入，只能猜測
* Context Engineering：確保 Prompt 含足夠、正確的上下文，讓模型有機會接出對的答案

# 為何能正確回答「今天幾月幾號」
![image](https://hackmd.io/_uploads/rJVOKoNy-g.png)

* 系統在每次對話最前面植入通用資訊（如當日日期、模型名稱）
* 實際 Prompt＝系統資訊＋Chat template＋使用者問題
* 開發者預先撰寫的內容稱為 System Prompt；使用者輸入為 User Prompt

# 從文字到多模態的共通觀念
![image](https://hackmd.io/_uploads/HkdAYiNy-x.png)

* 核心仍是「Token 接龍」：把影像、聲音也離散化為 Token 後進行接龍
* 影像：像素接龍理論可行；影片＝多張影像序列
* 聲音：取樣點接龍可合成語音／歌聲（如 WaveNet）

# 直接像素／取樣點接龍的成本問題

* 圖片：1024×1024 需約百萬步接龍，計算量極大
* 聲音：22kHz 每秒 22,000 取樣點；1 分鐘需約 132 萬步
* 結論：逐像素／逐取樣點生成過於昂貴

# 壓縮表示與 Token 化
![image](https://hackmd.io/_uploads/r1tD5i4yZl.png)

* 以編碼器（encoder）把影像區塊或聲音片段壓成離散 Token（如每 16×16 區塊一個符號、每 0.02 秒一個符號）
* Token 代表模式（草地、眼睛、毛絨感…）或聲音單元（爆破音、笑聲、狗叫…）
* 解碼器（decoder）將 Token 還原為圖片或聲音

# 影像／聲音生成流程（可能路徑）
![image](https://hackmd.io/_uploads/r1O55oVy-g.png)
![image](https://hackmd.io/_uploads/HJ9jcsNkbl.png)

* 影像到影像：輸入圖→影像 encoder→影像 Token；與文字 Token 合併→語言模型接龍→新影像 Token→影像 decoder→輸出圖
* 聲音到聲音：輸入聲音→聲音 encoder→聲音 Token→語言模型接龍→新聲音 Token→聲音 decoder→輸出聲音

---
# 「萬物皆可成為 Token」的含義

* Token 不僅是文字，也可以是影像、圖表、歌曲、語音、影片等
* 核心觀念：把各種資料型態表示成 Token，透過 Token 接龍即可生成對應內容
* 誤解澄清：此處的 Token 非「代幣」，而是可被模型選擇並組合的基本單位

# 生成式人工智慧的定義
![image](https://hackmd.io/_uploads/SkxljjNyZx.png)

* 目標：讓機器產生「複雜且有結構」的物件
* 有結構：由有限種類的基本單位（Token）組成，組合後有無窮可能
* 關鍵：不只是生成，而是「根據輸入進行生成」

# 有結構物件與 Token 範例

* 文字：字或詞作為 Token，有限集合可組出無窮文章
* 圖片：像素理論可行但成本高，改以壓縮後的影像 Token 表示
* 聲音：取樣點理論可行但成本高，改以壓縮後的聲音 Token 表示
* 蛋白質：胺基酸種類有限，序列可組成多樣蛋白質

# 生成式 AI 的互動模式
![image](https://hackmd.io/_uploads/rk3Zis41bg.png)

* 本質：輸入 X，輸出 Y（Y 為複雜且有邏輯結構的物件）
* 型態：文字→文字、文字→影像、文字→聲音、影像→影像風格轉換、影像→文字等
* 實用性：能根據輸入條件定向生成，才能落地成應用

# 將生成問題化約為「一次選一個 Token」

* 每個 Token 的候選集合有限
* 重點在於制定生成策略與選取順序（Y 的第 i 個 Token，記為 Yi）

# 自回歸生成（Auto-Regressive Generation）
![image](https://hackmd.io/_uploads/Bk64ij4kZg.png)

* 流程：輸入 X → 產生 Y1 → 將 Y1 接回輸入 → 產生 Y2 → 重複至結束符號
* 一般化：以 Z1…Zt-1 作為條件，預測下一個 Token Zt
* 適用：文字 Token、影像 Token、聲音 Token 皆可套用

# 生成即「一連串分類題」

* 給定目前序列，從有限候選 Token 中選一個
* 訓練目標：讓模型學會在每一步選出最合適的 Token
* 策略與訓練：可視為多步、條件式的分類決策過程

# 其他生成策略：Diffusion Model

* 影像生成常見策略之一
* 與自回歸不同的生成路徑，屬於另一種生成流程
* 細節留待影像主題時再剖析

# 開源與非開源模型
![image](https://hackmd.io/_uploads/rJi_jiEyZg.png)
![image](https://hackmd.io/_uploads/SJtcoiE1Wx.png)

* 非開源：可透過網頁或 API 使用，但內部函數 F 與參數不可見（如 Gemini、ChatGPT、Claude）
* 開源（此處定義）：模型參數可取得，函數 F 與參數量公開（如 LLaMA、Mistral、Gemini 於此定義下被視作開源）
* 註記：開源程度有差異，有些未公開訓練細節，是否算「完全開源」見仁見智

# 取得與使用開源模型

* 平台：Hugging Face 聚合各式模型與資料集，可查看說明、下載數與按讚數
* 操作：從 Hugging Face 下載模型，在 Colab 執行範例程式碼進行實作
* 目標：示範如何載入、推論與應用開源語言模型

---
# 實作講解順序與解釋
1. 準備環境 
   * GPU：用於加速模型運算的硬體，Colab 提供 T4（免費）或 A100（付費）。
   * Colab：Google 的雲端 Python 平台，可免費執行深度學習模型。
   * 在 Colab 點「檔案 → 在雲端硬碟中儲存副本」，在自己的副本上操作。
   * 進入「執行階段 → 變更執行階段類型 → GPU」啟用加速器。
2. 安裝與登入 Hugging Face
   * Hugging Face：開源模型平台，提供多種 AI 模型下載與使用。
   * Access Token：登入憑證，用來授權 Hugging Face 帳號的模型存取權。
   * 安裝 `transformers` 套件，並登入 Hugging Face 帳號輸入 Access Token。
   * 若模型需授權，先在模型頁面申請存取權限。
3. 選擇並載入模型
   * 模型（Model）：AI 網路，用於理解與生成文字。
   * 參數量（Parameters）：模型的權重數量，越多代表越大、效能越好但需更多記憶體。
   * 指定模型 ID（如 `meta-llama/Llama-3.2-3B-Instruct` 或 `google/gemma-3-4b-it`）。
   * 載入模型與 Tokenizer 以準備進行推論。
4. 理解 Tokenizer 與 Model
   * Tokenizer：將文字轉成 Token（數字代碼），是模型理解語言的橋樑。
   * Token：模型運算的最小單位，可能是字、符號或詞片段。
   * Tokenizer 將文字轉為 Token ID，Model 根據序列預測下一個 Token。
   * 可測試 `encode` / `decode` 來觀察文字轉換效果。
5. 觀察 Vocabulary（詞彙表）
   * Vocabulary：模型能識別的所有 Token 清單。
   * Subword（子詞）：英文詞可被拆成更小片段以提升靈活度（如 “tion”、“ing”）。
   * 查看詞彙表內容，了解模型可處理的語言與符號組合。
   * 注意其中包含英文、中文、符號、表情等多樣元素。
6. 文字編碼與解碼流程
   * Encode / Decode：文字與 Token ID 的互相轉換過程。
   * BOS（Begin of Sentence）：句首標記，模型預設自動加入。
   * 使用 `encode()` 將文字轉為 Token，`decode()` 可轉回文字。
   * 若要輸出與原文字一致，可關閉自動加特殊符號。
7. 模型推論與機率分佈
   * Logits：模型對每個 Token 的預測分數。
   * Top-K：取出機率最高的前 K 個候選 Token。
   * 模型輸入句子後，會計算下一個 Token 的機率分佈。
   * 可觀察 Top-K 結果，了解模型的預測傾向。
8. 手動生成（逐步接龍）
   * Sequence（序列）：目前輸入與生成的 Token 清單。
   * 逐步生成（Iterative Generation）：根據前一步結果，重複預測下一 Token。
   * 每次取出最高機率或隨機 Token，接回序列形成長句。
   * 可觀察模型如何一步步生成文字。
9. 抽樣策略
   * Greedy（貪婪）：每步選擇機率最高的 Token，穩定但易重複。
   * Sampling（抽樣）：依機率隨機挑選 Token，結果更自然但不穩定。
   * Top-K Sampling：只在前 K 名中抽樣，兼顧合理性與多樣性。
   * 調整 K 值可平衡生成內容的多樣度與一致性。
10. 使用 `generate()` 自動生成
    * 自動生成（Auto Generation）：模型自動完成多步推論與停止條件。
    * max_new_tokens：控制生成文字的最大長度。
    * `model.generate()` 會自動完成整段生成。
    * 可設定抽樣模式、Top-K 值與長度上限。
11. Chat Template（對話樣板）
    * Chat Template：定義對話角色的格式（system、user、assistant）。
    * Prompt：使用者輸入給模型的文字。
    * 使用樣板可讓模型理解「現在是要回答問題」。
    * 沒有樣板時，模型常會「續寫問題」而非回答。
12. System Prompt
    * System Prompt：控制模型角色、語氣與知識範圍的開場設定。
    * Knowledge Cutoff：模型知識訓練資料的最後日期。
    * 可指定角色（如「你是 LLaMA，一個助理」）來穩定模型行為。
    * 若模型自稱錯誤，可在此明確規定身分。
13. 多輪對話
    * Context（上下文）：模型記住的先前對話內容。
    * Messages：包含 system、user、assistant 的對話紀錄清單。
    * 每輪輸入都要附上完整歷史，模型才知道「剛剛說過什麼」。
    * 讓生成結果自然連貫、符合前文脈絡。
14. Pipeline 快速互動
    * Pipeline：Transformers 提供的簡化介面。
    * Text-generation / Chat pipeline：可直接輸入文字或訊息產生回覆。
    * 使用 pipeline 可省略手動轉換步驟。
    * 適合快速測試模型或製作簡易聊天機器人。
15. 模型切換
    * Model ID：模型在 Hugging Face 上的唯一名稱（例如 LLaMA 或 Gemma）。
    * 相容性：不同模型可能需不同 Tokenizer。
    * 修改 MODEL_ID 即可更換模型。
    * 若 system prompt 未改，模型仍會依舊設定自稱。

---

✅ 整體順序概覽：
環境 → 登入 → 模型 → Tokenizer → Vocabulary → 編碼 → 機率 → 接龍 → 抽樣 → generate → Chat Template → System Prompt → 多輪對話 → Pipeline → 模型切換


---
# Colab 範例操作流程

* 先「檔案 → 在雲端硬碟中儲存副本」，在自己的副本上執行
* 執行階段 → 變更執行階段類型，確認/選擇 GPU
* 依序執行安裝與初始化區塊（例如安裝 Transformers、登入等）

# GPU 選擇與模型大小

* A100 可順利跑 3B 參數模型；免費版多為 T4，3B 可能吃緊
* 不足時改用較小模型（如 1B）以提升成功率與速度
* 3B ≈ 30 億參數屬小模型；7B 在 Colab 尚可，更大可能失敗

# 套件與環境：Hugging Face Transformers

* 使用 Hugging Face 的 Transformers 操作各種模型
* 與底層框架無關（PyTorch/JAX 皆可透過 Transformers 使用）
* 選擇此套件因彈性高、社群廣、模型相容性佳

# 連線 Hugging Face 與憑證 Token

* 需取得 Hugging Face 個人 Access Token（憑證意義，非語言模型的 token）
* 在程式中以 `login` 或設定環境變數方式提供 Token
* 取得方式與細節可參考課程提供的說明影片/文件

# 選擇與下載模型（LLaMA / Gemma）
![image](https://hackmd.io/_uploads/H1U-z3Nkbl.png)

* 範例使用：`meta-llama/Llama-3.2-3B-Instruct`（版本 3.2、Instruct 能力、3B 參數）
* 欲更換大小：將 `3B` 換為 `1B` 等型號
* 亦可改用 Google Gemma：如 `google/gemma-3-4b-it`（較新、效能較佳）
* 下載時間視模型大小而定；完成後即可在本機執行推論

# 模型授權與存取權

* 某些模型需同意條款與申請存取權
* 看到「You have been granted access…」後方可下載
* 審核通知以 Email 寄達，等待時間不定

# Tokenizer 與 Model 兩個構件

* Tokenizer：定義可用 Token 與 Vocabulary（詞彙表）
* Model：神經網路參數（函數 F 的具體權重）
* 下載/載入時需同時取得二者

# Vocabulary 與基本操作
![image](https://hackmd.io/_uploads/HJEEfnNJZx.png)
![image](https://hackmd.io/_uploads/H1RMIhE1-x.png)

* 以 `tokenizer.vocab_size` 取得詞彙表大小（例：LLaMA 類型約 128,000）
* `tokenizer.decode(id)`：由 Token ID 還原文字
* `tokenizer.encode(text)`：由文字轉為 Token ID 序列
* 可觀察單一/多個 ID 的對應字元與片段

# Vocabulary 的內容特性
![image](https://hackmd.io/_uploads/rJYV8hEJZl.png)

* 多語系混合：英/中/其他語言字元與詞片段並存
* 含常見符號、標點、表情、網路常用片段等
* 英文多為子詞（subword）或片段（如 `INDOW`、`.grid`、`Iclient`）

# 最長與最短 Token 的觀察
![image](https://hackmd.io/_uploads/HyVUUnVJZe.png)

* 最長 Token 可能為大量空白或特定符號組合（例：128 個空格、`//||||…`）
* 短 Token 多為基本字元：數字 0–9、英文字母、常見標點
* 詞彙表中亦包含單字、雙字中文片段與多種特殊記號

---
# 編碼與特殊符號（encode / decode）

* `tokenizer.decode(id)`：把 Token ID 轉回文字；`tokenizer.encode(text)`：把文字轉成 Token ID 序列
* 預設 `encode` 會自動加「句首符號（BOS）」，例：輸入 `!` → `[128000, 0]`
* 若不想加入特殊符號：`add_special_tokens=False`，則 `!` 僅對應 `0`

# Token 細節與例子

* 同字不同大小寫為不同 Token，例如：`hi`、`Hi`、`HI` 各對應不同編號
* 空白敏感：`GOOD` 在句首與前有空白時是不同 Token（例：`GOOD MORNING` 的 `GOOD` ≠ `I AM GOOD` 的 `GOOD`）
* 中文可是一字一 Token，也可能是詞片段；詞彙表涵蓋多語言與符號

# 編碼往返一致性

* 流程：文字 → `encode` → ID → `decode` → 文字
* 預設會多出 `begin of text`；設 `add_special_tokens=False` 後，往返結果與原文一致

# 以模型取得下一步機率分佈
![image](https://hackmd.io/_uploads/rk1fPnV1bg.png)
![image](https://hackmd.io/_uploads/H1IVDnEkZl.png)
![image](https://hackmd.io/_uploads/BkNHw3E1-g.png)

* 輸入：把 Prompt `encode` 成 ID 後餵入模型，輸出包含下一 Token 的機率分佈
* 觀察 Top-N：可列出機率最高的若干 Token 與其分數
* 範例：`1+1=` 後接 `2` 機率最高；在「二進位」前提下，`1+1=` 後接 `10` 機率最高

# 逐步接龍（手寫迴圈）
![image](https://hackmd.io/_uploads/S17Lv3V1Zl.png)

* 步驟：取目前序列 → 模型出機率分佈 → 選下一 Token → 把 Token 接回序列 → 重複
* 連續產生固定長度的 Token，即可形成一段輸出

# 抽樣與貪婪（greedy vs sampling）

* 貪婪（Top-1）：每步選機率最高的 Token，穩定但易重複與單調
* 隨機抽樣：依機率擲骰，每次結果不同，但容易抽到低機率怪詞而崩壞

# Top-K 抽樣
![image](https://hackmd.io/_uploads/rkH9w2Ek-l.png)

* 僅允許前 K 高機率的 Token 參與抽樣，降低抽到離譜 Token 的機率
* K 太大接近無門檻，易怪句；K=1 等同貪婪；中等 K（如 3）在多樣性與可讀性間折衷
* 實作流程：取分佈 → 篩前 K → 正規化 → 擲骰選一個 → 接回續產

# `model.generate` 的使用
![image](https://hackmd.io/_uploads/Byr2P2V1Ze.png)

* 流程：`encode(prompt)` → `model.generate(config)` → `decode(output_ids)`
* 生成結果包含原輸入＋新增 Token
* 停止條件：遇到結束 Token 或達最大長度
* 重要參數：`max_new_tokens`、`do_sample`、`top_k`（亦可配合其他策略）

# Chat Template 的必要性
![image](https://hackmd.io/_uploads/HkpTP2Ek-l.png)
![image](https://hackmd.io/_uploads/BkG1OhVkZg.png)


* 僅提供問題時，模型可能「續寫問題」而非「回答」
* 加入對話樣板可引導回覆，如「system/user/assistant」角色與格式
* Llama 提供官方樣板：`tokenizer.apply_chat_template(messages, ...)`，自動套樣板並編碼

# System Prompt 與模型身分校正
![image](https://hackmd.io/_uploads/Syc-d2N1Zl.png)

* 官方樣板常在 `system` 段落置入知識截止日與「今天日期」等資訊
* 若模型誤報身分（如自稱 GPT-3.5），可在 `system` 明確聲明名稱與風格以校正

# 插入既有回覆的影響與風險

* `messages` 可含既有 `assistant` 內容，模型會從該內容續寫
* 不當插入可能迫使模型沿錯誤脈絡續寫，導致偏離或產生不當內容（需審慎使用）


---

# 取樣策略：Top-K

* Top-K 控制每步只在前 K 個高機率 Token 中抽樣
* K=1 等同貪婪解碼，輸出穩定但容易重複與僵化
* K 過大接近「不設限」，多樣但易冒出怪句
* 適中 K（如 3）可提高多樣性，同時降低離譜輸出
* 抽樣具隨機性，同一 Prompt 多次結果可不同

# 直接用 `model.generate` 產生序列

* 流程：`tokenizer.encode(prompt)` → `model.generate(...)` → `tokenizer.decode(...)`
* 生成包含「原始輸入 + 新增 Token」
* 主要參數：最長輸出長度、是否啟用 sampling、Top-K 大小
* 停止條件：遇到結束 Token 或達到長度上限

# 為何沒回到重點：缺少 Chat Template

* 僅輸入「你是誰？」時，模型傾向延續語句而非回答（純接龍）
* 加上對話樣板（如「使用者說：…／AI 回答：」）可引導模型生成答案
* 自行亂寫的樣板容易導致結束符號位置錯誤、續寫角色混亂

# 使用官方 Chat Template（Llama 範例）

* 透過 `tokenizer.apply_chat_template(...)` 自動套用官方樣板並同時編碼
* 輸入需用 messages 格式（含 `role` 與 `content`），常見角色：`system`、`user`、`assistant`
* 套用後模型實際看到的是「系統提示 + 對話歷史 + 等待 assistant 回覆」

# System Prompt 與隱含資訊

* 官方樣板常在 `system` 段落自動放入知識截斷日期與「今天日期」等常用資訊
* 這些前置資訊讓模型能正確回答時間相關問題，並說明知識時效

# 校正模型身分與風格

* 若模型回覆錯誤身分（如誤稱 GPT-3.5），可在 `system` 中明確聲明名稱與定位
* 明確的 `system` 指令能穩定回答口吻、角色與範圍

# 利用 `assistant` 歷史影響續寫

* messages 可包含既有 `assistant` 內容，模型會從該片段續接
* 謹慎使用：不當的 `assistant` 片段會強制模型沿著錯誤脈絡續寫，造成偏離或不實內容

# 常見現象與排查重點

* 回覆沒及時結束：多為樣板或停止條件設定不當
* 中英夾雜或風格不穩：與模型語料、大小與 `system` 設定相關
* 重複與贅詞：Top-K 太小或未開啟抽樣，或長度上限設定不佳

---
 
# 簡易互動介面與處理流程

* 使用者輸入 → 視為 Prompt → 轉為 messages 格式 → `apply_chat_template` 產出 IDs → `model.generate` 生成 → `tokenizer.decode` 還原文字
* 需從解碼結果中擷取「assistant 回覆」片段再顯示（因包含原輸入與樣板內容）

# 單輪到多輪對話

* 多輪關鍵：每輪都把「歷史對話（system/user/assistant）」與本輪輸入一起餵給模型
* 僅給「我剛剛問了什麼？」會失敗；需連同先前的「你是誰／我是 LLaMA」整段上下文一併提供

# Chat Template 與角色

* 自寫樣板易出錯；建議用官方 `apply_chat_template(messages, ...)`
* 角色：`system`（風格/規則/日期等）、`user`（使用者訊息）、`assistant`（模型回覆或強制續寫起點）
* `system` 可放知識截斷日與「今天日期」，並可校正模型身分與語氣

# 生成設定與停止條件

* `model.generate`：控制 `max_new_tokens`、`do_sample`、`top_k` 等
* 停止條件：遇到結束 Token 或達到長度上限
* 生成是「輸入＋新增 Token」的整串序列，顯示前需截出回覆部分

# 行為觀察與校正

* 無樣板時易「續寫問題」而非回答
* `system` 未明確指名時，模型可能自稱錯誤身分；於 `system` 明示名稱可修正
* 在 `messages` 中加入既有 `assistant` 文字會成為續寫起點，應謹慎使用以免誤導

# Pipeline 簡化呼叫
![image](https://hackmd.io/_uploads/ByGNF24kWx.png)

* 使用 `pipeline(model=MODEL_ID, ...)` 可省略手動 encode/decode 與樣板處理，直接輸入 messages 得到文字輸出
* 整體行為與前述流程一致，但介面更精簡，便於快速做出聊天機器人

# 切換模型

* 變更 `MODEL_ID` 即可更換（如由 LLaMA 改成 Gemma-3-4B-it）
* 若 `system` 仍寫「你是 LLaMA」，即使換成 Gemma 也會自稱 LLaMA（以樣板為準）


---
# Terminology
* 語言模型（Language Model, LM）：根據上下文為下一個符號產生機率分佈並據以生成文字的模型。
* 自回歸生成（Autoregressive Generation）：逐步預測並產生下一個token，直到輸出終止的生成方式。
* 標記（Token）：模型處理與輸出的最小單位，可為字、詞、子詞或特殊符號。
* 詞彙表（Vocabulary）：模型可輸入/輸出的全部token集合。
* 概率分佈（Probability Distribution）：對所有候選token給定的機率配置，用以抽樣輸出。
* 邏輯值（Logits）：softmax前對各token的未正規化分數。
* Softmax：將logits轉換為機率分佈的正規化函數。
* 結束符號（End-of-Sequence, EOS）：指示生成完成的特殊token。
* 提示（Prompt）：提供給模型以引導生成的輸入內容。
* 使用者提示（User Prompt）：由使用者直接撰寫、提交給模型的提示。
* 系統提示（System Prompt）：由平台預置、用以規範模型行為與風格的隱含前置提示。
* 對話樣板（Chat Template）：將多輪訊息包裝成統一格式以利模型理解的模板。
* 上下文視窗（Context Window）：模型一次可接收並處理的token長度上限。
* 上下文工程（Context Engineering）：構造足夠且精確的上下文以提高生成正確性的實務。
* 指令微調（Instruction Tuning）：以指令—回覆資料訓練模型，使其遵循自然語言指令。
* 監督式微調（Supervised Fine-Tuning, SFT）：用標註輸入—輸出對進一步訓練預訓練模型。
* 人類回饋強化學習（RLHF）：利用人類偏好回饋訓練策略，調整模型輸出傾向。
* 直接偏好最佳化（Direct Preference Optimization, DPO）：以偏好資料直接最大化偏好目標的對齊方法。
* 幻覺（Hallucination）：模型生成與事實不符或虛構的內容現象。
* 溫度（Temperature）：控制抽樣隨機性的參數，越高輸出越多樣。
* Top-k 抽樣（Top-k Sampling）：僅在機率最高的k個候選中隨機取樣。
* Top-p 抽樣（Nucleus Sampling）：在累積機率達p的動態候選集合中取樣。
* 集束搜尋（Beam Search）：同時保留多條高分生成路徑以尋找較優序列。
* 交叉熵損失（Cross-Entropy Loss）：衡量預測分佈與真實分佈差異的訓練目標。
* 似然最大化（Maximum Likelihood Estimation, MLE）：透過最大化訓練資料機率來學習參數。
* 參數（Parameters）：決定模型輸入—輸出關係的可學習權重。
* 縮放法則（Scaling Laws）：模型表現與資料量、參數量、算力間的經驗關係。
* 變壓器（Transformer）：以自注意力為核心的序列建模架構。
* 自注意力（Self-Attention）：計算序列內任兩位置的相依性以取得全域資訊。
* 位置編碼（Positional Encoding/Rotary Position Embedding, RoPE）：為序列引入位置信息的技巧。
* 鍵值快取（KV Cache）：在解碼時快取注意力鍵/值以加速長序列生成。
* 向量嵌入（Embedding）：將離散符號映射為連續向量以捕捉語意。
* 向量資料庫（Vector Database）：儲存嵌入向量並支援近似最近鄰檢索的系統。
* 近似最近鄰（Approximate Nearest Neighbor, ANN）：在高維空間近似尋找相似向量的演算法。
* 檢索增強生成（Retrieval-Augmented Generation, RAG）：先檢索外部知識再引導模型生成以減少幻覺。
* 工具使用（Tool Use）：模型透過API或函式呼叫存取外部能力以完成任務。
* 函式呼叫（Function Calling）：以結構化輸出觸發外部函式並將結果回饋模型。
* 多模態建模（Multimodal Modeling）：同時處理文字、影像、音訊等多種訊號的能力。
* 編碼器（Encoder）：將原始資料壓縮為潛在表徵或離散token的模組。
* 解碼器（Decoder）：由潛在表徵或離散token重建原資料的模組。
* 離散化向量量化（Vector Quantization, VQ）：將連續表徵映射到有限碼本以生成離散token。
* 擴散模型（Diffusion Model）：透過去噪過程近似資料分佈的生成架構。
* 量化（Quantization）：以較低位元精度（如8-bit/4-bit）儲存與計算以降低資源需求。
* QLoRA：結合4-bit量化與低秩適配以低成本微調大型模型的技術。
* 混合精度訓練（Mixed Precision Training）：使用FP16/BF16縮減記憶體並加速訓練。
* 梯度檢查點（Gradient Checkpointing）：重算部分前向以降低記憶體使用的技巧。
* 批次大小（Batch Size）：每次參數更新處理的樣本數量。
* 令牌速率（Tokens per Second, TPS）：模型生成或處理token的吞吐率指標。
* 延遲（Latency）：從輸入到首個輸出token產生的時間。
* 越獄提示（Jailbreak Prompt）：繞過安全規範誘導模型輸出不當內容的策略。
* 提示注入（Prompt Injection）：在輸入中植入惡意指令以影響模型行為的攻擊手法。
* 萬物皆可成為代碼單元（Everything is a Token）：將不同型態資料統一離散化以便序列生成與操作。
* 離散表示學習（Discrete Representation Learning）：把連續訊號壓縮映射到有限碼本的技術。
* 碼本（Codebook）：量化後可選的離散向量集合，對應「影像/聲音/文字」的token空間。
* 向量量化變分自編碼器（VQ-VAE, Vector-Quantized VAE）：透過碼本量化潛在表示以產生離散token的模型。
* 殘差向量量化（RVQ, Residual Vector Quantization）：以多層連續量化殘差降低重建誤差。
* 編碼器（Encoder）：將原始資料（影像/聲音/文字）轉為潛在離散token的模組。
* 解碼器（Decoder）：把離散token或潛在表示還原成原始資料的模組。
* 多模態Token（Multimodal Tokens）：統一表示文本、影像、音訊、影片等不同模態的離散單位。
* 自回歸生成（Autoregressive Generation）：按序預測下一個token以組裝複雜輸出。
* 條件生成（Conditional Generation）：在輸入X條件下生成目標Y（如文字→圖像）。
* 結構化物件（Structured Objects）：由有限token組裝而成、規則性強的複合輸出（文本、圖片、蛋白質）。
* 取樣策略（Sampling Strategy）：從機率分佈抽樣下一token的方法總稱。
* 分類化約（Reduction to Classification）：把「下一token選擇」化約為多類別分類問題。
* 交叉熵訓練（Cross-Entropy Training）：以交叉熵最小化真實token的負對數似然。
* 教師強制（Teacher Forcing）：訓練時使用真實前綴而非模型生成前綴以穩定學習。
* 暴露偏差（Exposure Bias）：訓練與推論前綴分佈不一致導致的誤差累積問題。
* 上下文視窗（Context Window）：模型一次可見並條件化的token長度上限。
* 對話樣板（Chat Template）：將多輪訊息包裝成「使用者/助理」格式以誘導問答。
* 系統提示（System Prompt）：平台預置的上游指令，用以規範模型行為與身份。
* 使用者提示（User Prompt）：由使用者提供、描述目標或約束的輸入內容。
* 指令跟隨（Instruction Following）：模型對自然語言任務描述的遵循能力。
* 幻覺（Hallucination）：生成與事實不符或憑空編造的內容。
* 檢索增強生成（RAG, Retrieval-Augmented Generation）：將外部檢索結果注入上下文以降低幻覺。
* 多模態對齊（Multimodal Alignment）：讓模型在不同模態間建立對應與語意一致性。
* 圖像Token化（Image Tokenization）：將圖像分塊/量化為離散代碼以供序列模型生成。
* 聲音Token化（Audio Tokenization）：以編碼器將波形或梅爾頻譜壓縮為離散代碼。
* 語音編碼器（Neural Audio Codec）：以神經網路實現高壓縮比的聲音離散表示（如EnCodec/SoundStream）。
* 取樣率（Sampling Rate）：音訊每秒取樣點數，決定時間解析度與資料量。
* 潛在空間（Latent Space）：資料在模型內部的抽象表示，用於壓縮與生成。
* 變壓器架構（Transformer Architecture）：以自注意力建模長距相依的序列模型。
* 自注意力（Self-Attention）：估計序列元素間相似度以聚合關鍵資訊。
* 位置表示（Positional Encoding/RoPE）：向序列注入位置信息以破除置換不變性。
* 條件嵌入（Condition Embedding）：將條件（文字/類別/參數）嵌入後注入生成管線。
* 分類器自由引導（CFG, Classifier-Free Guidance）：以條件/無條件分佈插值增強條件遵循。
* 擴散生成（Diffusion Generation）：透過逐步去噪從高斯噪聲合成樣本的生成策略。
* 語義壓縮（Semantic Compression）：優先保留語意必要資訊的壓縮方式。
* 碼率–失真權衡（Rate–Distortion Trade-off）：壓縮率與重建品質之間的折衷。
* 模型規模（Model Scale）：參數量、資料量、算力三者對性能的綜合度量。
* 實時生成（Real-time Generation）：在延遲限制下流式產生token以即時互動。
* 流式解碼（Streaming Decoding）：邊接收輸入邊輸出token的解碼機制。
* 鍵值快取（KV Cache）：快取注意力鍵/值以加速長序列自回歸推論。
* 溫度（Temperature）：調節機率分佈平滑度以控制多樣性。
* Top-k抽樣（Top-k Sampling）：在最高機率k個token中隨機抽樣。
* Top-p抽樣（Nucleus Sampling）：在累積機率達p的動態集合中抽樣。
* 多輪語境維持（Dialogue State Carryover）：在同一會話內保留歷程以理解省略指代。
* 文生圖（Text-to-Image）：以文字條件生成圖像的任務。
* 文生音（Text-to-Speech, TTS）：以文字條件合成自然語音的任務。
* 圖生圖（Image-to-Image）：在輸入圖像基礎上以條件生成新風格/內容。
* 語音轉語音（Speech-to-Speech）：將輸入語音映射為另一段合成語音的任務。
* 蛋白質序列建模（Protein Sequence Modeling）：以胺基酸離散序列作為token進行生成與設計。
* 開源模型集市（Model Hub, Hugging Face）：發布、分享與取得開源權重與資料的平臺。
* 編碼（Encode）：將文字轉成模型可處理的token編號序列（Encode）。
* 解碼（Decode）：把token編號序列還原為可讀文字（Decode）。
* 句首符號（Beginning of Sentence, BOS）：表示序列起始的特殊token。
* 句尾符號（End of Sentence, EOS）：表示序列終止的特殊token。
* 特殊符號自動加入（Add Special Tokens）：在編碼時自動插入BOS/EOS等特殊token的行為。
* 分詞器（Tokenizer）：負責文字與token編號相互轉換的工具（Tokenizer）。
* 子詞分割（Subword Tokenization）：以子詞為單位切分文字以兼顧詞彙覆蓋與長度（Subword Tokenization）。
* 字節對編碼（Byte Pair Encoding, BPE）：以合併頻繁字節對建立子詞表的分詞法。
* SentencePiece：無語言依賴的子詞分割工具，常見模型的分詞器實作（SentencePiece）。
* 正規化器（Normalizer）：在分詞前對文本做大小寫、空白、符號等規範化處理（Normalizer）。
* 預分詞器（PreTokenizer）：將文本切分為更小單位以便後續子詞編碼（PreTokenizer）。
* 詞彙表大小（Vocab Size）：模型可用token數量的總計（Vocabulary Size）。
* 前置空白敏感token（Leading-Whitespace Token）：區分「詞首無空白」與「詞前有空白」的token設計。
* 反分詞一致性（Round-trip Consistency）：Encode→Decode後文字與原文一致的性質（Round-trip Consistency）。
* 邏輯值（Logits）：模型輸出的未正規化分數，用於後續softmax與取樣（Logits）。
* 機率化取樣（Stochastic Sampling）：依機率分佈抽樣下一token而非固定取最大值（Sampling）。
* 貪婪解碼（Greedy Decoding）：每步都選取機率最高的token的生成策略（Greedy Decoding）。
* 集束搜尋（Beam Search）：同時保留多條高分路徑尋找較優序列的演算法（Beam Search）。
* 溫度（Temperature）：控制取樣隨機度，增大使分佈更平坦（Temperature）。
* Top-k取樣（Top-k Sampling）：僅在機率最高的k個候選中抽樣。
* Top-p取樣（Nucleus Sampling）：在累積機率達p的動態候選集合中抽樣。
* 重複懲罰（Repetition Penalty）：降低重複token出現機率以減少循環（Repetition Penalty）。
* 出現與頻率懲罰（Presence/Frequency Penalty）：依出現次數調整機率抑制重複（Presence/Frequency Penalty）。
* 邏輯值處理器（Logits Processor）：在取樣前對logits施加規則的模組（Logits Processor）。
* 停止準則（Stopping Criteria）：控制生成終止的條件（長度或遇到特定token）（Stopping Criteria）。
* 最大片段長度（Max Length）：包含輸入與輸出的總序列上限（Max Length）。
* 最大新token數（Max New Tokens）：限定本次生成新增token的上限（Max New Tokens）。
* 生成介面（model.generate）：Transformers提供的一次性序列生成API（generate）。
* 對話樣板（Chat Template）：規範角色/標頭/分隔符的對話格式以誘導問答（Chat Template）。
* 應用對話樣板（apply_chat_template）：由分詞器套用官方樣板並同時完成編碼的函式（apply_chat_template）。
* 角色標記（Role Tag）：以system/user/assistant標示訊息說話者（Role Tag）。
* 標頭開始/結束ID（Start/End Header ID）：在樣板中界定段落與角色的特殊標記（Header ID）。
* 系統提示（System Prompt）：平台預置的行為設定與背景資訊（System Prompt）。
* 使用者訊息（User Message）：由使用者提供的指令或問題（User Message）。
* 助手訊息（Assistant Message）：模型先前輸出的回覆內容（Assistant Message）。
* 上下文串接（Conversation History Concatenation）：將歷史對話與新輸入合併後再生成。
* 多輪對話狀態（Dialogue State）：會話中跨輪次維持的語境資訊（Dialogue State）。
* 模型管線（Pipeline）：封裝編碼、生成、解碼流程的一體化高層API（Pipeline）。
* 隨機種子（Random Seed）：固定取樣隨機性的初始化值（Random Seed）。
* 令牌速率（Tokens per Second, TPS）：推論輸出token的吞吐率指標。
* 延遲時間（Latency）：從提交輸入到產生首個token的時間（Latency）。
* 鍵值快取（KV Cache）：快取注意力鍵/值以加速長序列自回歸解碼（KV Cache）。
* 位置旋轉嵌入（Rotary Position Embedding, RoPE）：為注意力引入相對位置信息的機制。
* 指令遵循微調（Instruction Tuning）：使模型更善於依照自然語言指令回覆的訓練。
* 對齊與安全性（Alignment & Safety）：確保生成內容符合政策與人類價值（Alignment & Safety）。
* 幻覺（Hallucination）：模型生成與事實不符或虛構的內容現象。
* 檢索增強生成（Retrieval-Augmented Generation, RAG）：以外部檢索內容增補上下文降低幻覺。
* 模型ID（Model ID）：在模型倉庫中唯一識別特定權重/配置的名稱（Model ID）。
* 權限與存取權杖（Access Token）：連線模型平台與授權下載所需的憑證（Access Token）。
* 開源權重（Open Weights）：公開提供可下載的模型參數以供本地推論與研究（Open Weights）。
