祐成

怎麼設計零伺服器的 QA 系統?從 YAML 知識庫到 Netflix 卡片的啟發

蒸餾精華第 6、9 段講 QA 命名和 YAML 知識庫。我追問了怎麼做誠實的搜尋介面、Netflix 卡片為什麼零多餘,最後畫出了一張 QA 結果卡片的設計。

朱祐成
· 24 分鐘閱讀 · 學習筆記
怎麼設計零伺服器的 QA 系統?從 YAML 知識庫到 Netflix 卡片的啟發
Image courtesy of The Metropolitan Museum of Art, Open Access

弗拉·菲利波·利皮《窗邊的女子與男子肖像》(Portrait of a Woman with a Man at a Casement),約 1440 年。蛋彩、木板。義大利文藝復興早期雙人肖像畫的經典之作,被認為是西方繪畫中最早的家庭肖像之一。現藏於紐約大都會藝術博物館。

你想幫客戶做一個 QA 問答系統,卻被告知「不要資料庫、不要後端、預算為零」。聽起來不可能?其實只要 YAML 檔案加上命令列搜尋工具 rg,你就有了一座零伺服器的知識庫。而 Netflix 的卡片設計——每個元素都經過千萬次 A/B 測試——正好告訴我們 QA 結果卡片該放什麼、不該放什麼。


核心概念:從檔案命名到卡片設計的完整架構

檔案就是資料庫

傳統做法零伺服器做法
MongoDB / PostgreSQL101 個 YAML 檔案
ORM 查詢rg 搜尋(0.1 秒)
新增資料 → INSERT新增一個 .yaml
刪除資料 → DELETE刪掉一個檔案
版本控制 → migrationgit log

關鍵在命名:檔案名稱用問句,不用主題。「什麼是AI-機器學習與深度學習的定義.txt」讓你一眼知道裡面在回答什麼問題,同時讓 rg 搜尋直接命中檔名。

完整流程

使用者輸入問題

搜尋欄(不是聊天框)← 誠實介面:外型等於能力

透明顯示捕捉到的關鍵字 ← 使用者能看到系統「聽到了什麼」

rg 搜尋 YAML 檔案

回傳 QA 結果卡片(Netflix 式設計)

漸進式回饋(👍👎 → 細項 → 自由文字)← 飛輪驅動持續改善

Netflix 卡片 vs QA 結果卡片的映射

Netflix 元素QA 結果卡片設計原則
影片縮圖 + 標題答案摘要(問題 + 前三行)不用點開就知道大概內容
▶ 播放閱讀完整回答最主要的行動
✓ 口袋名單收藏這則 QA正向策展
✕ 移除這不是我要問的負向信號(影響推薦)
👍 三級讚沒幫助 / 有幫助 / 完美解答品味校準
進度條關聯度分數透明顯示匹配程度

Netflix 教我們的不是「做得像 Netflix」,而是:每個元素都要有不可替代的理由。 六個按鈕,六種不同的系統面向,零重疊。


我的追問與發現

Q:YAML 模板有平庸和頂尖之分嗎?

有三個等級。平庸版只有 question + answer,像散落的便條紙。通用版加上 id(帶前綴 SEC-001)、分類、標籤、Markdown 答案、關聯連結——大多數場景的最佳起點。頂尖版再加上 confidence 分數、source 來源標註、analytics 匹配追蹤、changelog 變更紀錄。Claude 的建議:先用通用版啟動,邊用邊加欄位。一開始就用頂尖版,反而因為欄位太多而不想新增知識。

Q:搜尋沒結果怎麼辦?怎麼讓系統越用越聰明?

漸進式回饋 + 三個數字驅動飛輪。第一級:搜尋結果旁只有 👍👎(一秒完成)。第二級:按了 👎 才展開「答案不對 / 太簡略 / 不是我要問的」。第三級:可選的自由文字 + 預約諮詢連結。系統只追蹤三件事:搜尋詞(有無結果)、👍/👎 比例、連續搜尋次數。無結果的搜尋詞 → 新增 QA;👎 多的 → 改善答案;連續搜尋 → 拆成子問題。


