# 課程目標與架構 * 目標:建立對生成式人工智慧(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)。