# 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 個)