你可以怎麼用

  • 建 QA 知識庫:用通用版 YAML 模板建 10 個常見問答,檔名用問句(如 什麼是資安法-適用對象有哪些.yaml),放同一個資料夾,用 rg 搜尋驗證速度
  • 設計搜尋介面:用搜尋欄不用聊天框,透明顯示捕捉到的關鍵字,讓使用者看到系統「聽到了什麼」
  • 拿 Netflix 卡片做 UI 檢查表:每個按鈕問自己「拿掉它,系統會少一個維度的資料嗎?」如果不會,就刪掉

延伸連結


一句話帶走

零伺服器不是限制,是優勢——當你的知識庫是 YAML、查詢引擎是 rg、版本控制是 git,複雜度趨近於零,注意力就能全部放在內容品質上。


📚 完整學習對話紀錄(想看完整脈絡可展開)

原文(蒸餾精華 第 6 段 + 第 9 段)

第 6 段:QA 導向的檔案命名

檔案名稱用問句,不用主題。命名本身就是搜尋的入口。

壞:第一章_人工智慧概論.txt
好:什麼是AI-機器學習與深度學習的定義.txt

第 9 段:YAML 知識庫 + rg 搜尋

101 個 YAML 檔案就是一座知識庫。不需要資料庫,不需要後端,rg(ripgrep)搜尋 101 個檔案只要 0.1 秒。檔案就是資料庫。


Claude 的白話解釋

檔案命名:問句 > 主題

「什麼是AI-機器學習與深度學習的定義.txt」比「第一章_人工智慧概論.txt」好在兩個地方:

  1. 對機器好:語意搜尋時,問句型檔名的關鍵字密度更高。rg "機器學習" 會直接命中檔名,不用打開檔案才知道裡面講什麼。
  2. 對人好:瞄一眼就知道這個檔案回答什麼問題。不用打開、不用猜、不用記。

一個好的檔名,應該讓你不用打開就知道裡面在講什麼。問句型命名天然做到這件事。

YAML + rg:檔案就是資料庫

101 個檔案是不是很多?不是。對 rg 來說,這連熱身都不算。rg 搜尋 101 個 YAML 檔案只要 0.1 秒——比任何資料庫的冷啟動都快。

不需要 MongoDB,不需要 PostgreSQL,不需要任何 ORM。YAML 檔案放在資料夾裡,rg 就是你的查詢引擎。新增知識?新增一個 .yaml 檔。刪除知識?刪掉一個檔案。版本控制?git log

整個系統的複雜度等於零。


我的提問:我的 blog 似乎沒有按照 QA 命名準則吧?

讀完第 6 段,我突然回頭看自己的部落格。19 篇文章,標題長什麼樣?

數位轉型第一步:先有數位身分
品牌信任不是 Logo 好不好看
學習平台到底該怎麼設計

全部都是陳述句。我一邊講 QA 命名有多好,一邊自己的文章全是「主題式命名」。

我直接問 Claude:「我自己的 blog 標題是不是違反了剛才說的原則?」


Claude 的回答:對,16 篇是陳述型,只有 3 篇接近問句型

Claude 掃完我全部 19 篇文章,結論很直接:

  • 16 篇:陳述型(像教科書章節名)
  • 3 篇:接近問句型,但也不夠到位

舉幾個改前改後的例子:

改前(陳述型)改後(問句型)
數位轉型第一步:先有數位身分數位轉型的第一步是什麼?先從數位身分開始
品牌信任不是 Logo 好不好看品牌信任怎麼建立?不只是 Logo 好不好看
AI 工具不是拿來玩的AI 工具該怎麼用才不會只是玩玩?

問句型標題做到兩件事:

  1. 讀者一看就知道這篇回答什麼問題——不用猜、不用點進去才知道
  2. 搜尋引擎更容易匹配——使用者搜尋時通常用問句,標題是問句 = 天然 SEO

