# NVIDIA Agentic AI 讀書會整合講義(Master Markdown)
本檔案為整合版(單一 Markdown),內容包含 5 門課的讀書會講義、題庫與案例題。
## 目錄
1. [Building RAG Agents With LLMs(8 小時)](#building-rag-agents-with-llms-8-小時)
2. [Evaluating RAG and Semantic Search Systems(3 小時)](#evaluating-rag-and-semantic-search-systems-3-小時)
3. [Building Agentic AI Applications With LLMs(8 小時)](#building-agentic-ai-applications-with-llms-8-小時)
4. [Adding New Knowledge to LLMs(8 小時)](#adding-new-knowledge-to-llms-8-小時)
5. [Deploying RAG Pipelines for Production at Scale(8 小時)](#deploying-rag-pipelines-for-production-at-scale-8-小時)
---
## Building RAG Agents With LLMs(8 小時)
> 來源:`01_course_rag_agents/guide.md`
# Building RAG Agents With LLMs(讀書會版講義)
> 目的:用「可上線」的視角建立 RAG Agent。重點不是會做,而是:可回放、可稽核、可維運、可擴展。
> 建議用於 Week 1/Week 7(RAG 與平台串接)與 Capstone 的骨幹。
---
## 0. 考點對齊(你要用來排除陷阱選項)
高命中考點通常長這樣:
- 你如何設計 RAG pipeline 以支援 **版本化、可回放、可追溯引用**?
- 你如何處理 **失效模式**:檢索不到、檢索不相關、資訊過期、引用錯誤?
- 你如何做 **評估閉環**:離線→線上→再調整(chunk/embedding/rerank/prompt)?
- 你如何加上 **guardrails**(含:工具越權、資料外洩、防 prompt injection)?
---
## 1. 參考架構(推薦用於出題/互審)
### 1.1 典型 RAG Agent 模組
1) Ingestion:資料蒐集、清理、去重、版本標記
2) Chunking:切塊策略 + metadata
3) Embedding:向量化 + 索引
4) Retrieval:top-k + filter(tenant/時間/權限)
5) Re-ranking:提升 precision(避免「看似相關」的誤檢索)
6) Generation:回答+引用+信心/不確定性
7) Guardrails:輸入/輸出/工具/資料外洩
8) Observability:trace/log/metrics(用於回放與事故回溯)
9) Evaluation:離線資料集 + 線上監控 + 錯題分類表
### 1.2 必備的「可回放」欄位(很常考)
每次問答至少留:
- `trace_id`
- `index_version`(或 knowledge snapshot id)
- `retrieval_query`、`top_k`、`filters`
- `retrieved_doc_ids`(含段落位置)
- `rerank_model/version`
- `prompt_template_version`
- `policy_decision`(允許/拒絕/轉人工)
> 原因:沒有這些,你無法重現同一題,也無法做 A/B 評估或事故回溯。
---
## 2. Chunking(偏難高命中)
### 2.1 Chunking 不是越小越好:你要在「召回 vs 精準」之間取捨
- chunk 太小:recall↑但 precision↓,rerank 壓力上升、成本上升
- chunk 太大:precision↑但「關鍵句被稀釋」、上下文塞不進模型
### 2.2 可操作的設計規則(可出題)
- 以「語意邊界」切:標題/小節/條列/表格(不要只用固定字數)
- metadata 必備:來源、日期、版本、部門/租戶、敏感等級、段落座標
- 對表格:優先做「表格→結構化」再 embedding,避免語意崩壞
### 2.3 常見陷阱選項
- 只改模型大小、不改 chunking 與 rerank
- 只用 top-k,沒有 filter / rerank / freshness 控制
---
## 3. Retrieval 與 Re-ranking(用失效模式來記)
### 3.1 4 大失效模式(考試最愛)
1) 檢索不到(recall 低)
2) 檢索到但不相關(precision 低)
3) 檢索到但過期(freshness/版本一致性)
4) 引用錯誤(citation mismatch:引用段落與結論不一致)
### 3.2 失效模式→優先修正順序(可直接背成診斷 Playbook)
- 檢索不到:先查 query rewrite / chunking / embedding model / top-k
- 不相關:先加 rerank、再調 metadata filter、最後才調 prompt
- 過期:先做版本化與時間 filter、再做增量更新策略
- 引用錯誤:強制「引用再生成」或「先摘要後回答」,並做 citation-check
---
## 4. Guardrails(不要只寫成拒答)
### 4.1 你要防的不是「壞人」,而是「系統性風險」
- Prompt injection:讓模型改規則
- 資料外洩:把不該吐的段落吐出來
- 工具越權:叫工具做不允許的動作
### 4.2 最小可行的 guardrail 設計(可驗收)
- 輸入檢查:敏感資料遮罩(PII)、指令注入 pattern
- 檢索檢查:只允許取用授權範圍(tenant/role filter)
- 輸出檢查:必須含 citation;若無 citation → 降級回答或轉人工
- 工具檢查:工具 contract(schema + 權限),不允許「泛用寫入」工具
---
## 5. 評估(LLM-as-a-judge 要會,但要知道限制)
### 5.1 指標優先順序(出題常用)
1) groundedness/faithfulness(有無被證據支持)
2) citation correctness(引用是否對得上結論)
3) retrieval quality(recall/precision proxy)
4) latency / cost / throughput(上線指標)
### 5.2 Judge 的一致性控制(偏難)
- 固定 rubric(不可每題換標準)
- 盲測(避免 judge 看見系統提示/中間資訊)
- 多評審/多輪投票(降低隨機性)
- pairwise(比較 A vs B)比單一分數穩
---
## 6. 最小 Demo(驗收點)
你可以用任何框架,但驗收點要一致:
1) 能 ingest 1–3 份文件(含版本/日期)
2) 能回答 10 題固定題(含 citation)
3) 能故意做 2 題失效:檢索不到/引用錯誤,並能在 log 裡看出原因
4) 能輸出 `trace_id` 與 `index_version`(可回放)
---
# 題庫(15 題,偏難版)
> 命名建議:Wk1_Name_Qxx 或 Course1_Name_Qxx
## Q01. (版本一致性)
你在 production 的 RAG 系統每天增量更新索引。為了讓評估與事故回溯可重現,下列哪一個設計最合理?
A) 只要更新向量庫即可,因為模型回答會自動變好
B) 在 log 裡保存完整 prompt,其他都不必留
C) 在每次問答記錄 `index_version` 並保留 rollback 能力
D) 增加 top-k 讓檢索更全面即可
✅ 正確答案:C
為何正確:版本化與 rollback 才能重現同一題在不同知識快照下的行為,支援評估與事故回溯。
其他選項為何錯:A 忽略可重現性;B 少了檢索快照與引用;D 不能解決版本漂移問題。
## Q02. (失效模式診斷)
你發現回答內容看似合理,但引用段落與結論不一致(citation mismatch)。優先修正策略應是?
A) 改用更大的 LLM
B) 增加 top-k
C) 加入「引用驗證/引用後生成」的流程或 citation-check
D) 移除引用功能以免出錯
✅ 正確答案:C
為何正確:citation mismatch 是生成端與引用對齊問題,需要加入驗證或重新生成策略。
其他選項為何錯:A/B 不一定解決對齊;D 失去可稽核性,production 風險更高。
## Q03. (chunking 取捨)
同一份政策文件,chunk size 從 500 tokens 改成 1500 tokens 後,recall 下降但 precision 上升。最合理的解釋是?
A) embedding 壞掉了
B) chunk 變大使得檢索回來內容更集中,但容易漏掉分散的小段關鍵資訊
C) rerank 一定會更差
D) LLM 不支援長 context
✅ 正確答案:B
為何正確:chunk 變大通常提升語意聚合但降低細粒度覆蓋,造成 recall 下降。
其他選項為何錯:A/C/D 都不是直接推論。
## Q04. (retrieval 不相關)
RAG 系統檢索到的段落常常「主題相近但答案不在裡面」。你要先做哪一個?
A) 先加 reranking
B) 先把模型換成更大參數
C) 先把所有文件全丟進 prompt
D) 先移除 metadata filter
✅ 正確答案:A
為何正確:這是 precision 問題,reranking 通常是最高性價比的第一步。
其他選項為何錯:B/C 成本高且不一定解;D 可能更不相關。
## Q05. (freshness)
你要回答「最新制度」問題,但文件更新頻繁。下列哪個設計最符合可維運?
A) 每次查詢都重新爬全部資料並重建索引
B) 用版本化索引 + 增量更新 + 查詢時加時間/版本 filter
C) 只加 top-k
D) 把最新資訊寫進 long-term memory 就好
✅ 正確答案:B
為何正確:增量更新搭配版本/時間 filter 才能控成本且可回放。
其他選項為何錯:A 成本不可控;C 無法保證新;D 容易污染記憶且不可稽核。
## Q06. (可回放欄位)
下列哪一組欄位最能支持 debug 與回放?
A) 只有最終答案
B) `trace_id`、`index_version`、`retrieved_doc_ids`、`prompt_template_version`
C) 只有使用者問題
D) 只有 token 數量
✅ 正確答案:B
為何正確:需要同時保存檢索快照與提示模板版本,才能重現流程。
其他選項為何錯:A/C/D 都不足以重現。
## Q07. (工具越權防護)
RAG agent 允許呼叫「建立工單」工具。最合理的防護是?
A) 把工具描述寫得更長
B) 讓模型自己判斷可不可以用
C) 工具 contract 明確 schema + 權限檢查 + 審核節點(必要時 human-in-the-loop)
D) 完全禁用工具
✅ 正確答案:C
為何正確:越權屬系統性風險,需要 contract 與權限機制。
其他選項為何錯:A/B 不可靠;D 失去需求功能。
## Q08. (retry 與副作用)
工具呼叫失敗時要重試,但工具有副作用(例如寫 DB)。最關鍵的是?
A) 把 timeout 設很長
B) 加入 idempotency key / request id
C) 增加 prompt 長度
D) 換成更大模型
✅ 正確答案:B
為何正確:重試會造成重複寫入風險,冪等性是必要條件。
其他選項為何錯:A 不能保證;C/D 不相關。
## Q09. (輸出必含 citation)
在合規/稽核要求高的情境,最合理策略是?
A) 允許無引用回答,因為比較流暢
B) 若無足夠引用,降級回答或轉人工並記錄原因
C) 移除向量庫
D) 只依賴模型內建知識
✅ 正確答案:B
為何正確:可稽核情境要可追溯,無引用時要明確處置並記錄。
其他選項為何錯:A/D 不可稽核;C 不符合需求。
## Q10. (資料外洩)
你使用多租戶資料(不同部門資料隔離),最關鍵的設計是?
A) 讓模型「記得不要洩漏」
B) retrieval 層做 tenant/role filter,並在 log 留下 filter 條件
C) 增加 top-k
D) 用更長 prompt
✅ 正確答案:B
為何正確:資料隔離必須在檢索層落地,並可稽核。
其他選項為何錯:A/D 不可靠;C 無法隔離。
## Q11. (LLM-as-a-judge 限制)
你用 LLM-as-a-judge 評分兩個 RAG 版本,結果不穩定。最合理改善是?
A) 只跑一次就好
B) 固定 rubric + 多輪投票或 pairwise 比較
C) 直接用更大 judge 模型就會穩
D) 移除評估
✅ 正確答案:B
為何正確:一致性控制需要固定標準與多次評估,pairwise 常較穩。
其他選項為何錯:A 不穩;C 不一定;D 失去迭代依據。
## Q12. (retrieval 與 prompt 調整順序)
回答不相關時,你應優先:
A) 先調 prompt 讓模型「更聰明」
B) 先調 retrieval(rerank/filter/chunk)再調 prompt
C) 直接禁用檢索
D) 只增加 top-k
✅ 正確答案:B
為何正確:不相關通常是 retrieval 問題,先修檢索可提升證據品質。
其他選項為何錯:A 常只是掩飾問題;C 不符合 RAG;D 不一定改善 precision。
## Q13. (增量更新策略)
文件每天新增少量內容,最合理的 ingestion 策略是?
A) 每天全量重建索引
B) 只做增量 embedding,並保留版本/回滾策略
C) 完全不更新,靠模型內建知識
D) 把新增內容直接寫入 memory
✅ 正確答案:B
為何正確:增量更新可控成本,版本化支援可回放與 rollback。
其他選項為何錯:A 成本高;C/D 風險高且不可稽核。
## Q14. (監控指標)
下列哪個最能早期發現 RAG 品質退化?
A) 只看 GPU 使用率
B) 只看 token 數
C) 監控「引用率/無引用回答比例」與「使用者回饋」並抽樣做 judge/人工複核
D) 只看 QPS
✅ 正確答案:C
為何正確:品質退化要看 groundedness proxy(引用率)與回饋/抽驗。
其他選項為何錯:A/B/D 是資源或流量,不直接反映品質。
## Q15. (安全降級)
模型遭遇可疑 prompt injection(要求忽略規則並輸出敏感內容)。最合理處置是?
A) 直接照做,避免使用者不滿
B) 先檢索更多資料再輸出
C) 觸發安全策略:拒答/改寫需求/轉人工,並記錄 `policy_decision`
D) 把 system prompt 寫得更長
✅ 正確答案:C
為何正確:注入屬安全事件,需要 policy-driven 處置與稽核記錄。
其他選項為何錯:A/B 會外洩;D 不保證有效。
---
# 案例題(2 題,情境題)
## Case 1:多租戶 RAG + 合規稽核
你要在同一套系統支援 A 部門與 B 部門,資料不可互相洩漏,且需可稽核。請提出:
- retrieval 隔離設計(filter/索引分割/權限)
- logging/trace 必備欄位(至少 5 個)
- 無引用時的降級策略
- 一個你預期會被考的「陷阱選項」與反駁理由
> 以下以「建立工單(寫 DB)+呼叫外部系統(偶發 timeout)」為情境,給一套可落地的設計(偏工程規格書寫法)。
```
## 1) 工具 contract(輸入 / 輸出 / 錯誤碼)
### 1.1 Tool:`create_ticket`
**用途**:由 agent 將使用者自然語言描述轉成結構化工單,寫入 DB,並(可選)觸發外部系統同步。
**輸入(JSON)**
* `request_id` *(string, required)*:冪等鍵(見第 2 節)
* `user_id` *(string, required)*:使用者識別(內部)
* `source` *(string, required)*:來源(web/line/slack/api)
* `title` *(string, required)*:工單標題
* `description` *(string, required)*:工單內容(可含原文)
* `priority` *(enum, optional)*:P0/P1/P2/P3(預設 P2)
* `category` *(string, optional)*:分類
* `labels` *(array[string], optional)*
* `attachments` *(array[{name,url,hash}], optional)*
* `external_sync` *(object, optional)*:
* `enabled` *(bool)*:是否呼叫外部系統(預設 true)
* `system` *(string)*:外部系統代號(如 JIRA/SNOW/ServiceNow…)
* `timeout_ms` *(int)*:呼叫超時(預設 3000)
* `client_context` *(object, optional)*:例如 `client_ip`, `user_agent`, `locale`
* `dry_run` *(bool, optional)*:只驗證不落庫(預設 false)
**輸出(JSON)**
* `status` *(enum)*:`CREATED` | `EXISTING` | `PENDING_EXTERNAL` | `FAILED`
* `ticket_id` *(string)*:內部工單 ID(UUID/ULID)
* `request_id` *(string)*
* `created_at` *(RFC3339 string)*
* `external` *(object)*:
* `sync_status`:`NOT_REQUESTED` | `SYNCED` | `PENDING` | `FAILED_RETRYABLE` | `FAILED_PERMANENT`
* `external_ticket_id` *(string, nullable)*
* `last_error_code` *(string, nullable)*
* `next_retry_at` *(RFC3339, nullable)*
* `message` *(string)*:給 agent/使用者的摘要訊息
**錯誤碼(HTTP / tool error code)**
* `400 INVALID_ARGUMENT`:欄位缺漏、priority 不合法、JSON schema 不符
* `401 UNAUTHENTICATED` / `403 FORBIDDEN`
* `409 IDEMPOTENCY_CONFLICT`:同 request_id 但 payload hash 不一致(疑似重放但內容不同)
* `422 UNPROCESSABLE`:語意不足無法產生必要欄位(例如 title/description 空)
* `429 RATE_LIMITED`:超出配額
* `500 INTERNAL`:DB error、序列化錯誤
* `503 DEPENDENCY_UNAVAILABLE`:外部系統不可用(熔斷開啟或健康檢查 fail)
* `504 EXTERNAL_TIMEOUT`:外部 timeout(可重試)
* `502 EXTERNAL_BAD_GATEWAY`:外部 5xx(多半可重試,視策略)
> 實務上建議:**DB 寫入與外部同步拆成兩個工具**(`create_ticket_db`、`sync_ticket_external`),但若一定要單一 tool,就要回傳 `PENDING_EXTERNAL` 讓 agent 知道「內部已建立、外部尚未完成」。
---
## 2) Idempotency 設計(request id 來源與保存)
### 2.1 request_id 來源(優先順序)
1. **客戶端提供**(最穩):前端/呼叫端生成 `X-Idempotency-Key`(UUIDv4/ULID),同一操作重送必須帶同 key。
2. **平台事件 ID**:若是 Line/Slack/Webhook,有 `event_id/message_id` 可直接使用(天然冪等)。
3. **伺服端生成(不推薦單靠)**:若客戶端無法提供,伺服端可用「使用者+時間窗+內容摘要」生成,但風險是誤判同一請求/不同請求。
### 2.2 保存與約束(DB)
建立一張 **idempotency 表**(或在 ticket 表加 unique constraint)
* `request_id` *(PK/Unique)*
* `user_id`
* `payload_hash`(canonical JSON 後算 SHA-256)
* `ticket_id`
* `status`:`IN_PROGRESS` | `SUCCEEDED` | `FAILED_RETRYABLE` | `FAILED_PERMANENT`
* `created_at`, `updated_at`
* `ttl_expires_at`:保存期限(例如 7~30 天,依商務決策)
* `last_error_code`, `last_error_message`
**流程**
1. 收到請求 → 以 `(request_id)` 做 **唯一寫入/鎖定**
2. 若已存在:
* `payload_hash` 一致 → 回 `EXISTING`+同 ticket_id(冪等命中)
* `payload_hash` 不一致 → 回 `409 IDEMPOTENCY_CONFLICT`
3. 若不存在:插入 `IN_PROGRESS` 後再進行 DB 建單與外部同步
> 關鍵點:**在開始任何副作用之前就先「占位」request_id**,避免並發重送造成雙寫。
---
## 3) retry/backoff 與 circuit breaker 策略
### 3.1 Retry / Backoff(外部系統 timeout/5xx)
**哪些錯誤可重試(Retryable)**
* timeout(504 / EXTERNAL_TIMEOUT)
* 外部 5xx、連線重置、DNS 暫時失敗
* 429(視外部規範:可能要遵守 `Retry-After`)
**不可重試(Non-retryable)**
* 4xx(例如 400/401/403/404/422),除非能自動修正(通常不行)
* `IDEMPOTENCY_CONFLICT`
**建議策略**
* **Exponential backoff + jitter**
* 第 1 次:1s
* 第 2 次:2s
* 第 3 次:4s
* 第 4 次:8s
* 第 5 次:16s
* 上限:60s(或 2 分鐘)
* 最大重試次數:**5 次**(或以總時間上限,例如 2–5 分鐘)
* 若外部回 `Retry-After`:以它為準(仍加 jitter)
**同步 vs 非同步**
* 同步路徑(使用者在等):建議只嘗試 **1–2 次**,再回 `PENDING_EXTERNAL`,其餘交給背景工作(queue/worker)
* 非同步 worker:跑完整重試策略直到成功或判定永久失敗
### 3.2 Circuit Breaker(針對外部系統)
以「外部系統 system」為維度維護 breaker 狀態(可存在 Redis / memory + 分散式一致性視需求)。
**狀態**
* `CLOSED`:正常
* `OPEN`:短期拒絕呼叫,直接回 503(避免雪崩)
* `HALF_OPEN`:放少量探測請求(試水溫)
**觸發條件(範例)**
* 滾動視窗 60 秒內
* 失敗率 ≥ 50% 且樣本數 ≥ 20 → `OPEN`
* 或連續 timeout ≥ 10 次 → `OPEN`
* `OPEN` 維持 30–60 秒後 → `HALF_OPEN`
* `HALF_OPEN` 探測 5 次:
* 成功率 ≥ 80% → 回 `CLOSED`
* 否則回 `OPEN`(再延長 open duration,可做指數延長)
**搭配 bulkhead**
* 每個外部系統設**併發上限**(例如 20)與排隊上限(例如 200),避免外部慢導致內部 thread pool 被塞爆。
---
## 4) 可回放(replayable)的 log 欄位(至少 6 個)
目標:任何一次呼叫都能被重建、重跑、追查,且能串起「agent → tool → DB → 外部」。
建議至少紀錄以下欄位(實務我會放 12+):
1. `timestamp`(RFC3339 + 毫秒)
2. `trace_id`(分散式追蹤,串整條鏈路)
3. `span_id`(每一步)
4. `request_id`(冪等鍵)
5. `user_id`(或 `actor_id`)
6. `operation`(例如 `create_ticket`, `sync_external`)
7. `payload_hash`(canonical payload SHA-256;避免直接落敏感原文)
8. `ticket_id`(內部工單 ID)
9. `external_system`(JIRA/SNOW…)
10. `external_request_id`(呼叫外部時也帶一個,或沿用 request_id)
11. `attempt`(第幾次 retry)
12. `result_status`(SUCCESS/RETRYABLE_FAIL/PERM_FAIL)
13. `error_code` / `error_message`(標準化)
14. `latency_ms`(每次呼叫耗時)
15. `next_retry_at`(若排程重試)
16. `circuit_state`(CLOSED/OPEN/HALF_OPEN 當下狀態)
> 若要「可回放」到能重送外部:除了 hash,通常還需要可安全還原的 payload。做法是把原始 payload **加密存**在 `replay_store`(例如 S3/DB blob),log 只留 `payload_ref`(指到加密物件)+hash。
---
```
## Case 2:索引增量更新造成答案飄移
你在兩週內更新索引三次,使用者抱怨「同一問題答案不一致」。請提出:
- 你如何用 `index_version` 做回放與比對
- 你會先檢查哪 3 個可能原因(freshness/filter/rerank/prompt 版本等)
- 你會如何灰度釋出與 rollback
- 你要新增哪 3 個監控指標(品質 + 維運)
```以下用「兩週內索引更新 3 次,使用者抱怨同一問題答案不一致」來處理,重點放在**可回放、可比對、可灰度、可回滾、可監控**。
---
## 1) 用 `index_version` 做回放與比對(Replay + Diff)
### 1.1 回放(Replay)最小必要條件
每次回答都要在回應紀錄(或工單/對話紀錄)存:
* `dataset_id`
* `index_version`(例如 `v2026_02_01_01` / ULID)
* `as_of_time`(可選,但建議存)
* `retrieval_config_version`(top_k、chunk_policy、filters 版本)
* `rerank_model_version`
* `prompt_template_version`
* `llm_model_version`(含溫度、max_tokens)
**回放做法**
* 使用者抱怨那筆回覆 → 取出當時的 `index_version` 與各版本號
* 用同一組參數重新執行:
`retrieve(query, dataset_id, index_version, as_of_time, filters...) -> passages`
`rerank(passages, rerank_model_version) -> ranked_passages`
`generate(ranked_passages, prompt_template_version, llm_model_version) -> answer`
* 這樣可以判斷「不一致」是來自:檢索(index/filters)變了、rerank 變了、prompt/LLM 變了。
### 1.2 比對(Diff)建議輸出(給工程排查)
同一 query 同時跑兩版(例如 `v1` 與 `v2`):
* **Retrieval Diff**
* Top-K 命中集合交集比例:`Jaccard(topK_v1, topK_v2)`
* 新增/消失的 doc_id、chunk_id 清單
* 每個 passage 的分數差異(retrieval score / rerank score)
* **Generation Diff**
* 引用來源是否一致(doc_id/revision_id)
* Answer embedding 相似度(或關鍵結論一致性規則檢查)
* 關鍵數值/日期/建議是否有衝突(rule-based extract)
> 實務上我會做一支「`compare_answer` 工具」:輸入 query + 兩個 index_version,輸出 retrieval/rerank/generation 的差異報告,讓維運可以直接定位。
---
## 2) 優先檢查的 3 個可能原因(我會先抓這三個)
### 原因 A:**查詢 filter / freshness 的邏輯有變或失效**
常見情境:
* `index_version` 切換後,**預設版本**或 `ACTIVE` 指向錯誤(例如灰度期間不同 user hit 到不同版)
* `as_of_time` 沒有固定,導致「同一問題」在不同時間點取到不同有效 chunk(valid_to/valid_from)
* tenant / category / 權限 filter 漏掉,造成有時候召回到不該看的資料
**先查什麼**
* query log 裡每次請求實際使用的:`resolved_index_version`、`filters_applied`、`as_of_time`
* 向量庫/DB 二次過濾是否一致(有些系統是先向量召回再 DB filter,容易出現差異)
### 原因 B:**rerank 或 chunking 策略改版造成 Top-K 內容漂移**
即使索引內容差不多,只要:
* chunk_policy 改了(512/1024、overlap、分段規則)
* rerank_model 改了(版本更新、參數不同)
* top_k / candidate_k 改了
都可能讓最終輸入給 LLM 的 evidence 變掉,答案就漂。
**先查什麼**
* `chunk_policy_id` 是否在兩週內變更
* `rerank_model_version` 是否在三次更新中有不同
* topK overlap 指標是否突然下降(見第 4 節監控)
### 原因 C:**prompt / LLM generation 設定變了(溫度、模板、引用規則)**
同 evidence 下,仍可能因:
* prompt_template_version 更新
* temperature 從 0.1 → 0.7
* “允許推論/補全” vs “必須引用證據”規則改了
導致答案不一致或更發散。
**先查什麼**
* `prompt_template_version`、`llm_model_version`、`temperature`
* 是否啟用「多樣性解碼 / self-consistency」之類策略
---
## 3) 灰度釋出與 rollback(建議流程)
### 3.1 灰度釋出(Canary)
* 新索引版本先標為 `BUILDING` → 完成後 `CANDIDATE`
* **只讓 5% 使用者**(或指定 internal/test tenant)走 `CANDIDATE`
* 其餘 95% 繼續走 `ACTIVE`
* 灰度期間所有回答必須寫入:
* `resolved_index_version`(實際命中的版本)
* `release_bucket`(canary/control)
**流量切換策略**
* 5% → 25% → 50% → 100%
每個階段必須滿足監控指標未劣化(見第 4 節)。
### 3.2 Rollback(秒級回滾設計)
* `ACTIVE` 指標只是一個「指向版本」的設定(config / feature flag)
* 一旦 canary 指標劣化或抱怨暴增:
* 立即把 `ACTIVE` 指回上一個穩定版 `index_version_prev`
* 新版標為 `DEPRECATED` 或 `FAILED`
* **資料不刪**:保留新版本供離線比對與問題定位
> 這種 rollback 不需要重建索引,只是切「指標」,速度快且風險低。
---
## 4) 新增的 3 個監控指標(品質 + 維運)
我會挑「能直接解釋不一致」且能在灰度決策用的指標。
### 指標 1(品質):**Answer Consistency Rate(跨版本一致性)**
* 對固定的 regression query set(例如 200~1000 題)每天跑:
* `ACTIVE` vs `CANDIDATE`(或 vs 前一版)
* 定義一致性:
* evidence overlap ≥ 某門檻(例如 Top-5 Jaccard ≥ 0.4)且
* answer embedding similarity ≥ 某門檻(例如 ≥ 0.85)或關鍵欄位一致
* 這個指標直接對應「同題不同答」風險。
### 指標 2(品質):**Retrieval Drift(Top-K Overlap / Citation Coverage)**
* 監控 Top-K overlap(同題在不同版本的召回集合差異)
* 同時監控「回答有引用證據」比例(citation coverage)
* 若 overlap 掉很快、引用率下降,通常代表:
* filter 問題、chunking 問題、rerank 問題,或索引品質下降
### 指標 3(維運):**Index Ingest Health(增量更新健康度)**
至少包含:
* `kb_ingest_event` backlog(PENDING 數量、最老事件延遲)
* ingest 成功率 / retry 次數分布
* 向量庫 upsert latency / error rate
* 版本狀態:BUILDING 卡住時間、FAILED 次數
> 這個指標能抓到「更新三次其實有一版不完整」或「增量漏寫」造成的答案漂移。
---
```
---
## Evaluating RAG and Semantic Search Systems(3 小時)
> 來源:`02_course_eval_rag_search/guide.md`
# Evaluating RAG and Semantic Search Systems(3 小時|讀書會版講義)
> 目的:把「評估」做成可重現的工程閉環,而不是只看一個分數。
> 本講義以 **決策題/報表判讀題** 為主,對齊 Agentic AI Professional 常見出題方式:你看到指標與失效模式,要能判斷先動哪個旋鈕(資料/檢索/重排/提示/模型/部署)。
---
## 0. 考點對齊(高命中)
你要能回答以下問題:
1) **離線評估**跟**線上監控**差在哪裡?為什麼離線分數好,線上仍會壞?
2) 看到 retrieval 指標與 latency/cost,如何判斷先改:chunking、embedding、rerank、query rewrite、prompt、或資料品質?
3) 如何建立 **可回放** 的評估:同一題在不同 index_version / prompt_version 下能重現結果。
4) LLM-as-a-judge 要會用,但要懂它的**一致性控制**與**偏差**。
---
## 1. 評估系統的最小可行設計(MVP)
### 1.1 固定題庫(Evaluation Set)
建議先做 30 題(可擴到 100+):
- 10 題:單段落可直接回答(baseline)
- 10 題:跨段落整合/條列整理(需要多 chunk)
- 5 題:時間敏感/版本敏感(freshness)
- 5 題:容易被 prompt injection 誘導(安全)
### 1.2 Golden set(參考證據)
每題至少標註:
- `doc_id`、`span_start/end` 或段落定位
- 允許答案範圍(可接受的同義表述)
- 是否必須引用(通常 production 建議 **必須**)
### 1.3 版本化(可回放的核心)
每次評估(或線上抽樣)都要記:
- `trace_id`
- `index_version`
- `embedding_model/version`
- `rerank_model/version`
- `prompt_template_version`
- `retrieval_filters`(tenant/role/time)
- `policy_decision`(允許/拒絕/轉人工/降級)
> 沒有版本化,你的評估不具可重現性,難以做 A/B、也難以事故回溯。
---
## 2. 指標(偏難但高命中)
### 2.1 Retrieval(Semantic Search)指標
- **Recall@k**:答案所在證據是否出現在前 k 個檢索結果(偏召回)
- **MRR**:第一個正確結果的排名品質(偏排序)
- **nDCG**:多相關等級下的排序品質(偏整體排名)
**常見陷阱:**
- 只看 Recall@k 卻忽略「不相關噪音」:recall 高但 precision 低,RAG 仍會答錯。
- 只看平均值,忽略長尾:少數困難題拖垮體驗(線上更常發生)。
### 2.2 RAG(Answer)指標
建議把答案評估拆成四類:
1) **Groundedness / Faithfulness**:結論是否被檢索證據支持
2) **Citation correctness**:引用段落是否真的支撐該句結論(避免 citation mismatch)
3) **Completeness**:是否漏掉必要條件/例外條款
4) **Freshness**:是否使用正確版本(制度更新題常考)
### 2.3 系統(Production)指標
- latency(p50/p95/p99)、timeout rate
- cost(token/請求、GPU 時間)、QPS、吞吐
- fallback rate、cache hit rate
- 無引用回答比例(groundedness proxy)
- 事件回溯可用率(log/trace 欄位完整性)
---
## 3. LLM-as-a-judge(會考的不是“會用”,而是“會控”)
### 3.1 Judge 風險
- 標準漂移:每次評分標準不一樣
- 位置偏差:看到冗長答案容易誤判「看起來很完整」
- 風格偏差:語氣順暢不等於正確
### 3.2 一致性控制(可出題)
- 固定 rubric(不可每次換標準)
- 盲測(judge 不看 system prompt/中間工具輸出)
- 多輪投票(3–5 次)取中位數或 majority
- **Pairwise**(A vs B)通常比單一分數穩
- 抽樣人工複核(用於校正 judge 漂移)
---
## 4. Debug Playbook(失效模式 → 優先旋鈕)
> 出題最常用:給你一張報表或一段症狀,問你第一步做什麼。
### 4.1 檢索不到(Recall 低)
優先順序:
1) query rewrite(同義詞、關鍵詞補全)
2) chunking/metadata(是否切錯邊界、缺少標題/日期)
3) embedding 模型(語言、領域、長文表現)
4) top-k(最後才加,避免成本爆)
### 4.2 檢索到但不相關(Precision 低)
優先順序:
1) rerank(最高性價比)
2) metadata filter(role/tenant/time/topic)
3) query rewrite(讓 query 更可判斷)
4) prompt(最後再調,避免掩蓋問題)
### 4.3 過期/版本不一致(Freshness 問題)
優先順序:
1) index versioning + time filter
2) 增量更新策略(文件版本標記)
3) 灰度釋出與 rollback
### 4.4 引用錯誤(Citation mismatch)
優先順序:
1) citation-check(引用驗證)
2) 引用後生成(先鎖定證據再生成)
3) 先摘要後回答(避免跨段落亂拼)
---
## 5. 最小驗收(你可以拿來當 Week 4/5 的驗收清單)
- [ ] 有固定題庫(≥30 題)與 golden set
- [ ] 每次跑分會產生可回放記錄(至少包含 index_version、retrieved_doc_ids、prompt_version)
- [ ] 有失效模式分類表(至少 4 類)與對應修正待辦
- [ ] LLM judge 有一致性控制(rubric + 多輪或 pairwise)
- [ ] 有線上抽樣監控(無引用比例、fallback rate、latency p95)
---
# 題庫(15 題|偏難版)
## Q01.(離線 vs 線上)
離線評估分數顯著提升,但上線後使用者抱怨答案變不穩定。最合理的原因是?
A) 離線評估一定不準,應直接取消
B) 線上資料分布與離線題庫不同,且存在漂移與長尾情境
C) 只要把模型加大就會穩定
D) 把 top-k 加到 50 就一定穩
✅ 正確答案:B
為何正確:線上分布、長尾與漂移會讓離線分數無法直接外推。
其他選項為何錯:A 沒有解決;C 可能增加成本但不保證;D 成本暴增且 precision 可能更差。
## Q02.(版本化)
要讓同一題在事故回溯時可重現,最關鍵要記錄的是?
A) 最終答案文字
B) 使用者滿意度分數
C) `index_version` 與 `prompt_template_version`(以及 retrieval/rerank 相關版本)
D) 只記錄 token 數
✅ 正確答案:C
為何正確:沒有版本化就無法回放同一條 pipeline 的行為。
其他選項為何錯:A 不足以重現;B/D 與重現無關。
## Q03.(指標解讀)
你看到 Recall@10 很高,但使用者仍抱怨「常答非所問」。最可能的問題是?
A) 召回太高是壞事
B) Precision 低/需要 reranking 或 filter
C) LLM 太小
D) chunk 太大一定會造成答錯
✅ 正確答案:B
為何正確:召回到“包含答案”不代表前幾段落足夠精準,RAG 仍可能用錯證據。
其他選項為何錯:A 不成立;C 不一定;D 過度武斷。
## Q04.(調整順序)
回答常引用到“相近但不包含答案”的段落。你第一步應該做?
A) 先改 prompt 讓模型更嚴謹
B) 先加 reranking(或改 rerank 設定)
C) 直接改用更大模型
D) 直接移除引用機制
✅ 正確答案:B
為何正確:這是 retrieval precision 問題,rerank 通常最有效率。
其他選項為何錯:A 可能掩蓋問題;C 成本高不保證;D 失去可稽核性。
## Q05.(citation mismatch)
你發現答案引用的段落與結論不一致。最正確的處置是?
A) 增加 top-k
B) 加入 citation-check 或引用後生成流程
C) 讓模型自行“更誠實”
D) 將引用移除以避免錯誤
✅ 正確答案:B
為何正確:citation mismatch 需要機制驗證或重建生成步驟。
其他選項為何錯:A 不對症;C 不可靠;D 破壞稽核。
## Q06.(freshness)
制度更新題常答錯,你應優先:
A) 將所有資料寫入 long-term memory
B) 建立索引版本化與時間 filter,並在 log 記錄 filter 條件
C) 加大模型
D) 只調 prompt 要求“回答最新”
✅ 正確答案:B
為何正確:freshness 問題要從資料版本與檢索條件落地。
其他選項為何錯:A 會污染且不可稽核;C/D 不保證最新。
## Q07.(judge 一致性)
LLM-as-a-judge 分數波動大,最佳改善策略是?
A) 只跑一次
B) 固定 rubric + 多輪投票或 pairwise 比較
C) 改用更大 judge 一定會穩
D) 取消評估
✅ 正確答案:B
為何正確:一致性控制是穩定 judge 的核心。
其他選項為何錯:A 不穩;C 不一定;D 失去迭代依據。
## Q08.(nDCG)
下列哪個情境最適合使用 nDCG 作為檢索排序指標?
A) 只有 0/1 相關的二元標註
B) 有多層級相關(高度相關/部分相關/不相關)且重視排名品質
C) 只看第一個結果是否正確
D) 只看 latency
✅ 正確答案:B
為何正確:nDCG 適用多層級相關與排名折扣。
其他選項為何錯:A/C 可用其他指標;D 不是排序指標。
## Q09.(MRR)
MRR 主要反映什麼?
A) 平均召回率
B) 第一個正確結果出現得有多前面
C) 生成答案的流暢度
D) GPU 使用率
✅ 正確答案:B
為何正確:MRR 取決於第一個正確結果的排名倒數。
其他選項為何錯:A/C/D 無關。
## Q10.(長尾)
線上品質退化通常先反映在哪裡?
A) 平均分數
B) 長尾題(困難/模糊/跨段落/版本敏感)與 p95/p99 延遲
C) token 數一定變少
D) 只要加大 top-k 就能解決
✅ 正確答案:B
為何正確:線上長尾與尾延遲更容易造成體感問題。
其他選項為何錯:A 可能掩蓋;C 不必然;D 成本高且不一定有效。
## Q11.(成本/效能 trade-off)
你要降低成本但不想明顯損失品質。最合理的順序是?
A) 先把 top-k 大幅增加
B) 先做快取(cache)與 rerank/生成的動態策略(只在需要時用重資源)
C) 先把模型換成更大以減少重試
D) 先取消引用
✅ 正確答案:B
為何正確:快取與動態策略能在不破壞架構基礎下控成本。
其他選項為何錯:A 增加成本;C 更貴;D 破壞稽核。
## Q12.(抽樣監控)
下列哪個監控最能早期發現 RAG 品質漂移?
A) GPU 使用率
B) QPS
C) 無引用回答比例 + 使用者負回饋 + 抽樣 judge/人工複核
D) token 平均值
✅ 正確答案:C
為何正確:這些是品質 proxy 與真實回饋的組合,可較早捕捉漂移。
其他選項為何錯:A/B/D 是資源或流量,不直接反映品質。
## Q13.(資料集污染)
你用線上對話紀錄自動生成評估集(synthetic)。最大的風險是?
A) 指標變得更好
B) 測試資料與訓練/調參資料洩漏,導致過度樂觀(data leakage)
C) latency 變快
D) rerank 會自動變強
✅ 正確答案:B
為何正確:資料洩漏會讓離線評估失真,線上不一定能維持。
其他選項為何錯:A/C/D 不相關。
## Q14.(先修什麼)
你同時看到:precision 低、freshness 低、citation mismatch 偶發。最合理的優先順序是?
A) 先修 prompt injection
B) 先修 freshness(版本化/time filter),再修 rerank/filter,最後補 citation-check
C) 先把 top-k 加到 100
D) 先換更大模型
✅ 正確答案:B
為何正確:freshness 影響“用對版本”,rerank/filter 影響 precision,citation-check 解決對齊;這順序最符合風險與性價比。
其他選項為何錯:A 未必是主要症狀;C 成本爆;D 不對症。
## Q15.(可回放需求)
以下哪個做法最不利於可回放與比較?
A) 記錄 index_version
B) 記錄 prompt_template_version
C) 直接覆蓋索引且不保留舊版本
D) 記錄 retrieved_doc_ids
✅ 正確答案:C
為何正確:覆蓋且無版本,無法重現過去行為。
其他選項為何錯:A/B/D 都有助可回放。
---
# 案例題(2 題|情境題)
## Case 1:報表判讀 → 修正優先順序
你拿到一份報表:
- Recall@10:0.82(高)
- 無引用回答比例:18%(偏高)
- 使用者負回饋集中在「答非所問」
- latency p95:偏高
請提出:
1) 你判斷的主要失效模式是什麼?
2) 你第一個要動的旋鈕(rerank/filter/chunk/prompt/cache/佇列)與理由
3) 你要新增哪些回放欄位或監控指標(至少 5 個)
## Case 2:制度更新造成 Freshness 事故
制度在一週內更新兩次,線上出現「同題不同答」爭議。請提出:
1) 你如何建立 index 版本化與灰度釋出/rollback
2) 你如何設計 time filter 與 metadata,避免檢索到舊版段落
3) 你如何安排線上抽樣驗證與 postmortem(含 trace_id)
---
## Building Agentic AI Applications With LLMs(8 小時)
> 來源:`03_course_agentic_apps/guide.md`
# Building Agentic AI Applications With LLMs(8 小時|讀書會版講義)
> 目的:把 Agent 從「會說」做成「可上線的系統」。
> 這門最常被考成:**工具契約、權限邊界、狀態管理、可靠性護欄、可回放與可稽核**。
---
## 0. 考點對齊(高命中)
你要能判斷:
- 什麼情境要用 **ReAct / Plan-Execute / Router / Reflection**?
- tool/function schema 怎麼設計才不會越權、才可測、才可維運?
- retry/backoff/circuit breaker/fallback 何時用?副作用如何避免重複執行?
- memory 何時寫入、何時淘汰?怎麼避免「把錯誤輸出寫進長期記憶」?
- multi-agent 要怎麼分工與協議?衝突怎麼解?
---
## 1. Agent patterns(偏難高命中)
### 1.1 ReAct(Reason + Act)
適用:需要邊做邊看工具回傳、逐步修正的任務(查詢、分段處理)。
風險:容易被 prompt injection 誘導去用不該用的工具;需 tool policy 與審核點。
### 1.2 Plan-Execute(先規劃後執行)
適用:多步任務、需要可回放與可追溯步驟(例如:資料整理→檢核→輸出報告)。
風險:計畫可能不合理;需 validation(限制條件、資源、權限)。
### 1.3 Router(路由/分類器)
適用:多種任務入口(查知識 / 叫工具 / 轉人工 / 安全事件)。
風險:路由錯誤會造成“看似合理但走錯流程”;需觀測與回訓資料。
### 1.4 Reflection / Critic(自我檢核)
適用:高風險輸出(合規、醫療、財務)或需要高可靠度;可當第二層防線。
風險:成本增加;需明確觸發條件(只在不確定/高風險時啟用)。
---
## 2. State 與可回放(考試很愛)
### 2.1 什麼叫 stateful orchestration
不是把所有對話丟進 prompt,而是:
- 你能描述「目前做到哪一步」
- 你能從某個 checkpoint 續跑
- 你能用 trace 回放整個決策過程
### 2.2 最小狀態機(例)
- `S0: intake`(收問題與限制)
- `S1: retrieve`(檢索/資料來源)
- `S2: decide_tool`(是否需要工具)
- `S3: tool_exec`(工具執行/錯誤處理)
- `S4: compose_answer`(含引用/證據)
- `S5: safety_check`(輸出審查/轉人工)
- `S6: done`
### 2.3 可回放欄位(至少)
- `trace_id`、`state`、`state_transition_reason`
- `tool_calls[]`(name, args, response, error_code, duration_ms)
- `policy_decision`(允許/拒絕/轉人工/降級)
- `prompt_template_version`
---
## 3. Tool / Function Contract(核心必考)
### 3.1 為什麼 tool schema = 權限邊界
你不能依賴模型“自律”。必須用工程機制讓“做不到”。
### 3.2 Contract 必備元素
- **輸入**:型別、必填欄位、範圍、正則(避免 prompt injection 變成 tool 參數)
- **輸出**:結構化回傳(讓 agent 可以判斷下一步)
- **錯誤碼**:可機器判斷(例如:TIMEOUT、RATE_LIMIT、PERMISSION_DENIED)
- **權限**:角色/租戶/資源範圍(read vs write)
- **副作用**:標註是否有 side effect,決定重試策略
- **冪等性**:有副作用工具必須支援 idempotency key
### 3.3 常見陷阱(出題用)
- 把所有操作都塞進一個「萬用工具」:容易越權、難稽核、難測試
- 工具失敗只回自然語言:無法做自動化 fallback
- 無限重試:會造成級聯失敗或重複寫入
---
## 4. Reliability(可上線的護欄)
### 4.1 Retry / Backoff
適用:暫時性失敗(網路抖動、短暫過載)。
必備:最大次數、指數退避、jitter、以及 idempotency(若有副作用)。
### 4.2 Circuit Breaker
目的:避免下游故障造成級聯失敗與資源耗盡。
狀態:closed → open → half-open(可出題)
### 4.3 Fallback(降級策略)
- 無法檢索:改成要求更多資訊或轉人工
- 工具不可用:提供只讀替代、或延後處理(建立待辦)
- 模型不確定:要求確認或提供多方案選擇
---
## 5. Memory(偏難高命中)
### 5.1 Session vs Long-term
- session:當次會話上下文、短期狀態
- long-term:跨會話偏好/已驗證知識/使用者設定
### 5.2 Memory write policy(一定要會)
**不可把未驗證的模型輸出寫入 long-term memory**。
建議策略:
- 只寫入「可追溯來源」或「使用者明確確認」的資訊
- 寫入時附 `source`(doc_id / ticket_id / user_confirmed)
- 設 eviction(TTL / LRU)與刪除能力(合規)
---
## 6. Multi-agent(協作與衝突)
### 6.1 何時需要多代理
- 任務可平行化(檢索/比較/風險分析)
- 需要互審(生成者 vs 審核者)
- 需要角色分工(planner/executor/critic/safety officer)
### 6.2 通訊協議(可出題)
- 訊息格式(schema)
- 共享狀態(哪些欄位可寫)
- 衝突解決(仲裁/投票/優先權)
---
## 7. 最小驗收(Week 2/3 很好用)
- [ ] 至少 2 個 agent pattern(ReAct + Plan-Execute)能跑
- [ ] 至少 2 個工具:read-only + write(有副作用)
- [ ] write 工具支援 idempotency key
- [ ] 工具回傳結構化錯誤碼,agent 有 fallback
- [ ] 記錄 trace_id + tool_calls + policy_decision,可回放
---
# 題庫(15 題|偏難版)
## Q01.(Pattern 選擇)
你要做一個多步驟任務:先讀資料、再叫工具建立工單、最後產出可稽核報告。最適合的 pattern 是?
A) 單一 LLM 呼叫
B) Plan-Execute(含狀態機與可回放)
C) 只用向量庫檢索
D) 隨機選工具
✅ 正確答案:B
為何正確:多步任務需要明確步驟、可回放、可稽核。
其他選項為何錯:A 不可控;C 不含工具/流程;D 不可靠。
## Q02.(Tool contract)
下列哪個最能降低工具越權風險?
A) 把工具描述寫得更長
B) 工具 schema 明確輸入輸出 + 權限檢查 + 審核節點
C) 讓模型自行判斷是否可用
D) 只用 system prompt 禁止越權
✅ 正確答案:B
為何正確:越權需工程落地,不能只靠文字規範。
其他選項為何錯:A/C/D 不可靠且不可稽核。
## Q03.(副作用與重試)
工具有副作用(寫 DB),失敗要重試。最關鍵是?
A) 把 timeout 設長
B) idempotency key / request id
C) 增加 top-k
D) 用更大模型
✅ 正確答案:B
為何正確:避免重試造成重複寫入。
其他選項為何錯:A 不保證;C/D 不相關。
## Q04.(錯誤碼)
工具失敗時回傳自然語言錯誤訊息,不回傳錯誤碼。最主要問題是?
A) 使用者不喜歡
B) agent 無法自動判斷 fallback/重試策略
C) latency 會下降
D) 內容會更短
✅ 正確答案:B
為何正確:需要機器可判斷的錯誤碼做可靠性策略。
其他選項為何錯:A 次要;C/D 無關。
## Q05.(Circuit breaker)
Circuit breaker 最主要解決什麼?
A) 提升模型準確率
B) 防止級聯失敗造成系統過載
C) 增加記憶體使用量
D) 讓 prompt 更長
✅ 正確答案:B
為何正確:斷路器避免連續失敗持續打下游。
其他選項為何錯:A/C/D 不相關。
## Q06.(Stateful orchestration)
下列哪個最符合「可回放」需求?
A) 每次只保留最終答案
B) 記錄 state transition + tool_calls + prompt_version + trace_id
C) 只記錄 token 數
D) 只記錄使用者問題
✅ 正確答案:B
為何正確:回放需要流程、版本與工具呼叫細節。
其他選項為何錯:A/C/D 不足以重現。
## Q07.(Memory 污染)
下列哪個做法最可能造成 long-term memory 污染?
A) 只存使用者確認過的偏好
B) 存可追溯來源的制度條文片段
C) 把模型未驗證的結論直接寫進 long-term memory
D) 存 TTL 限制的短期摘要
✅ 正確答案:C
為何正確:未驗證輸出容易把幻覺固化成“事實”。
其他選項為何錯:A/B/D 有治理策略。
## Q08.(Reflection 觸發)
Reflection/critic 最合理的觸發條件是?
A) 每次都跑,越多越好
B) 只在高風險或不確定度高時觸發(成本可控)
C) 完全不用
D) 只在模型回覆很長時觸發
✅ 正確答案:B
為何正確:平衡可靠性與成本。
其他選項為何錯:A 成本爆;C 降可靠;D 不對症。
## Q09.(Router)
Router 的核心價值是?
A) 讓回答更長
B) 在多流程入口下,做可觀測的路由決策(查知識/叫工具/轉人工/安全)
C) 取代向量庫
D) 取代監控
✅ 正確答案:B
為何正確:路由是把任務導向正確 pipeline,並能監控其錯誤率。
其他選項為何錯:A/C/D 不成立。
## Q10.(多代理通訊)
多代理系統中通訊協議的主要目的為?
A) 增加模型參數
B) 定義訊息格式與協作方式,確保可靠交換資訊與同步狀態
C) 降低記憶體使用
D) 讓 UI 更漂亮
✅ 正確答案:B
為何正確:協作需要一致訊息與狀態同步。
其他選項為何錯:A/C/D 無關。
## Q11.(共享狀態風險)
多代理共享同一份狀態(state store)最大風險之一是?
A) 速度變快
B) 寫入衝突與不可預期覆蓋,導致不可回放
C) token 變少
D) 一定更安全
✅ 正確答案:B
為何正確:共享狀態需鎖/版本或仲裁,否則難以重現與除錯。
其他選項為何錯:A/C/D 不必然。
## Q12.(Fallback)
工具不可用(PERMISSION_DENIED 或 OUTAGE)時,最符合可維運的策略是?
A) 無限重試
B) 直接產生看似合理的答案當作成功
C) 依錯誤碼觸發降級或轉人工,並在 log 記錄 policy_decision
D) 刪除所有 log 以避免洩漏
✅ 正確答案:C
為何正確:可維運需要可觀測、可稽核的降級處置。
其他選項為何錯:A 造成級聯失敗;B 造成幻覺;D 破壞稽核。
## Q13.(最小權限)
下列哪個設計最符合最小權限(least privilege)?
A) 一個工具同時具備讀/寫/刪全部資源
B) 分成 read-only 與 write 工具,並限制資源範圍與角色
C) 讓模型自由選擇任何 API
D) 把權限規則寫在自然語言提示裡
✅ 正確答案:B
為何正確:拆分工具與限制範圍是最小權限的工程落地。
其他選項為何錯:A/C/D 高風險且不可稽核。
## Q14.(可測性)
要讓工具整合可測(unit/integration),最重要的是?
A) 工具回傳結構化資料,且可 mock
B) 工具回傳越長越好
C) 工具完全不需要文件
D) 只測 UI
✅ 正確答案:A
為何正確:結構化回傳與可 mock 是自動化測試的前提。
其他選項為何錯:B/C/D 不足。
## Q15.(安全事件)
偵測到疑似 prompt injection 要求越權使用工具。最合理處置是?
A) 直接照做
B) 先檢索更多資料再照做
C) 觸發安全策略:拒絕/改寫需求/轉人工,並記錄事件與 trace_id
D) 只把 system prompt 加長
✅ 正確答案:C
為何正確:注入屬安全事件,需要 policy-driven 處置與稽核。
其他選項為何錯:A/B 可能越權與外洩;D 不保證。
---
# 案例題(2 題|情境題)
## Case 1:工單工具與冪等性
你要做一個 agent:收到使用者描述後自動建立工單(寫 DB),但外部系統偶爾 timeout。請提出:
- 工具 contract(輸入/輸出/錯誤碼)
- idempotency 設計(request id 的來源與保存)
- retry/backoff 與 circuit breaker 的策略
- 可回放的 log 欄位(至少 6 個)
## Case 2:多代理互審(生成者 vs 審核者)
你設計兩個代理:Generator 產出方案,Reviewer 負責檢核合規與可維運。請提出:
- 兩者通訊協議(訊息 schema)
- 共享狀態的寫入規則與衝突解決(仲裁/投票/優先權)
- 何時轉 human-in-the-loop
- 你預期會被考的陷阱選項與反駁理由
---
## Adding New Knowledge to LLMs(8 小時)
> 來源:`04_course_add_knowledge/guide.md`
# Adding New Knowledge to LLMs(講師授課 8 小時|讀書會版講義)
> 目的:你要能在考題情境下,清楚做出「**應該用 RAG 還是微調**」的工程決策,並能解釋資料治理、版本、評估與風險控制。
> 本講義把新增知識的方法拆成:**檢索式(RAG)**、**參數式(微調)**、**工具式(tool / DB / API)** 三條路徑,並提供可上線的決策矩陣與常見陷阱。
---
## 0. 會考的核心不是名詞,而是「決策」
你要能回答:
1) 這個需求是「**知識新增**」還是「**行為/格式/風格**」?
2) 需要 **可稽核引用** 嗎?資料會更新嗎?
3) 允許把資料放進模型參數嗎(合規/授權/隱私)?
4) latency/cost/SLO 要求是什麼?
5) 失效時要怎麼 rollback?
---
## 1. 三種新增知識路徑(考題常用框架)
### 1.1 檢索式:RAG(Retrieval-Augmented Generation)
**概念:** 知識留在資料層(文件/DB/向量庫),模型在推論時檢索並引用。
**適用:**
- 知識常更新(政策、制度、產品規格)
- 需要引用與可稽核
- 需要權限控管與資料分層(tenant/role)
**風險:**
- 檢索不到、檢索不相關、引用錯誤、版本過期(freshness)
### 1.2 參數式:微調(Fine-tuning / PEFT)
**概念:** 把知識或行為注入模型參數。
**適用:**
- 主要是「行為」:格式一致性、分類、路由、工具選擇策略
- 固定領域語彙與風格(但需可控與可驗證)
- 大量重複模式(例如結構化抽取)
**風險:**
- 知識過期難更新(需重新訓練)
- 可能記住敏感資訊(資料外洩風險)
- 不一定可引用、可稽核性較弱(除非搭配 RAG)
### 1.3 工具式:外部資料源(DB/API/KG)+ Tool calling
**概念:** 知識在權威系統(source of truth),LLM 只負責決策與編排。
**適用:**
- 需要強一致性(庫存、訂單、病歷查詢、權限嚴格)
- 需要交易性與審核(write operations)
**風險:**
- 工具越權與 prompt injection
- 工具失敗需可靠性策略(retry/backoff/circuit breaker/fallback)
---
## 2. 決策矩陣(高命中:RAG vs 微調 vs 工具)
用下表做快速決策(考試常以情境題呈現):
### 2.1 先判斷:是「知識」還是「行為」?
- **知識新增**(facts、規章、內容會更新)→ 先選 **RAG / 工具式**
- **行為校準**(格式、分類、路由、工具選擇)→ 先選 **微調 / 提示工程 / 規則**
### 2.2 需要可稽核引用?資料更新頻率高?
- 需要引用、且更新頻繁 → **RAG(版本化 + time filter)**
- 不需要引用、且相對穩定 → 可考慮 **微調**(仍需合規與資料治理)
### 2.3 合規與授權(決策門檻)
- 若資料有授權/隱私限制,**不適合進參數** → 優先 **RAG + 權限控管** 或 **工具式查詢**
### 2.4 latency/cost 的常見折衷
- 超低延遲、固定問題型態 → 可能偏向 **微調 + 小模型**
- 高正確與可追溯、可接受稍高延遲 → **RAG + rerank + citation-check**
- 強一致性、需交易可靠 → **工具式(source of truth)**
---
## 3. RAG 的「新增知識」工程流程(你要講得出來)
### 3.1 資料準備(ingest)
- 文件切分(chunking):以語意邊界為主,避免把條件與例外拆開
- metadata:版本、日期、來源、權限標籤(role/tenant)
- 索引版本化:`index_version` 必須可回放
### 3.2 檢索與重排
- retrieval:embedding + top-k
- rerank:提高 precision(避免答非所問)
- time filter / version filter:解 freshness
### 3.3 生成與引用
- 引用後生成(先鎖證據再生成)
- citation-check:避免 citation mismatch
- 低信心轉人工:human-in-the-loop
---
## 4. 微調的「新增知識」:你要懂限制在哪裡
### 4.1 微調更擅長什麼
- 結構化輸出(抽取/分類/路由)
- 特定格式與語氣一致性(例如固定報告樣式)
- 工具使用策略(但需配合 tool policy)
### 4.2 微調不擅長什麼(考點)
- 頻繁更新的事實(容易過期)
- 需要引用與可稽核的條文(除非仍搭 RAG)
- 敏感/授權資料(外洩風險)
### 4.3 何時用 PEFT(LoRA 等)
- 資源有限、需要快速迭代
- 希望可 rollback(切換 adapter)
- 仍要搭配評估與版本控制
---
## 5. 安全與治理(Adding Knowledge 的常考陷阱)
- **資料最小化**:只收必要資料
- **可刪除性**:使用者要求刪除/撤回時,參數式難;RAG/工具式較可控
- **權限控管**:RAG 的 retrieval filter / 工具的 RBAC
- **提示注入**:尤其 tool calling 要做 policy gate
---
## 6. 最小驗收(你可以當 Week 7/8 的交付)
- [ ] 有「決策矩陣」:能說清楚為何選 RAG/微調/工具式
- [ ] RAG 有 index_version、time filter、metadata 權限標籤
- [ ] 有 citation-check 或引用後生成流程
- [ ] 微調(若有)有資料治理與避免敏感資訊的機制
- [ ] 失效策略:降級/轉人工/rollback(adapter 或索引版本)
---
# 題庫(15 題|偏難版)
## Q01.(RAG vs 微調)
某制度每月更新一次,且需要在回答中提供可稽核引用。最合適方案為?
A) 直接微調模型把制度背起來
B) RAG(版本化 + time filter + 引用)
C) 只用更大模型
D) 只要求模型「請回答最新」
✅ 正確答案:B
為何正確:更新頻繁且要引用,RAG 最符合可稽核與可更新。
其他選項為何錯:A 過期難更新且有外洩風險;C 不解版本;D 不可靠。
## Q02.(工具式)
你需要查詢即時庫存與下單,且必須符合權限與交易一致性。最佳做法是?
A) 用 RAG 把庫存文件放進向量庫
B) 用 tool calling 查詢權威系統(source of truth),並做 RBAC
C) 直接微調
D) 讓模型自行推測
✅ 正確答案:B
為何正確:即時與交易一致性應由權威系統處理。
其他選項為何錯:A 會過期;C/D 不符合一致性與稽核。
## Q03.(行為 vs 知識)
你要改善輸出格式一致性(固定 JSON schema),且內容本身不常更新。較合理做法是?
A) 先考慮微調/提示工程,並加結構化驗證
B) 一律 RAG
C) 只加大 top-k
D) 只加大模型
✅ 正確答案:A
為何正確:這是行為校準/格式問題,不是知識更新問題。
其他選項為何錯:B 不對症;C/D 無直接關聯。
## Q04.(敏感資料)
若訓練資料含敏感個資,最不建議的作法是?
A) 先做資料去識別與最小化
B) 優先選 RAG/工具式,並做權限控管
C) 直接把資料微調進參數以提升“記憶”
D) 加入存取紀錄與稽核
✅ 正確答案:C
為何正確:把敏感資料寫進參數有外洩與不可刪除風險。
其他選項為何錯:A/B/D 是必要治理。
## Q05.(freshness)
RAG 系統常引用舊版條文,最有效的第一步是?
A) 加大 top-k
B) 建立 index_version 與 time/version filter,並在 trace 中記錄條件
C) 改用更大模型
D) 取消引用
✅ 正確答案:B
為何正確:freshness 需用版本與檢索條件落地。
其他選項為何錯:A 不對症;C 無保證;D 破壞稽核。
## Q06.(PEFT/LoRA)
採用 LoRA 的一個重要好處是?
A) 一定比全參數微調準確
B) 可快速切換/回復(rollback)不同 adapter,降低迭代成本
C) 會自動提供引用
D) 不需要評估
✅ 正確答案:B
為何正確:PEFT 的工程優勢在於快速迭代與可回復。
其他選項為何錯:A/C/D 不成立。
## Q07.(引用與可稽核)
微調後的模型要做到可稽核引用,最常見做法是?
A) 讓模型自行編引用
B) 仍搭配 RAG 或工具式取得證據,並引用後生成
C) 只靠 system prompt
D) 不需要引用
✅ 正確答案:B
為何正確:引用需要外部證據鏈與驗證機制。
其他選項為何錯:A 會產生錯誤引用;C 不可靠;D 不符合題意。
## Q08.(資料更新頻率)
當資料更新頻率極高(每日甚至每小時),較合理的路徑是?
A) 微調
B) 工具式查詢權威系統或即時資料源
C) 只加大模型
D) 只改 prompt
✅ 正確答案:B
為何正確:高頻更新不適合寫進參數。
其他選項為何錯:A 不可維護;C/D 不解更新。
## Q09.(資料集汙染)
將線上輸入直接納入微調資料,最大風險之一是?
A) 模型一定變好
B) 資料洩漏與把錯誤/攻擊內容學進參數(prompt injection 進化)
C) latency 下降
D) 不需要治理
✅ 正確答案:B
為何正確:線上資料可能包含攻擊、錯誤、敏感資訊,需要治理與過濾。
其他選項為何錯:A/C/D 不成立。
## Q10.(chunking)
RAG 的 chunking 若把「條件」與「例外」拆開,最可能導致?
A) Recall 變高
B) Answer completeness 下降(漏掉例外)並導致錯誤結論
C) latency 一定下降
D) 不影響
✅ 正確答案:B
為何正確:語意邊界切錯會造成生成時只看到半套規則。
其他選項為何錯:A/C/D 不必然。
## Q11.(metadata filter)
多租戶(multi-tenant)RAG 中最重要的控制是?
A) 把 top-k 變大
B) retrieval metadata filter(tenant/role)與存取稽核
C) 只用更大 embedding
D) 不需要控制
✅ 正確答案:B
為何正確:多租戶需要權限隔離,避免資料外洩。
其他選項為何錯:A/C 不解權限;D 明顯錯。
## Q12.(rollback)
當 RAG 更新索引後品質下降,最可控的處置是?
A) 直接覆蓋舊索引
B) 以灰度釋出並保留 index_version,可快速切回舊版本
C) 只要求模型更小心
D) 取消檢索
✅ 正確答案:B
為何正確:版本化與灰度釋出讓 rollback 可行。
其他選項為何錯:A 無法回復;C 不可靠;D 失去能力。
## Q13.(何時“真的需要”微調知識)
下列哪個情境最可能需要微調來補強知識?
A) 文件每天更新且要引用
B) 內容高度穩定、同一類問題大量重複,且模型需要在不檢索時也能掌握基本術語與分類邏輯
C) 需要即時庫存
D) 需要權限隔離
✅ 正確答案:B
為何正確:穩定且大量重複模式,微調可提升一致性與效率(仍需合規)。
其他選項為何錯:A 適合 RAG;C 適合工具式;D 需 RBAC。
## Q14.(新增知識的評估)
新增知識後要確認有效,最合理的做法是?
A) 只看單次 demo
B) 建立固定評估集,記錄版本,並同時評估 groundedness/freshness/citation correctness
C) 只看 token 數
D) 只看 latency
✅ 正確答案:B
為何正確:新增知識必須可回放與可量化驗證。
其他選項為何錯:A 不可重現;C/D 不完整。
## Q15.(組合策略)
下列哪個組合最符合「可更新 + 可稽核 + 可維運」?
A) 只微調
B) RAG + tool policy + 版本化 + 監控/回溯
C) 只改 prompt
D) 只加大模型
✅ 正確答案:B
為何正確:可更新與可稽核需資料層與治理機制,並結合工具與監控。
其他選項為何錯:A/C/D 都缺少核心治理。
---
# 案例題(2 題|情境題)
## Case 1:RAG vs 微調決策(制度類)
你要做一個「醫療制度」問答系統:制度每月更新、必須引用條文段落、且不同醫院有不同權限。請提出:
1) 你的決策(RAG/微調/工具式)與理由
2) metadata 設計(至少 6 個欄位,含版本/權限)
3) freshness 的處理(index_version/time filter/灰度)
4) 最小驗收清單(至少 6 項)
## Case 2:格式一致性(抽取/分類)
你要把長文病摘轉成固定 JSON(欄位完整且格式一致),且內容本身相對穩定。請提出:
1) 你會用微調、提示工程、還是兩者混合?
2) 你如何避免敏感資訊被學進參數?(資料治理策略)
3) 你如何建立評估(固定題庫 + 結構化驗證 + 錯誤分類)
---
## Deploying RAG Pipelines for Production at Scale(8 小時)
> 來源:`05_course_deploy_rag_scale/guide.md`
# Deploying RAG Pipelines for Production at Scale(8 小時|讀書會版講義)
> 目的:把 RAG/Agent 從 PoC 做到可上線、可擴展、可維護、可稽核。
> 考試常考「部署決策題」:你要能在 cost/latency/reliability/security 之間做取捨,並提出具體工程措施(SLO、佇列、快取、灰度、rollback、觀測、事件回溯)。
---
## 0. 考點對齊(高命中)
你要能回答:
1) 什麼時候要用 **佇列/非同步**?什麼時候要同步?
2) cache 放哪裡(retrieval、rerank、LLM 回覆)?cache key 怎麼設計?
3) 版本控管與灰度釋出怎麼做(prompt/index/model)?rollback 怎麼做?
4) 觀測(logging/tracing/metrics)要收哪些欄位才可事故回溯?
5) 安全:如何防 prompt injection、越權工具調用、資料外洩?
---
## 1. 上線架構最小切分(可被考成架構題)
典型 RAG pipeline(production):
1) API Gateway(rate limit / auth)
2) Orchestrator(state machine / policy gate)
3) Retrieval service(vector DB + filters + versioning)
4) Rerank service(可選)
5) LLM inference(可自架或託管;要有 timeout)
6) Citation check(可選但很加分)
7) Observability(trace/log/metrics)
8) Feedback & Eval(線上抽樣、離線回放)
> 關鍵:把每一段做成「可替換、可降級」的模組,而不是一個黑盒。
---
## 2. SLO / SLI(常考:要會講 p95/p99)
### 2.1 你至少要定三個 SLO
- latency:p95 < X ms(不同路徑不同 SLO)
- availability:成功率(不含使用者錯誤)
- quality proxy:無引用回答比例、fallback rate、負回饋率
### 2.2 常見陷阱
- 只看平均 latency:尾延遲(p99)才會造成“卡住”的體感
- 只看 QPS:品質漂移不會反映在 QPS
---
## 3. Scaling(擴展策略:先解瓶頸再加資源)
### 3.1 Top bottlenecks(常見)
- 向量檢索:索引大小、filter、跨區延遲
- rerank:算力吃緊
- LLM 推論:GPU、batching、上下文長度
- IO:文件載入、metadata 查詢
### 3.2 擴展策略
- 水平擴展:stateless service + autoscaling
- 佇列:吸收尖峰(burst),避免下游被打爆
- 動態路由:低風險/高命中走快路徑,高風險走慢路徑(加 rerank/critic)
---
## 4. Cache(考試很愛問“放哪裡”)
### 4.1 三層快取
1) **Retrieval cache**:query → retrieved_doc_ids
2) **Rerank cache**:query+candidate → reranked list
3) **LLM response cache**:prompt hash → answer(需注意個資與權限)
### 4.2 cache key 設計(偏難)
至少要包含:
- user/tenant/role(避免跨權限命中)
- index_version(避免過期)
- prompt_template_version(避免不同版本混用)
- query normalization(避免同義不同字造成 miss)
---
## 5. 版本控管、灰度與 rollback(必考)
你至少有三種版本要控:
- **index_version**(資料)
- **prompt_template_version**(提示模板)
- **model_version**(embedding/rerank/LLM)
### 5.1 灰度釋出
- 1% → 5% → 25% → 100%(依風險與監控調整)
- 同步監控:quality proxy + latency + cost
### 5.2 rollback
- index:切回舊版本
- prompt:切回舊模板
- model:切回舊模型或關閉 rerank/critic(降級)
---
## 6. Observability(你要能列出“欄位清單”)
### 6.1 Logging(事件)
- trace_id, user_id/tenant/role(可匿名化)
- index_version, prompt_version, model_version
- retrieved_doc_ids + scores
- tool_calls(若 agent)
- policy_decision(允許/拒絕/轉人工/降級)
- error_code, duration_ms(每段)
### 6.2 Metrics(指標)
- latency p50/p95/p99(分路徑)
- timeout rate、fallback rate、cache hit rate
- cost(token/請求、GPU 時間)
- 無引用回答比例、引用錯誤比例(抽樣)
### 6.3 Tracing(鏈路)
- 讓你能回答:這次慢在哪一段?哪個服務?哪個版本?
---
## 7. Reliability(上線必備)
- timeout(每段都要有)
- retry/backoff(僅針對暫時性錯誤)
- circuit breaker(避免級聯失敗)
- fallback(降級策略)
- idempotency(有副作用工具必備)
---
## 8. Security(常考:prompt injection / data exfiltration)
- tool policy gate:工具白名單 + 最小權限
- retrieval filter:tenant/role/time
- PII 防護:日誌遮罩、cache 不跨權限
- 事件回溯:安全事件要記 trace_id 與決策理由
---
## 9. 最小驗收(你可以當 Week 6/7 的交付)
- [ ] 3 個版本(index/prompt/model)可追蹤與可 rollback
- [ ] 有灰度釋出流程與監控閾值
- [ ] 有 3 層快取策略(至少實作 1 層)
- [ ] 有 SLO/SLI(含 p95/p99)
- [ ] 有完整 observability 欄位清單(可事故回溯)
- [ ] 有安全策略(policy gate + filter + 日誌遮罩)
---
# 題庫(15 題|偏難版)
## Q01.(SLO)
為什麼 production 會更重視 p95/p99 latency,而不是平均 latency?
A) 平均值一定錯
B) 尾延遲決定使用者“卡住”的體感與超時風險
C) p95/p99 比較好看
D) 平均值不能計算
✅ 正確答案:B
為何正確:尾延遲會直接造成 timeout、重試、與體感崩壞。
其他選項為何錯:A/C/D 不成立。
## Q02.(佇列)
下列哪個情境最適合用佇列(queue)?
A) 低延遲即時對話回覆且每次必須同步完成
B) 尖峰流量會打爆下游,允許非同步處理或延後回覆
C) 只為了讓架構更複雜
D) 只要用佇列就不需要監控
✅ 正確答案:B
為何正確:佇列可吸收 burst,保護下游服務。
其他選項為何錯:A 不一定適合;C/D 錯。
## Q03.(cache key)
LLM response cache 的 key 若沒包含 tenant/role,最大風險是?
A) latency 下降
B) 跨權限命中造成資料外洩
C) cost 一定下降
D) 不影響
✅ 正確答案:B
為何正確:cache 命中可能把不該看的內容給另一個權限。
其他選項為何錯:A/C/D 不成立。
## Q04.(版本)
要能事故回溯與比較,最少要記錄哪些版本?
A) 只記 LLM 版本
B) index_version、prompt_template_version、model_version(含 embedding/rerank/LLM)
C) 只記時間
D) 不需要記錄
✅ 正確答案:B
為何正確:RAG 的行為受資料、提示與模型共同影響。
其他選項為何錯:A/C/D 不足或錯。
## Q05.(灰度)
灰度釋出最主要目的是?
A) 讓所有人同時受影響
B) 降低風險,先用小流量驗證品質與成本,再逐步擴大
C) 增加成本
D) 取代測試
✅ 正確答案:B
為何正確:灰度讓問題在小範圍被偵測並可 rollback。
其他選項為何錯:A/C/D 不成立。
## Q06.(rollback)
索引更新後品質下降,最可控的處置是?
A) 直接覆蓋舊索引
B) 切回舊 index_version,並保留問題版本供分析
C) 只改 prompt
D) 取消檢索
✅ 正確答案:B
為何正確:版本化是可回復的前提。
其他選項為何錯:A 無法回復;C/D 不對症。
## Q07.(觀測欄位)
下列哪個欄位最能幫助判斷「答錯是因為檢索還是生成」?
A) retrieved_doc_ids + scores
B) 使用者名稱
C) UI 顏色
D) 只看 token 數
✅ 正確答案:A
為何正確:檢索結果可直接判斷是否找得到/找得準。
其他選項為何錯:B/C/D 無關。
## Q08.(動態路由)
為何要做動態路由(fast path vs safe path)?
A) 讓系統更難維護
B) 在成本與可靠性之間做條件式取捨:高風險才啟用 rerank/critic
C) 讓 prompt 變長
D) 取代快取
✅ 正確答案:B
為何正確:把重資源用在需要的情境,提升性價比。
其他選項為何錯:A/C/D 不成立。
## Q09.(circuit breaker)
circuit breaker 開啟後,最合理的行為是?
A) 繼續狂打下游直到恢復
B) 快速失敗並走 fallback,待 half-open 再試探恢復
C) 直接刪除所有資料
D) 關閉監控
✅ 正確答案:B
為何正確:斷路器用於保護系統並逐步恢復。
其他選項為何錯:A/C/D 錯。
## Q10.(retry)
下列哪種情境不適合重試?
A) 暫時性網路抖動
B) RATE_LIMIT(可退避重試)
C) PERMISSION_DENIED(權限不足)
D) 服務短暫過載
✅ 正確答案:C
為何正確:權限不足是永久性錯誤,重試無用且可能造成噪音。
其他選項為何錯:A/B/D 可視為暫時性。
## Q11.(資料外洩)
多租戶 RAG 中,哪個機制最直接降低資料外洩風險?
A) top-k 變大
B) retrieval filter(tenant/role)與日誌遮罩
C) 更大模型
D) 取消引用
✅ 正確答案:B
為何正確:權限隔離與遮罩是直接控制。
其他選項為何錯:A/C/D 不對症。
## Q12.(成本控制)
要降低成本但不顯著影響品質,最合理做法是?
A) 把 top-k 加到 100
B) 先做 cache + 動態策略(只在必要時 rerank/critic)
C) 只換更大模型
D) 取消監控
✅ 正確答案:B
為何正確:cache 與動態策略通常是最有效的成本槓桿。
其他選項為何錯:A 成本爆;C 更貴;D 風險大。
## Q13.(citation-check)
加入 citation-check 的主要價值是?
A) 讓答案更長
B) 降低 citation mismatch、提升可稽核性
C) 降低 QPS
D) 取代 retrieval
✅ 正確答案:B
為何正確:citation-check 解的是證據對齊與稽核。
其他選項為何錯:A/C/D 不成立。
## Q14.(事件回溯)
postmortem 最需要的關鍵資料是?
A) 只有使用者抱怨內容
B) trace_id + 版本(index/prompt/model)+ 各段 duration/error_code + policy_decision
C) 只有 UI 截圖
D) 只有 GPU 使用率
✅ 正確答案:B
為何正確:事故回溯要能重現與定位瓶頸/錯誤。
其他選項為何錯:A/C/D 不足。
## Q15.(快取風險)
把 LLM response cache 開到最大且不設 TTL/版本,最可能造成?
A) 永遠正確
B) 過期答案長期被重複命中(freshness 事故)
C) 讓系統更安全
D) 取代資料版本化
✅ 正確答案:B
為何正確:快取若不含版本與 TTL,會放大過期問題。
其他選項為何錯:A/C/D 不成立。
---
# 案例題(2 題|情境題)
## Case 1:上線架構與 SLO 設計
你要把一個 RAG 系統上線給 3 家醫院使用(多租戶、權限不同)。請提出:
1) 你的最小架構切分(至少 6 個模組)
2) 你要定義的 SLO/SLI(至少 5 個,含 p95/p99)
3) 你的 observability 欄位清單(至少 10 個)
4) 你的灰度釋出與 rollback 流程(含 index/prompt/model)
## Case 2:尖峰流量與成本暴增
讀書會 demo 後爆紅,尖峰流量讓 LLM 推論成本暴增、p95 延遲飆高。請提出:
1) 你會先加哪一層快取(retrieval/rerank/LLM)與 cache key 設計
2) 你會如何用佇列/動態路由做降載
3) 你會如何設計 fallback(低風險快路徑 vs 高風險慢路徑)
4) 你要新增哪些監控與告警閾值(至少 6 個)