對應原題(Common ‧ RAG and Retrieval)

  • What is HyDE (hypothetical document embeddings) and when does it outperform standard dense retrieval?
  • How does agentic RAG differ from standard RAG, and when is the extra complexity justified?

🎯 什麼情境該想到我

當你「索引沒問題、reranker 也上了,但使用者就是搜不到」的時候。這時瓶頸往往不在索引端,在查詢端。

⚙️ 怎麼用

★ 根本問題:查詢與文件的不對稱

使用者查詢答案文件
長度5–15 字200–500 字
句型疑問句、口語陳述句、書面
用詞日常說法(「連不上」)專業術語(「TLS 握手逾時」)
脈絡隱含(多輪對話裡是代詞)完整

embedding 模型要把這兩種東西映到同一個空間附近,天生就難。
→ 索引端的解法是加脈絡(見 切塊與文件解析);查詢端的解法就是這一頁。

查詢改寫的階梯

#手法做什麼成本
1正規化 / 指代消解「它支援嗎?」→「OAuth 2.0 支援 refresh token 嗎?」1 次小模型呼叫
2多查詢擴展生成 3–5 個不同說法的變體,各自檢索,用 RRF 合併N 次檢索
3查詢分解「A 和 B 哪個便宜」→ 拆成「A 的價格」「B 的價格」N 次檢索 + 合成
4Step-back先問更抽象的問題(「這個錯誤怎麼修」→「這個模組的錯誤處理機制」),把背景一起撈回來2 次檢索
5HyDE先讓 LLM 編一篇假答案,用假答案去檢索1 次 LLM 生成

★ 第 1 項是多輪對話 RAG 的必做項,而且最常被忽略。
使用者第三輪說「那這個要怎麼設定?」——把這句原樣丟去檢索,等於什麼都沒查。
很多「多輪對話 RAG 很爛」的專案,真正的 bug 只是沒做指代消解。

★ HyDE:用假文件去搜真文件

Gao et al., 2022 — Precise Zero-Shot Dense Retrieval without Relevance Labels

使用者:「為什麼我的 Go 服務記憶體一直漲?」
   │
   ▼  ① 叫 LLM 寫一篇假想的答案文件(不檢索,純編)
「Go 服務記憶體持續成長常見於 goroutine 洩漏。當 goroutine 阻塞在
 未關閉的 channel 上⋯可用 pprof 的 goroutine profile 檢查⋯」
   │
   ▼  ② 用這篇假文件的 embedding 去檢索(原查詢丟掉)
   ▼
真實文件:「Go 記憶體洩漏排查指南」✅

★ 為什麼「假的」反而有效:

它把「問題空間」映射到「答案空間」。
假文件就算事實全錯,它的形狀是對的——長度、句式、術語密度、領域詞彙都和真正的答案文件相似。
而 embedding 相似度捕捉的主要就是這種分布層面的相似,不是事實正確性。

換句話說:HyDE 是免訓練的 query→document 空間轉換器。 原本要靠標註資料微調 retriever 才能學到的對齊,它用一次 LLM 呼叫換到。

什麼時候勝過標準 dense:

  • ✅ Zero-shot / 沒有標註資料可以微調 retriever(這是論文的主場)
  • ✅ 使用者用語與文件用語落差大(口語 vs 專業、客服 vs 技術文件)
  • ✅ 查詢很短、很模糊
  • ✅ 模型對該領域有常識(能編出形狀正確的假文件)

什麼時候不要用:

  • ❌ 查詢本身已經是關鍵字或識別碼 —— ERR_4012 不需要擴寫,直接 BM25(見 稀疏與密集檢索)
  • ❌ 模型對該領域一無所知 —— 編出來的假文件會把檢索帶向錯誤的方向,比原查詢更糟
  • ❌ 延遲敏感 —— 多一次 LLM 生成,直接加在 TTFT 上
  • ❌ 已經有足夠標註資料微調 retriever —— 微調過的 retriever 通常更好且更便宜

實務折衷:

  • 生多篇假文件取平均 embedding,降低單篇的隨機偏差
  • 把假文件的 embedding 和原查詢的 embedding 加權平均,保留原意不跑偏
  • 只對「長的、模糊的、自然語言的」查詢啟用——用一個分類器路由

🤖 Agentic RAG

和標準 RAG 的差別

標準 RAG(固定管線)
  查詢 → 檢索一次 → 生成一次 → 答案
  ★ 步數固定、延遲可預測、好評估