我當場就把 19 篇全部改了。不是未來改,是那次對話結束前就改完。


我又追問:融合之前學的誠實介面概念,QA 問答集應該用 Stripe 搜尋欄形式

改完標題之後,我腦子裡開始串東西。

之前在第 4 段(誠實介面)學到一個核心原則:介面的外型就是承諾,能力不到就別用那個外型。 Stripe 的搜尋欄是「良好案例」——放大鏡圖示、單行輸入框、回傳文件連結清單。搜尋的外型 = 搜尋的能力。

現在第 9 段告訴我:YAML 檔案就能當知識庫,rg 就能當查詢引擎。

兩段串在一起,我看到了一個具體的產品:

  • 搜尋欄(不是聊天框)——誠實地告訴使用者:這是搜尋,不是對話
  • 透明顯示捕捉到的關鍵字——讓使用者看到系統「聽到了什麼」
  • 回傳 QA 模板卡片——使用者自己讀,不是 AI 幫你「生成」答案
  • 底層是 YAML 檔案——零伺服器、零資料庫

我跟 Claude 說:「我覺得可以把第 4 段和第 9 段接起來,做成一個真正的產品。」


Claude 的回答:你把四段學習串成了一個完整產品

Claude 說我其實串了四段,不是兩段:

段落貢獻
第 4 段:零 LLM 引擎關鍵字提取 + 模板回應的技術基礎
第 4 段:誠實介面搜尋欄外型 = 搜尋能力,不偽裝
第 6 段:QA 命名檔名即問題,天然可搜尋
第 9 段:YAML 知識庫檔案即資料庫,rg 即查詢引擎

串起來的架構:

使用者輸入問題

搜尋欄(不是聊天框)

顯示捕捉到的關鍵字(透明)

rg 搜尋 YAML 檔案

回傳 QA 模板卡片(使用者自己讀)

Claude 還加了一個我沒想到的增強:當搜不到結果時,讓使用者修正關鍵字。因為關鍵字已經透明顯示了,使用者可以直接看到「系統聽錯了什麼」,自己修正再搜一次。

這比聊天框的體驗更好。聊天框搜不到,你只能換句話說,但不知道系統哪裡沒聽懂。搜尋欄 + 關鍵字顯示,你一眼就看到問題在哪。


我又追問:應該要有動態追蹤機制,像不滿意回饋的飛輪

搜尋做出來了,但怎麼知道使用者滿不滿意?怎麼知道哪些問題缺答案?

我想到之前討論的知識庫飛輪——系統從使用者行為中學習,越用越聰明。QA 搜尋系統也應該有這個機制:

  1. 使用者搜尋但沒結果 → 記錄下來,代表知識庫缺這個主題
  2. 使用者看了結果但按「不滿意」 → 記錄下來,代表答案品質不夠
  3. 使用者連續搜尋同一個主題 → 代表第一次的結果沒解決問題

從這些行為資料,反向工程出「缺少哪些 QA 模板」,然後補上。這就是飛輪。


Claude 的回答:漸進式揭露,Netflix 式三級回饋

Claude 說回饋機制最怕的是「問太多」。使用者搜尋完,你跳出一堆問題問他滿不滿意,他直接關掉。

解法是漸進式揭露(Progressive Disclosure)

第一級:最輕量

搜尋結果旁邊只有兩個按鈕:

👍  👎

大多數人會點其中一個。一秒完成。

第二級:只有不滿意才展開

只有按了 👎 才顯示更多選項:

□ 答案不對
□ 答案太簡略
□ 不是我要問的問題

滿意的人不會被打擾,不滿意的人有管道表達。

第三級:可選的自由文字

勾選完之後,才出現一個小文字框:

想補充什麼?(可跳過)

再下面,一個連結:

想跟真人聊聊?→ 預約諮詢

從最輕(一個按鈕)到最重(預約諮詢),每一步都是可選的。不強迫,不打擾。

