5. LLM & Agent – 原理解析

大語言模型(LLM)其實就是 超大型「下一個字預測器」
你給它一段文字,它根據訓練過的統計規律,一個 token 一個 token 接下去生成,直到覺得該結束。

它「不是」什麼

常見誤解實際
有真實世界知識庫可查參數裡「壓縮」了訓練資料的模式,不是資料庫
會「思考」再回答沒有獨立推理引擎;是條件式文字生成
永遠說實話目標是產出流暢合理的續寫,不是保證正確
記得你上週說的話除非你把歷史塞進上下文視窗

Token 與上下文視窗(Context Window)

原理

  • Token:模型讀寫的最小單位(可能是字、字片段或英文子詞)
  • 中文「你好」可能 2~4 個 token;英文 “hello” 常 1 個
  • 上下文視窗:一次能「看見」的 token 上限(如 8K、32K、128K)
flowchart LR
  SYS["System Prompt"] --> CTX["上下文視窗<br>有限長度"]
  HIST["對話歷史"] --> CTX
  RAG["RAG 檢索段落"] --> CTX
  USER["使用者問題"] --> CTX
  CTX --> OUT["模型續寫輸出"]

模型越大、context 越大,本機 RAM/VRAM 需求越高

Transformer 直覺

Attention(注意力)

Transformer 問的是:當前要預測下一個 token 時,應該「多看」輸入裡的哪些位置?

  • 「它」可能指向前文的「蘋果」或「公司」
  • Attention 讓模型建立長距離依賴,比舊 RNN 更能處理長文

為什麼模型有「參數量」?

規模約略意義本機可行性
7B70 億參數,教學與 Tool 常用16GB RAM 可跑(量化後)
13B~70B更強推理與知識需較大 VRAM 或雲端
MoE(混合專家)總參數大,每次只啟用部分Ollama 部分模型支援

參數 = 模型在訓練中學到的權重;不是「記住的 Wikipedia 條目數」。

模型怎麼來的?

預訓練(Pre-training)

  • 餵海量文字(網頁、書、程式碼…)
  • 任務:下一個 token 預測
  • 產出「基礎模型」,會續寫但未必聽話、未必安全

微調(Fine-tuning)

  • 用較高品質、任務導向資料繼續訓練
  • 例:指令遵循、程式碼、繁體中文加強
  • qwen2.5:7b-instructinstruct 即經過指令微調

對齊(Alignment)

  • RLHF / DPO 等:讓輸出更符合人類偏好(有禮貌、少毒性、較安全)
  • 解釋了為什麼商業模型常「拒絕」某些請求
flowchart LR
  A["預訓練<br>會寫"] --> B["微調<br>會聽指令"]
  B --> C["對齊<br>更像助理"]
  C --> D["你用的 chat 模型"]

推理參數 — 控制「隨機性」

生成時不是完全確定性;常見旋鈕:

參數低值效果高值效果建議場景
temperature保守、重複性高創意、發散Tool 選擇用 0.1~0.3;寫作用 0.7~0.9
top_p只在高機率 token 中選詞彙更豐富與 temperature 二擇一調即可
max_tokens輸出短輸出長控制成本與截斷
stop sequences遇到特定字停止結構化輸出

模型每一步對詞彙表有機率分布;temperature 把分布「壓扁或拉尖」,再抽樣下一 token。

自訂模型設 Temperature: 0.3,就是降低胡亂發揮,讓「Next.js 助教」風格穩定。


幻覺(Hallucination)與 RAG

幻覺是模型產出流暢但錯誤的內容:假論文、假股價、假 API。它優化的是「像真的」,不是「查證過」。

RAG(Retrieval-Augmented Generation) = 生成前先檢索你的文件,把相關段落塞進 prompt。

sequenceDiagram
  participant U as 使用者
  participant W as Open WebUI
  participant V as 向量庫
  participant L as LLM
  U->>W: 問題
  W->>V: 向量相似度搜尋
  V-->>W: Top-K 段落
  W->>L: Prompt = 系統提示 + 段落 + 問題
  L-->>W: 依據段落的回答
  W-->>U: 顯示(可附引用)

RAG 三步

  1. 切片 + Embedding:文件 → 向量
  2. 檢索:問題向量找最近鄰
  3. 增強生成:LLM 只負責「讀給它的材料」做摘要回答

限制

  • 文件爛 → 答案爛(Garbage in, garbage out)
  • 檢索錯段落 → 答非所問

不能取代 Tool:即時股價、寫檔仍要 API / Python

從 LLM 到 Agent — Tool Calling

純 LLM vs Agent

純 LLMAgent(+ Tools)
能力只產生文字可觸發外部動作
例子解釋什麼是 PE 比真的去查 2330.TW 股價
風險幻覺數字Tool 執行錯誤需處理

Function Calling 原理

  1. 每個 Tool 有 名稱、參數 schema、說明
  2. 模型輸出結構化 JSON:{"name": "get_stock_price", "arguments": {"ticker": "2330.TW"}}
  3. 執行環境(Open WebUI / LangChain)跑函式,結果字串塞回上下文
  4. 模型再組織成自然語言

Agent 運作迴圈(ReAct 模式)

flowchart TD
  Q["使用者問題"] --> T["Thought 思考"]
  T --> A["Action 選擇工具"]
  A --> O["Observation 觀察結果"]
  O --> D{"任務完成?"}
  D -->|否| T
  D -->|是| R["回覆使用者"]

Agent 不是「問一句答一句」,而是:

  1. 思考下一步要做什麼
  2. 行動呼叫工具(寫檔、讀檔、呼叫 Notion API)
  3. 觀察工具回傳結果
  4. 重複直到任務完成

本地 vs 雲端

方案優點缺點
本地(本講義)隱私、免 API 費、可客製需自行管理模型與硬體
雲端 API能力強、免裝模型按量計費、資料上傳

Ollama 與本機推理 — LLM 原理的落地

本機跑的是同一套數學

Ollama 不是「簡化版 ChatGPT」,而是把同款 Transformer 權重載入記憶體,在你的 CPU/GPU 上做自迴歸生成

概念雲端 APIOllama 本機
模型廠商伺服器上的權重~/.ollama/models 裡的檔案
推理他們的 GPU你的 RAM/VRAM
隱私請求上傳預設不出機房
成本按 token 付費硬體與電費

量化(Quantization)直覺

  • FP16 權重大 → 慢、吃記憶體
  • Q4_K_M 等量化 → 權重壓縮,略損精度,大幅降 RAM
  • 這就是為什麼 7B 能在筆電跑起來

Open WebUI 在架構中的位置

Open WebUI 不訓練模型;它負責:對話管理、RAG、Tool 編排、把請求轉給 Ollama API。

flowchart TB
  U["使用者"] --> OW["Open WebUI<br>編排層"]
  OW -->|HTTP API| OL["Ollama<br>推理引擎"]
  OL --> M["權重檔<br>qwen2.5:7b"]
  OW --> RAG["向量庫 RAG"]
  OW --> TOOL["Python Tools"]

延伸閱讀