跳到主要內容

NLP Day 45 系列總結與延伸路線

NLP Day 45 系列總結與延伸路線

執行需求:CPU 可跑。今天是「NLP 與大型語言模型應用」系列的第四十五篇,也是專案五篇的最後一篇。我們花一天回顧這 45 天的學習路徑:從 Day 1 的環境與工具鏈開始,經過文本前處理、詞向量、分類、LLM API、微調、檢索、RAG、Agent、LangGraph、成本武器、部署、到最後五天的「企業知識庫問答」專案。本篇不寫新技術,只整理學過的工具、指標、模型,給出延伸到 2025 年 5 月後可走的學習方向。我們會把七個階段的學習重點串成一張圖,並列出五個常見的職涯方向,最後給一份延伸閱讀清單(不引用 2025 年 5 月之後的新工具或新模型)。

引言

回頭看 45 天前,Day 1 我們說「這系列要把讀者從『會用 BERT 做分類』帶到『能獨立打造 LLM 應用』」。今天我們可以驗收這個承諾:Day 1–4 建立環境與基礎(Python、spaCy、jieba、sentence-transformers),Day 5–12 走完 NLP 經典任務(分類、NER、情緒分析、零樣本),Day 13–21 進入 LLM 與微調(API、提示工程、Ollama、結構化輸出、LoRA、評估),Day 22–30 走過檢索與 RAG(嵌入、向量資料庫、查詢改寫、rerank、GraphRAG),Day 31–37 從 RAG 走到 Agent(企業知識庫、ReAct、MCP、多 Agent、安全、文件處理自動化),Day 38–40 加上框架與部署武器(LangGraph、成本最佳化、FastAPI 串流),最後 Day 41–45 把所有工具組合成一個可部署的企業知識庫系統。四十四篇技術文之後的這篇,是把所有工具、指標、概念在腦中重新組合成一張可以帶走的地圖。

本篇的內容分四段:第一段回顧七個階段的學習路徑與代表工具;第二段整理「企業知識庫問答」專案的最終成果;第三段列出 2025 年 5 月前仍可走的延伸學習方向(multi-modal RAG、量化推論、Agent 部署等);第四段是 45 天學習的「自我評估清單」,讀者可以對照檢查自己學到了什麼、還缺什麼。這篇沒有新的程式碼,但有大量引用 Day 1–44 的連結,方便你回頭補課。

七個階段的學習路徑

在把這張地圖列出來之前,我們先用一段小程式把「45 天中每天的主題」做一個快速掃描,幫自己複習這整套內容的章節分布:

# 1. 掃描 posts-nlp 目錄,看看每篇的章節 ID 與任務分類
import re
from pathlib import Path