只追蹤三件事

Claude 說不要貪多,整個系統只需要追蹤三件事:

  1. 搜尋詞(有結果 / 無結果)——知道知識庫覆蓋率
  2. 👍 / 👎——知道答案品質
  3. 連續搜尋——知道使用者是否真正解決了問題

三個數字就能驅動飛輪:無結果的搜尋詞 → 新增 QA 模板;👎 多的 QA → 改善答案;連續搜尋多的主題 → 拆分成更精確的子問題。


我又追問:Netflix 的卡片元素為什麼這麼精練?

討論到 QA 結果卡片的設計時,我想到 Netflix。Netflix 的影片卡片是全世界被 A/B 測試最多次的 UI 元素之一。每一個按鈕、每一個圖示,都經過幾百萬次測試才留下來。

我打開 Netflix,截了 8 張不同互動狀態的卡片截圖,仔細分析每一個元素:

基本狀態

滑鼠移上去(或手機長按),卡片展開,出現六個操作:

圖示功能設計意圖
▶ Play播放最主要的行動,最大的按鈕
✓ My List加入口袋名單正向策展:「我以後想看」
✕ Not for me從這一排移除負向信號:「別再推薦這類的」
👍 Like喜歡(三級)品味校準:不合胃口 / 喜歡 / 超愛
∨ More info更多資訊展開完整頁面

零多餘

我一開始以為 ✓ 和 ✕ 是相反的操作(加入 / 移除口袋名單)。但仔細看,它們做的事完全不同:

  • ✓ My List:「我想看但不是現在」——正向策展,影響你的清單
  • ✕ Not for me:「這個不適合我」——負向信號,影響推薦演算法

一個影響清單,一個影響演算法。兩個按鈕,零重疊。

三級讚

Netflix 的 👍 不是二元的(喜歡 / 不喜歡)。長按會展開三個選項:

👎 不合我的胃口
👍 我喜歡
👍👍 超愛!

為什麼要三級?因為「喜歡」和「超愛」對推薦演算法的權重不同。如果你對一部紀錄片按了「超愛」,Netflix 會大幅增加同類型紀錄片的推薦比例。只按「喜歡」的話,增加幅度小得多。

三個等級就足以捕捉品味的強度。不多不少。

進度條

已經看過的影片,卡片底部會有一條紅色進度條。這個設計看似簡單,但資訊密度極高:

  • 有進度條 = 你看過
  • 進度 30% = 你可能棄劇了(Netflix 會據此調整推薦)
  • 進度 95% = 你看完了(可以推薦續集或類似作品)

一條紅線,三種判斷依據。


Claude 的回答:Netflix 卡片直接對照 QA 結果卡片

Claude 說 Netflix 卡片的設計可以直接映射到 QA 結果卡片:

Netflix 元素QA 結果卡片對應邏輯
影片預覽(縮圖 + 標題)答案摘要(問題 + 前三行)不用點開就知道大概內容
▶ 播放閱讀完整回答主要行動
✓ 口袋名單收藏這則 QA正向策展:以後還想看
✕ 移除這不是我要問的負向信號:調整搜尋結果
👍 三級讚回饋(沒幫助 / 有幫助 / 完美解答)品味校準
∨ 更多資訊查看相關 QA延伸閱讀
進度條關聯度分數透明顯示匹配程度

關鍵洞察

Netflix 教我們的不是「做得像 Netflix」,而是一個設計原則:每個元素都要有不可替代的理由。

Netflix 卡片上的六個操作,每一個都影響不同的系統面向。沒有兩個按鈕做一樣的事。沒有「裝飾性」的元素。如果拿掉任何一個,系統就會少一個維度的資料。

QA 卡片也該這樣設計:每個按鈕、每個資訊,都要有不可替代的用途。不是為了好看,是為了功能。


我又追問:YAML QA 模板有沒有平庸 / 通用 / 頂尖的案例?