Agentic RAG(模型自己決定)
  查詢 → ┌─ 要不要檢索?(有些問題不需要)
         ├─ 該查哪個來源?(文件庫 / SQL / 網路 / API)
         ├─ 查什麼?(自己構造查詢)
         ├─ 查回來的夠嗎?(自我評估)
         └─ 不夠 → 換個查法再來一次 ──┐
                                      └──▶ 答案
  ★ 步數不定、延遲不可預測、難評估

常見形態:

形態做什麼
路由依查詢意圖選資料源(產品文件 / 工單系統 / 網路搜尋)
Self-RAG模型自我評估「這段相關嗎」「我的答案有被支持嗎」,不合格就重來
Corrective RAG (CRAG)檢索品質評分過低就 fallback(例如改用網路搜尋)
多跳 / ReAct 式用上一輪的結果構造下一輪的查詢(見 ReAct 與 Agent Loop)
查詢規劃先拆解出子問題與相依關係,再依序執行

★ 最小可行版:一個檢索工具 + 一個「夠不夠」自檢環

(補充自 https://juejin.cn/post/7690218295266066441,查證 2026-09-28)

上表五種形態容易讓人以為 agentic 要「重裝備」。實務上八成收益來自最便宜的那一段:

檢索 → 問模型「這些夠不夠回答?」
        ├─ 夠 → 作答
        └─ 不夠 → 改寫查詢,再查一次(設上限,通常 2–3 輪)

這就是 CRAG 的輕量版:一個檢索工具 + 一個自檢環,不需要多智能體、不需要路由器。

★ 工具堆多了反而亂。先加自檢環量一輪,再決定要不要往上加路由與規劃。

分類與訓練路線的完整整理 → Agentic Retrieval-Augmented Generation: A Survey on Agentic RAG,arXiv 2501.09136(2025-01,已查證存在)。

★ 什麼時候值得付這個複雜度

先量清楚「單輪 RAG 在哪些查詢上失敗」,再決定。

失敗原因該做什麼
沒撈到(recall 低)❌ 不是 agentic 的問題 → 修切塊、加 hybrid、加查詢改寫
撈到但排序爛❌ → 加 Reranker 重排序
需要組合多份文件才能回答(多跳)✅ agentic 值得
不同查詢需要不同資料源✅ 路由值得
有些查詢根本不該檢索(閒聊、算數)✅ 值得(而且省錢)
答案需要驗證(高風險領域)✅ 值得

★ 最常見的錯誤是「檢索品質不好,就上 agentic RAG」。
讓模型查五次爛檢索,不會比查一次好檢索更準——只會慢五倍、貴五倍,而且更難除錯。

面試答法:「我會先做失敗分析,把單輪 RAG 的錯誤分成『沒撈到/排錯/本質上需要多跳』三類。
只有第三類是 agentic 能解的。前兩類上 agentic 是用複雜度掩蓋基礎問題。」

代價(要能講出來)

  1. 延遲不可預測 —— 2 步或 8 步差很多,SLO 很難訂
  2. 成本不可預測 —— 必須設步數與 token 預算上限(見 ReAct 與 Agent Loop)
  3. 評估變難 —— 不再是「檢索對不對」,而是整條軌跡對不對
  4. 新的失敗模式 —— 無限重查、越查越偏、自我評估過度樂觀
  5. 除錯需要完整 trace —— 沒有可觀測性就等於瞎

⚠️ 注意 / 什麼時候不適用

  • 查詢改寫會丟失資訊。改寫後一定要同時保留原查詢去檢索一次,用 RRF 合併——避免改寫本身變成新的失敗點。
  • 改寫與 HyDE 都增加 TTFT。可以用小模型(Haiku 等級)做改寫,成本與延遲都低一個量級。
  • 多查詢擴展會放大檢索成本(N 倍的向量搜尋)。要確認向量庫撐得住。
  • HyDE 的假文件不可以進入最終答案。它只用來算 embedding,絕不能被模型當成證據——這是很危險的 bug。
  • Agentic 的自我評估常常過度樂觀。「我覺得資料夠了」這個判斷本身需要被評估。
  • 所有查詢端手法都要能關掉。加一個 feature flag,出事時能立刻退回單純檢索。

🧪 我實際套用的紀錄

  • 2026-09-20:從面試題庫展開。待辦:多輪 RAG 先確認有沒有做指代消解。

🔗 相關