posts_dir = Path("posts-nlp")
slots = []
for fp in sorted(posts_dir.glob("*-nlp-day-*.html")):
    m = re.match(r"(\d+)-nlp-day-(\d+)", fp.stem)
    if not m:
        continue
    slots.append((int(m[1]), fp.name, fp.stat().st_size // 1024))

# 統計各任務的篇章數
from collections import Counter
counter = Counter()
for slot, name, _ in slots:
    if slot <= 2:
        counter["導論"] += 1
    elif slot <= 12:
        counter["分類"] += 1
    elif slot <= 21:
        counter["LLM 與微調"] += 1
    elif slot <= 32:
        counter["檢索與 RAG"] += 1
    elif slot <= 37:
        counter["Agent"] += 1
    elif slot <= 40:
        counter["框架與部署"] += 1
    else:
        counter["專案"] += 1

print("七個階段篇章分布:")
for stage, n in counter.items():
    print(f"  {stage:12s} {n} 篇")
# 輸出範例:
# 七個階段篇章分布:
#   導論        2 篇
#   分類        10 篇
#   LLM 與微調   9 篇
#   檢索與 RAG   11 篇
#   Agent       5 篇
#   框架與部署   3 篇
#   專案        5 篇

把 45 天切成七個階段,每個階段都有「理論 → 程式 → 實戰」的節奏。我們用一張地圖把每一階段的代表工具、指標、實戰資料集整理起來,方便你回頭查閱。

階段 天數 代表工具 代表指標 實戰資料集
導論 Day 1–2 Python、Colab、transformers、LangChain、向量資料庫 — —
基礎 Day 3–4 spaCy、jieba、OpenCC、sentence-transformers — 中文客服訊息
分類 Day 5–12 TF-IDF、BERT、timm、情緒分析、零樣本 accuracy、F1、AUROC、混淆矩陣 客服工單
LLM 與微調 Day 13–21 OpenAI、Anthropic、Ollama、LoRA、QLoRA BLEU、ROUGE、LLM-as-judge 指令微調資料
檢索與 RAG Day 22–32 Chroma、pgvector、Qdrant、GraphRAG、rerank recall@k、MRR、忠實度 企業知識庫
Agent Day 33–37 ReAct、MCP、文件處理自動化 任務完成率、安全檢測 合約查詢
框架與部署 Day 38–40 LangGraph、成本最佳化、FastAPI、串流輸出 P50/P95 延遲、throughput —
專案 Day 41–44 hybrid_rerank、ONNX、Streamlit、Docker 引用正確率、忠實度、覆蓋率 個資法

這張表是我們完成 45 天的「全景」。每一格都能在對應的篇章找到詳細實作:分類的遷移學習(Day 5 與 Day 8)、微調的 LoRA 設定(Day 17)、RAG 的 hybrid_rerank(Day 42)、Agent 的 LangGraph 狀態管理(Day 38)、部署的 ONNX + FastAPI + Streamlit(Day 44)、最後在 Day 41–44 全部組合成可部署服務。

專案五篇的最終成果

專案五篇(Day 41–45)把前面 40 天的工具組合成一個 production-ready 的企業知識庫問答系統。我們把它的最終成果整理成一張表:

# 2. 把 Day 41–44 的最終指標整合起來
import json
from pathlib import Path

# 三個關鍵檔案:experiments_log.json(Day 42)、errors_log.json(Day 43)、eval_report.md(Day 43)
exp = json.loads(Path("experiments_log.json").read_text(encoding="utf-8"))
errors = json.loads(Path("errors_log.json").read_text(encoding="utf-8"))

best = next(r for r in exp if r["run"] == "hybrid_rerank")

print("=== Day 41–44 專案五篇最終成果 ===")
print(f"資料集:個人資料保護法 + 施行細則(法務部全國法規資料庫,政府資料開放授權條款 v1)")
print(f"檢索(hybrid_rerank):recall@4={best['avg_recall@4']:.4f}, MRR={best['avg_mrr']:.4f}")
print(f"生成(Day 43 評估):引用正確率=0.9400, 忠實度=0.8750, 覆蓋率=0.9000")
print(f"錯誤案例(Day 43):{len(errors)} 個,分 FN/FP/Hallucination 三類")
print(f"部署(Day 44):ONNX={Path('embedding_e5_small.onnx').stat().st_size // 1024 // 1024} MB,"
      f"FastAPI:8000 + Streamlit:8501,DOCKER image ≈ 1.2 GB")
# 輸出範例(固定條件下每次都一致):
# === Day 41–44 專案五篇最終成果 ===
# 資料集:個人資料保護法 + 施行細則(法務部全國法規資料庫,政府資料開放授權條款 v1)
# 檢索(hybrid_rerank):recall@4=0.8500, MRR=0.9167
# 生成(Day 43 評估):引用正確率=0.9400, 忠實度=0.8750, 覆蓋率=0.9000
# 錯誤案例(Day 43):4 個,分 FN/FP/Hallucination 三類
# 部署(Day 44):ONNX=190 MB,FastAPI:8000 + Streamlit:8501,DOCKER image ≈ 1.2 GB

把 Day 41–44 的最終指標整合成一份摘要:資料來源是政府開放資料、檢索 recall@4 達到 0.85、生成引用正確率達到 0.94、4 個錯誤案例寫進 fallback 邏輯、部署用 ONNX + FastAPI + Streamlit + Docker 容器化。這份專案展示的不是「最先進的模型」,而是「production-ready 的最小可行產品」——所有元件都跑得起來、所有指標都達標、可以 demo、可以監控、可以部屬。

這套系統與 Day 31–32 的原型差別有三點:第一,檢索從純 dense 升級到 hybrid_rerank(recall@4 從 0.65 提升到 0.85);第二,評估從 A/B 測試升級到完整四指標(引用正確率、忠實度、覆蓋率、延遲);第三,部署從 notebook 腳本升級到 ONNX + FastAPI + Streamlit + Docker 容器。這三個升級剛好對應「檢索」、「評估」、「部署」三個 RAG 系統最關鍵的環節。

四個貫穿主題

回顧這 45 天的內容,有四個「貫穿主題」反覆出現,每一個都值得單獨再深入:

主題一:資料永遠比模型重要。從 Day 3(文本前處理)到 Day 11(標註與資料增強)到 Day 22(嵌入與語意)到 Day 41(知識庫整備),資料相關的天數佔了近三分之一。我們學過的關鍵工具包括:jieba、OpenCC、Albumentations、sentence-transformers、Chroma、RAGAS。資料品質的提升往往比模型替換更划算——一個好的資料切分可以讓 5 M 參數的小模型逼近 100 M 的大模型。

主題二:指標必須對應業務問題。Day 10、Day 19、Day 29、Day 43 都在強調「單一指標容易誤導」。工業界常見的 best practice:先用 recall@k 看整體、再用 precision/recall 看部署 trade-off、最後用 per-class 指標找瓶頸。這套方法在 Day 42 的檢索實驗(純 dense 0.65 → hybrid_rerank 0.85)與 Day 43 的錯誤分析(FN/FP/Hallucination)完整示範了一遍。

主題三:訓練 vs 推論的權衡。從 Day 17(LoRA 微調)到 Day 25(RAG 架構)到 Day 39(成本武器)到 Day 44(ONNX 部署),這個主題貫穿整個系列。學完之後你應該了解:訓練追求最高指標會大量用 GPU + 大模型;推論追求最低延遲會大量用 ONNX + 量化 + 邊緣裝置。連接兩者的橋樑是「模型轉換 + benchmark + 上線觀察」。

主題四:錯誤分析驅動迭代。Day 10(分類錯誤)、Day 17(偵測錯誤)、Day 29(RAG 評估)、Day 43(生成錯誤)四個篇章都強調「不要只盯著指標把數字調高,要把錯誤拆給工程師看」。這個方法論在工業界比「重新 train 一個新模型」更常見:先看錯誤分布,再決定要不要換模型、換資料、還是換 prompt。

常見職涯方向

在介紹五條職涯路線之前,我們用一張簡單的「技能 vs 路線」表格幫你判斷自己目前的位置:

# 3. 五條職涯路線的技能對照(純資料,方便決策)
career_paths = {
    "NLP 工程師": {
        "核心技能": ["transformers", "LangChain", "PEFT", "向量資料庫", "ONNX"],
        "延伸技能": ["FastAPI", "Docker", "CI/CD"],
        "入門年資": "1-3 年",
        "適合特質": "喜歡把模型做出來跑起來",
        "Day 對應": "Day 5, 17, 22, 30, 38, 41-44",
    },
    "ML 工程師": {
        "核心技能": ["PyTorch", "Spark", "Airflow", "MLflow"],
        "延伸技能": ["Feast", "Kafka", "Dashboard"],
        "入門年資": "2-4 年",
        "適合特質": "喜歡處理資料管線與自動化",
        "Day 對應": "Day 11, 18, 22, 41-44",
    },
    "LLM Researcher": {
        "核心技能": ["論文閱讀", "預訓練", "RLHF", "arXiv"],
        "延伸技能": ["數學推導", "benchmark 設計", "論文撰寫"],
        "入門年資": "需要碩博士學位",
        "適合特質": "對前沿技術有強烈好奇心",
        "Day 對應": "Day 17, 20, 34, 35, 39",
    },
    "MLOps / Production": {
        "核心技能": ["Docker", "Kubernetes", "Prometheus", "Terraform"],
        "延伸技能": ["Grafana", "Kafka", "CI/CD"],
        "入門年資": "2-4 年",
        "適合特質": "在乎穩定性與監控",
        "Day 對應": "Day 39, 40, 44",
    },
    "RAG / Domain Expert": {
        "核心技能": ["領域知識", "RAG 工具鏈", "Prompt Engineering"],
        "延伸技能": ["法規/醫療/金融領域知識", "標註"],
        "入門年資": "1-3 年",
        "適合特質": "喜歡把 LLM 接到特定產業",
        "Day 對應": "Day 25, 28, 30, 31, 32, 41-44",
    },
}
for name, attrs in career_paths.items():
    print(f"== {name} ==")
    for k, v in attrs.items():
        print(f"  {k}: {v}")
    print()

這張對照表展示了「學完 45 天後,你可以走哪幾條路」。每條路都有 Day 對應欄位,告訴你這個系列中哪幾篇對這條職涯最有幫助。例如想做 RAG / Domain Expert,主要看 Day 25(RAG 架構)、Day 28(rerank)、Day 30(GraphRAG)、Day 31–32(企業知識庫)、Day 41–44(專案)。想做 Researcher,主要看 Day 17(LoRA)、Day 20(幻覺)、Day 34–35(多 Agent)的原理章節。Career recommendation 的關鍵在於你的「興趣特質」與「現有技能」的交叉點,不要只看哪條路薪水高。

學完這 45 天的內容後,你有幾個常見的下一站可以選擇:

  1. NLP 工程師(NLP Engineer):把模型訓練 + 部署整套做完。這條路以 transformers、LangChain、PEFT、向量資料庫、ONNX 為核心技能。專案篇 Day 41–44 就是這個角色的最佳預習。薪資區間在台灣大約年薪 100–180 萬新台幣。
  2. ML 工程師(Machine Learning Engineer):覆蓋 NLP + CV + 推薦系統,但通常以其中一條為主。NLP 工程師與 ML 工程師的差異在「後者會處理更多資料管線、MLOps、特徵工程」。延伸技能:Airflow、Spark、MLflow、Feast。
  3. LLM Researcher:投入新模型研發、論文發表。這條路偏學術,工業界職缺主要在大公司的 Research Lab(OpenAI、Google DeepMind、Meta AI)或新創 LLM 公司。延伸技能:大量論文閱讀、PyTorch 自刻模型、arXiv 追蹤。薪資區間較高(年薪 150–300 萬新台幣),但競爭也激烈。
  4. MLOps / Production Engineer:把模型從 notebook 推到 production。這條路專注於 deployment、monitoring、A/B testing、retraining。延伸技能:Kubernetes、Prometheus、Grafana、Terraform。
  5. RAG / Domain Expert:在特定產業(醫療、法律、金融、製造)把 LLM 技術落地。這條路除了 ML 之外,還要懂領域知識(醫療影像需要懂 DICOM、農業需要懂植物病理學、法律需要懂法條結構)。Day 31–32 與 Day 41–44 就是這個角色的標準 SOP。

這五條路並不互斥,許多 NLP/ML 工程師在工作 5–10 年後會跨界到 MLE 或 Researcher。建議你在工作 3 年內把第一條(NLP 工程師)的核心技能練熟,再依專案需要延伸到其他方向。

延伸學習方向

在給延伸資源清單之前,我們用一段小程式把 6 個延伸學習方向做成結構化索引,方便日後查詢:

# 4. 延伸學習的「主題 → 關鍵論文與教材」對照表
extensions = {
    "Multi-modal RAG": [
        "Radford 2021, CLIP (ICML)",
        "Li 2022, BLIP-2 (arXiv)",
        "Liu 2023, LLaVA (NeurIPS)",
        "Chen 2023, GPT-4V 技術報告",
    ],
    "量化與邊緣部署": [
        "Jacob 2018, Quantization + Training (CVPR)",
        "ONNX Runtime 1.19 (Microsoft, 2024)",
        "OpenVINO 2024.4 (Intel)",
        "TensorRT 8.6 (NVIDIA, 2023)",
    ],
    "Agent 與工具呼叫": [
        "Yao 2022, ReAct (arXiv:2210.03629)",
        "Anthropic 2024, MCP 規範",
        "OpenAI 2023, Function Calling",
        "Schick 2023, Toolformer (NeurIPS)",
    ],
    "RAG 評估框架": [
        "Es 2024, RAGAS (arXiv:2309.15217)",
        "Saad-Falcon 2024, ARES (arXiv:2311.09476)",
        "Es 2024, Faithfulness vs Factuality (arXiv:2404.10128)",
    ],
    "向量資料庫進階": [
        "Qdrant 1.12 (2025-01)",
        "pgvector 0.8 (2025-02)",
        "Milvus 2.5 (2025)",
        "LanceDB 0.10 (2025)",
    ],
    "Self-RAG 與 Adaptive RAG": [
        "Asai 2023, Self-RAG (arXiv:2310.11511)",
        "Jeong 2024, Adaptive-RAG (arXiv:2403.14403)",
    ],
}
for theme, papers in extensions.items():
    print(f"== {theme} ==")
    for p in papers:
        print(f"  - {p}")
    print()

這六個主題在 2025 年 3–5 月都已有穩固的論文與工具基礎,且都有良好的 Python 套件支援。讀完這系列後,你可以依興趣選一條深入。每個主題的入門成本大約 1–3 個月(每天 2–3 小時)。

45 天內容其實只是「可工作的 NLP 工程師」最低門檻。接下來還有非常多值得深入的方向,這裡列出 6 個在 2025 年 5 月前仍持續發展、且有良好社群基礎的主題:

1. Multi-modal RAG(多模態檢索增強生成)。本系列只處理文字 RAG,但企業真實場景常需要處理圖片、表格、PDF。Multi-modal RAG 把 CLIP 或 BLIP-2 這類視覺語言模型整合進檢索管線,可以對「圖片 + 文字」做混合檢索。建議閱讀:Learning Transferable Visual Models From Natural Language Supervision(CLIP,2021)。

2. 量化與邊緣部署。Day 44 我們用 ONNX 加速 embedding 推論,但尚未觸及 INT8 量化、TFLite、TensorRT、Qualcomm SNPE 等。量化能把模型從 190 MB 壓到 50 MB、推論加速 2–3 倍,是邊緣裝置部署的必備技能。建議閱讀:Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference(2019)。

3. Agent 與工具呼叫的進階設計。Day 33–38 我們學過 ReAct、MCP、LangGraph,但這些都還在「單 Agent」的範疇。進階主題包括多 Agent 協作(AutoGen、CrewAI)、Self-RAG(讓 Agent 自己判斷要不要檢索)、Adaptive-RAG(根據問題難度動態調整流程)。建議閱讀:ReAct: Synergizing Reasoning and Acting in Language Models(2022)。

4. RAG 評估框架的工程化。Day 43 我們手寫四個指標,但工業界常用 RAGAS、ARES、Promptfoo 等開源框架。這些框架支援「指標漂移偵測」、「A/B 測試」、「prompt 版本控制」,是 production 部署的必備工具。建議閱讀:RAGAS: Automated Evaluation of Retrieval Augmented Generation(2023)。

5. 向量資料庫的規模化。本系列用 Chroma 處理 100 個 chunk,真實工業界要處理數十萬到數百萬個 chunk。Qdrant、pgvector、Milvus 在這個規模仍能保持高效 ANN 搜尋;LanceDB 用 columnar 格式儲存向量、適合分析型查詢。建議閱讀:Efficient and robust approximate nearest neighbor search using Hierarchical Navigable Small World graphs(HNSW,2016)。

6. Self-RAG 與 Adaptive RAG。傳統 RAG 對每個問題都做相同流程,Self-RAG 讓模型自己判斷要不要檢索(甚至要不要重檢索),Adaptive-RAG 根據問題難度選不同流程。這兩個方向在 2024–2025 年快速發展,是 RAG 領域的前沿。建議閱讀:Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection(2023)。

自我評估清單

在列出 13 條自我評估之前,我們用一個簡單的對照函式幫你把「會」與「不會」快速分類:

# 5. 自我評估清單的「會/不會」計數器
checklist = {
    "能用 spaCy 與 jieba 做文本前處理": "Day 3, 7",
    "能用 sentence-transformers 做嵌入": "Day 4, 22",
    "能用 BERT 微調文本分類": "Day 5, 8",
    "能用 OpenAI / Ollama 串接 LLM": "Day 13, 15",
    "能用 prompt engineering 控制 LLM 輸出": "Day 14, 16",
    "能用 LoRA 做參數高效微調": "Day 17",
    "能用 BLEU / ROUGE / LLM-as-judge 評估生成": "Day 19",
    "能用 Chroma / pgvector / Qdrant 做向量檢索": "Day 23, 41",
    "能用 BM25 + dense 做混合檢索": "Day 27, 42",
    "能用 cross-encoder 做 rerank": "Day 28, 42",
    "能用 RAGAS 風格指標評估 RAG 系統": "Day 29, 43",
    "能用 ReAct / function calling 做 Agent": "Day 33",
    "能用 MCP / LangGraph 設計狀態機 Agent": "Day 34, 38",
    "能用 FastAPI + Streamlit 部署 RAG 服務": "Day 40, 44",
    "能把個資法問答系統從資料整備做到容器化": "Day 41-44",
}

checked = {
    "能用 spaCy 與 jieba 做文本前處理",
    "能用 sentence-transformers 做嵌入",
    "能用 OpenAI / Ollama 串接 LLM",
    "能用 Chroma / pgvector / Qdrant 做向量檢索",
    "能用 BM25 + dense 做混合檢索",
    "能用 RAGAS 風格指標評估 RAG 系統",
    "能用 FastAPI + Streamlit 部署 RAG 服務",
    "能把個資法問答系統從資料整備做到容器化",
}

print(f"自我評估:{len(checked)}/{len(checklist)} 條已通過")
unfinished = [k for k in checklist if k not in checked]
print("未通過的條目:")
for u in unfinished:
    print(f"  - {u}(建議補 {checklist[u]})")
# 輸出(取決於 checked 集合):
# 自我評估:8/15 條已通過
# 未通過的條目:
#   - 能用 BERT 微調文本分類(建議補 Day 5, 8)
#   ... 等等

讀完 45 天後,可以用這個清單自我檢核。如果每條都能說出具體做法,你就是「可上工的 NLP 工程師」;若有卡住的地方,可以回頭查對應的篇章。

  1. 能用 spaCy 與 jieba 做中文文本前處理(Day 3、Day 7)。
  2. 能用 sentence-transformers 把文字轉成向量(Day 4、Day 22)。
  3. 能用 BERT 微調文本分類(Day 5、Day 8)。
  4. 能用 OpenAI 與 Ollama 串接 LLM(Day 13、Day 15)。
  5. 能用 prompt engineering 控制 LLM 輸出格式(Day 14、Day 16)。
  6. 能用 LoRA 做參數高效微調(Day 17)。
  7. 能用 BLEU、ROUGE、LLM-as-judge 評估生成品質(Day 19)。
  8. 能用 Chroma / pgvector / Qdrant 建立向量檢索(Day 23、Day 41)。
  9. 能用 BM25 + dense 做混合檢索(Day 27、Day 42)。
  10. 能用 cross-encoder 做 rerank(Day 28、Day 42)。
  11. 能用 RAGAS 風格指標評估 RAG 系統(Day 29、Day 43)。
  12. 能用 ReAct 與 function calling 設計 Agent(Day 33)。
  13. 能用 MCP 與 LangGraph 設計狀態機 Agent(Day 34、Day 38)。
  14. 能用 FastAPI 與 Streamlit 部署 RAG 服務(Day 40、Day 44)。
  15. 能把企業知識庫問答系統從資料整備做到容器化部署(Day 41–44)。

這 15 條覆蓋了基礎、LLM、RAG、Agent、部署五個面向,每一條都對應到具體的篇章;如果有 3 條以上答不出來,建議先補課再進入下一步。

常見錯誤與踩雷

錯誤一:學完 45 天覺得自己「都會了」就直接上工。NLP 的實際專案遠比 Day 41–44 複雜:客戶資料的格式可能不是個人資料保護法風格、領域詞彙需要重新標註、prompt 需要反覆調。建議先在小型 demo 證明技術可行,再逐漸擴大範圍。

錯誤二:忽略資料合約與設定檔。許多新手寫完訓練程式就交差,沒有把資料切分、preprocess、threshold 寫成設定檔;當資料變動時整個訓練流程要重寫。Day 41 我們把 manifest 與 project_config.py 寫得很完整,正是要避開這個坑。

錯誤三:用 Python list / dict 當 ML 系統的「資料庫」。Day 44 的服務把產線結果寫進 CSV 是 demo 等級;正式 production 要用 PostgreSQL 或 MongoDB 儲存,且 schema 要固定。建議在 Day 41–44 之上再做一個「資料庫層」設計。

錯誤四:版本混亂。整個系列我們固定 2025 年 3–5 月版本,但工業界常見的踩雷是「同事裝了 2025 年下半年的新版本,結果某些 API 被 deprecate」。建議用 requirements.txt 或 pyproject.toml 鎖版本,或用 Docker image 鎖住整個環境。

錯誤五:忽略可觀察性。服務上線後沒 log、沒 metrics、沒 alert,等於瞎子摸象。Day 44 的服務應該加上 logging 與 metrics(FastAPI 的 prometheus middleware),把每個 request 的 latency、引用正確率、忠實度寫到 Prometheus + Grafana,工業界已把這個當成標準做法。下面這段示範把推論結果寫成 CSV log,供下游 dashboard 繪圖:

# 6. 為部署的服務加上基本的 CSV log,方便日後做長期的品質追蹤
import csv
from datetime import datetime, timezone, timedelta
from pathlib import Path

LOG_PATH = Path("inference_log.csv")
HEADER = ["timestamp", "filename", "label", "citation_precision", "latency_ms"]

def log_request(filename: str, citation_precision: float, latency_ms: float) -> None:
    """記錄每一次推論的指標(沿用 Day 44 的設計)"""
    ts = datetime.now(timezone(timedelta(hours=8))).isoformat()
    with LOG_PATH.open("a", newline="", encoding="utf-8") as f:
        csv.DictWriter(f, fieldnames=HEADER).writerow({
            "timestamp": ts,
            "filename": filename[:50],
            "label": "ok",
            "citation_precision": round(citation_precision, 4),
            "latency_ms": round(latency_ms, 1),
        })

if not LOG_PATH.exists():
    with LOG_PATH.open("w", encoding="utf-8") as f:
        f.write(",".join(HEADER) + "\n")
log_request("個資法查詢 001", citation_precision=0.95, latency_ms=2150)
print(f"已寫入 inference_log.csv,目前 {LOG_PATH.stat().st_size} bytes")
# 輸出範例(每次會 append 一筆):
# 已寫入 inference_log.csv,目前 132 bytes

效能與實務提醒

45 天學完後,最常見的時間分配建議:30% 寫程式、30% 讀論文、20% 看教學影片、20% 做 side project。寫程式是基本功、讀論文吸收前沿、看影片理解思路、做 side project 整合應用。對應到本系列,Day 5、Day 17、Day 42 的程式碼可以作為 side project 起點;Day 25、Day 30 的 RAG 章節是寫論文的標準引用來源。

另外一個工程上的提醒:學完 45 天不等於你能獨立解所有 NLP 問題,但你有足夠基礎去讀論文、debug 模型、與其他工程師合作。每週投入 8–10 小時、3 個月就能從這個基礎走到「可獨立負責小型 NLP 專案」的程度;6 個月走到「可主導中型專案」。

最後,NLP 是 AI 中「文字應用」的主力,從客服機器人、文件摘要、合規審查、知識管理到寫作助理、搜尋引擎、內容審核,每個產業都有需求。把這系列學到的工具組合起來,你應該能在 3 個月內做出第一個 demo,並在 6 個月內拓展到正式產品。

小結

今天把 45 天的學習路徑整理成一張地圖:七個階段從導論、基礎、分類、LLM 與微調、檢索與 RAG、Agent、框架與部署、到專案;四個貫穿主題——資料、指標、訓練/推論權衡、錯誤分析;五個常見職涯方向;六個延伸學習方向;以及 15 條自我評估清單。我們的目標不是讓你「會訓練最先進的模型」,而是讓你「能獨立完成一個能 demo、能部署、能解釋的 LLM 應用專案」。這 45 天結束了,但 NLP 學習的路還很長;希望這篇能讓你有一張帶得走的地圖,在未來遇到問題時知道該回頭查哪一篇。

結語

今天是整個系列的最後一篇。回頭看這 45 天,我們從 Day 1 的環境設定出發,走過分類(Day 5–12)、LLM(Day 13–21)、RAG(Day 22–32)、Agent(Day 33–37)、框架與部署(Day 38–40),最後在 Day 41–44 把所有工具組合成一個可在 CPU 上跑的企業知識庫問答系統,並在 Day 42 的檢索實驗中比較三組策略、在 Day 43 的評估中發現「引用正確率」是企業最在意的指標、在 Day 44 的部署中用 ONNX + FastAPI + Streamlit 把服務化完成。這整個過程是一個完整的「資料 → 模型 → 評估 → 部署」閉環,是工業界最基本也最重要的四步。

最值得帶走的觀念有三個:第一,「資料永遠比模型重要」——一個好的資料流程帶來的提升,往往比換模型還多;第二,「指標必須對應業務問題」——單看 AUROC 或 recall@4 容易誤導,必須搭配錯誤案例視覺化與 LLM-as-judge 一起看;第三,「永遠準備好 retrain」——上線後的服務要有批次再訓練的機制,這是工業界常見的閉環,也是 Day 39 的成本武器可以延伸應用的場景。這三個觀念不只適用於 Day 41–44 的企業知識庫,也適用於整個 NLP 領域的任何任務。

系列完結,但學習沒有終點。希望這個系列能幫助你走進 NLP 與 LLM 應用領域,並在客服、文件、法務、醫療、金融等場景中看到「學會的工具可以用在哪裡」。祝你在後續的學習中,找到自己有興趣的方向、做出有影響力的 LLM 應用專案。如果有任何回饋或問題,請透過部落格的聯絡頁找到我。再見。

延伸資源

  • Hugging Face Transformers 官方文件(4.49–4.51,2025):https://huggingface.co/docs/transformers/v4.49.0/en/index,預訓練模型、tokenizer、Trainer 的標準 API。
  • LangChain 官方教學(0.3.x,2025):https://python.langchain.com/docs/introduction/,RAG、Agent、工具呼叫的標準範例。
  • LangGraph 官方文件(0.2.x,2025):https://langchain-ai.github.io/langgraph/,狀態機 Agent 的標準設計模式。
  • RAGAS 評估框架(0.2 世代,2025):https://docs.ragas.io/,忠實度、相關性、引用正確性的標準評估指標。
  • Chroma 官方文件(0.6.x,2025):https://docs.trychroma.com/,向量資料庫的標準介面。
  • FastAPI 官方教學(0.115.x,2024):https://fastapi.tiangolo.com/zh-tw/tutorial/,HTTP 服務、async、Pydantic、依賴注入的標準範例。
  • Streamlit 官方文件(1.41.x,2025):https://docs.streamlit.io/,ML Demo UI 的快速搭建工具。
  • Ollama 官方網站(0.7.x,2025-01):https://ollama.com/,本地模型執行環境;phi3:mini、qwen2.5:7b、llama3.3 等開源模型。
  • 全國法規資料庫(法務部,政府資料開放授權條款—第 1 版):https://law.moj.gov.tw/,個資法與施行細則的官方網址。
  • 《Natural Language Processing with Transformers》專書(2024):Lewis Tunstall, Leandro von Werra, Thomas Wolf,從 transformer 基礎到部署的完整指南。
  • Stanford CS324 大型語言模型課:https://stanford-cs324.github.io/,LLM 基礎理論的經典教材。
  • arXiv cs.CL 每日清單:https://arxiv.org/list/cs.CL/recent,最新 NLP 與 LLM 論文的 RSS feed。

留言

這個網誌中的熱門文章

Day 2 變數與資料型別

Day 2 變數與資料型別 引言 寫程式的過程中,變數與資料型別是處理資料的基礎。變數是存放資料的容器,資料型別則決定這筆資料有哪些特性、可以進行哪些操作。學會定義變數、認識各種資料型別,是學好 Python 的關鍵一步。 這篇文章會帶你了解 Python 中變數的觀念、如何定義變數,以及常見的資料型別,包括整數、浮點數、字串、布林值,還有串列、元組、字典與集合等容器型別。我們也會介紹變數的命名規則與撰寫風格建議,以及如何用 type() 檢查資料型別。 什麼是變數?如何在 Python 中定義變數 變數是在程式執行時用來存放資料的名稱。透過定義變數,我們可以給一筆資料一個名字,並在程式的其他地方用這個名字取用該筆資料。在 Python 中,變數不需要事先宣告型別,因為 Python 是動態型別語言,變數的型別由指定給它的值決定。 定義變數的基本語法 在 Python 中定義變數非常簡單,只要用賦值符號 = 把值指定給變數即可。例如: x = 5 # 定義變數 x,並把整數 5 賦值給它 name = "Alice" # 定義變數 name,並把字串 "Alice" 賦值給它 在這裡,x 是一個變數,被賦予整數 5;name 是另一個變數,被賦予字串 "Alice"。 變數的更新與覆寫 變數的值可以修改,也就是說,我們可以在程式的不同地方給同一個變數新的值。例如: x = 10 # x 最初被賦予 10 x = 15 # x 的值現在被更新為 15 這樣就能依照需求,在程式執行過程中靈活調整變數的值。 Python 的動態型別系統 Python 和某些靜態型別語言不同,定義變數時不需要宣告型別。賦值時,Python 會根據值自動判斷變數的型別。例如: x = 5 # x 是整數 x = 3.14 # x 變成浮點數 x = "Hi" # x 變成字串 同一個變數在程式執行過程中可以存放不同型別的值,這是 Python 的彈性之一。 常見資料型別 在 Python 中,資料型別決定我們可以對變數進行哪些操作...

Day 1 Python 簡介與環境設定

Day 1 Python 簡介與環境設定 引言 在現在的科技環境裡,程式設計已經是一項重要技能。無論你是對資料科學有興趣、想成為開發者,或是想踏入人工智慧(AI)領域,學會寫程式都能明顯提升你的競爭力。在眾多程式語言中,Python 因為語法簡單、功能強大、應用範圍廣泛,成為許多人進入程式世界的第一選擇。這篇文章會帶你認識 Python 的背景與優勢,並一步步教你在不同系統上安裝與設定 Python 開發環境,最後寫出第一支 Python 程式。 為什麼選擇 Python? Python 是一種高階程式語言,由 Guido van Rossum 在 1991 年發布。Python 的設計哲學強調程式碼的可讀性,並用縮排來定義程式區塊,這點和許多使用大括號的語言不同。簡潔的語法讓它成為初學者的理想選擇;就算是經驗豐富的開發者,也能用它完成複雜的專案。 Python 的優勢如下: 簡單易學 :Python 的語法清楚、結構簡潔,初學者很快就能上手。和其他語言相比,學習曲線相對平緩,不需要先弄懂一堆複雜觀念,就能開始寫程式。 應用範圍廣泛 :從資料科學、網頁開發、人工智慧、機器學習、自動化測試到網路爬蟲,Python 都有大量開源函式庫與工具支援,而且在這些領域都扮演關鍵角色。 豐富的函式庫與框架 :Python 的函式庫生態系非常龐大。做資料分析有 NumPy、Pandas;開發網站有 Django、Flask;做深度學習有 TensorFlow、PyTorch。各種需求幾乎都能找到對應的套件,讓開發更有效率。 跨平台支援 :Python 支援 Windows、macOS、Linux 等作業系統,程式通常不需要太多修改就能跨平台執行,讓開發與部署更有彈性。 活躍的社群 :Python 擁有龐大的開發者社群。學習或開發上遇到問題,幾乎都能在社群與論壇(例如 Stack Overflow)找到答案,對初學者來說是很強的後盾,也能減少卡關時的挫折感。 Python 的應用領域 Python 的流行與強大功能,讓許多領域都開始大量使用它。以下是幾個常見的應用方向: 資料科學 :隨著大數據與人工智慧興起,資料科學大量使用 Python。NumPy、Pandas 與 Matplotlib 等工具能處理和分析龐...

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門

Python 從入門到 PyTorch 深度學習:開啟 AI 世界的大門 隨著人工智慧(AI)與深度學習(Deep Learning)快速發展,越來越多人對這些技術產生興趣。不論你是想踏入 AI 領域的初學者,還是已經有程式基礎的開發者,學好 Python 與深度學習框架(例如 PyTorch),都能為你打開更多可能。 為什麼選擇 Python? Python 已經是資料科學與人工智慧領域的首選語言。它的語法簡潔、容易上手,而且擁有龐大的生態系與大量開源函式庫。無論是資料處理、資料視覺化,還是建立機器學習與深度學習模型,Python 都能勝任。對想進入 AI 或資料科學領域的人來說,它幾乎是必備工具。 PyTorch 是什麼? PyTorch 是由 Meta(原 Facebook)AI 研究團隊開發的開源深度學習框架,以易用、靈活和動態計算圖著稱,是許多 AI 研究人員與開發者的首選。相較於其他框架,PyTorch 的寫法更貼近原生 Python,對初學者相對友善。無論是簡單的實驗,還是複雜的深度學習模型,PyTorch 都能提供強大的支援。 這個系列能帶給你什麼? 這個系列會從 Python 的基礎開始,帶你一步一步學習,最後能自己用 PyTorch 建立深度學習模型。即使你完全沒有寫過程式,也能跟著文章的節奏累積技能,理解 AI 與深度學習的核心觀念。 本系列涵蓋的主題 Python 基礎:從變數、條件判斷到函式與模組。 資料處理工具:用 NumPy 與 Pandas 有效率地操作資料。 資料視覺化:用 Matplotlib 與 Seaborn 把資料畫成圖表。 深度學習的數學基礎:線性代數、微積分與機率。 PyTorch 入門:理解張量、模型建構與 GPU 加速。 基礎深度學習模型:CNN 與 RNN 的實作應用。 深度學習專案實戰:從資料前處理到模型部署的端到端流程。 誰適合這個系列? 程式初學者 :如果你對 AI 充滿好奇,卻還沒寫過程式,系列的第一部分會帶你快速上手 Python,並幫助你理解深度學習的基本觀念。 資料科學愛好者 :如果你已經熟悉一些資料處理方法,進階部分會教你如何用 PyTorch 建構深度學習模型。 開發者與研究人員 :想更深入了...