最後我問了一個實作問題:知道要用 YAML 當知識庫了,但 YAML 模板本身怎麼設計?有沒有等級之分?

Claude 給了三個等級:

平庸:扁平結構

question: 什麼是資安法
answer: 資安法全名為資通安全管理法,於2019年施行...

沒有 ID、沒有分類、沒有標籤。搜得到,但無法分類、無法關聯、無法追蹤。像一張散落的便條紙。

通用:結構化

id: SEC-001
category: 法規
tags: [資安法, 合規, 政府]
question: 什麼是資安法?適用對象有哪些?
answer: |
  資通安全管理法(簡稱資安法)於 2019 年 1 月 1 日正式施行。

  **適用對象:**
  - 公務機關
  - 特定非公務機關(關鍵基礎設施提供者)

  **核心要求:**
  1. 建立資通安全管理制度
  2. 通報資安事件
  3. 定期稽核
related:
  - SEC-002  # 資安法罰則
  - SEC-005  # 關鍵基礎設施定義

有 ID(帶前綴,方便識別領域)、有分類和標籤(方便篩選)、答案用 Markdown(方便渲染)、有關聯連結(方便延伸)。這是大多數場景的最佳選擇。

頂尖:帶分析鉤子

id: SEC-001
version: 3
category: 法規
tags: [資安法, 合規, 政府]
question: 什麼是資安法?適用對象有哪些?
answer: |
  (同上)
confidence: 0.95
source:
  - type: official
    url: https://law.moj.gov.tw/...
    retrieved: 2026-03-15
  - type: interpretation
    author: 資安署
    date: 2025-12-01
analytics:
  created: 2026-01-10
  last_matched: 2026-04-01
  match_count: 47
  thumbs_up: 38
  thumbs_down: 3
  last_reviewed: 2026-03-15
  review_cycle_days: 90
changelog:
  - date: 2026-03-15
    change: 更新適用對象,新增特定非公務機關
  - date: 2026-01-10
    change: 初始建立
related:
  - SEC-002
  - SEC-005

多了什麼:

  • confidence 分數:系統對這個答案的信心程度。低於門檻就提醒使用者「此答案可能需要更新」
  • source 來源標註:每個答案附上來源,可驗證。和 Perplexity 的設計精神一致
  • analytics 分析鉤子:追蹤匹配次數、👍👎 比例、最後一次被搜尋的時間。飛輪的數據來源
  • changelog 變更紀錄:知道答案改過幾次、改了什麼。git log 的替代方案
  • review_cycle_days:每 90 天提醒審核。知識會過期,強制定期檢查

Claude 的建議:先用通用版啟動,邊用邊加欄位。 一開始就用頂尖版,反而會因為欄位太多而不想新增知識。先跑起來,再慢慢進化。


我學到的

一個 QA 系統從知識庫(YAML)到介面(搜尋欄 + 卡片)到飛輪(回饋 + 追蹤),可以完全零伺服器、零資料庫、零框架實現。

回頭看整條線:

QA 命名(第 6 段)
  → 檔名即問題,天然可搜尋
    → YAML 知識庫(第 9 段)
      → 檔案即資料庫,rg 即查詢引擎
        → 誠實介面(第 4 段)
          → 搜尋欄外型 = 搜尋能力
            → Netflix 卡片分析
              → 每個元素都要有不可替代的理由
                → 漸進式回饋飛輪
                  → 三個數字驅動持續改善

Netflix 教我們的不是「做得像 Netflix」,而是「每個元素都要有不可替代的理由」。拿掉一個按鈕,系統就少一個維度的資料。加一個沒用的按鈕,使用者就多一秒的遲疑。

零伺服器不是限制,是優勢。當你的知識庫就是一堆 YAML 檔案,你的查詢引擎就是 rg,你的版本控制就是 git,你的部署就是 git push——整個系統的複雜度趨近於零。複雜度趨近於零,意味著你的注意力可以全部放在內容品質上,而不是維護基礎設施。

這才是零框架的真正意義:不是買不起工具,是不需要。