RAG 實戰筆記

RAG 系統的向量儲存選型:Qdrant、MongoDB 與 Redis 的分層協作

2026-06-29 #RAG#Qdrant#MongoDB#Redis#向量資料庫

Qdrant、MongoDB、Redis 在 RAG 系統裡常被誤解為彼此競爭的替代方案——三者現在確實都能做向量搜尋。但實際上它們分屬不同層,理想狀態是接力協作,而非三選一:Qdrant 負責語意檢索、MongoDB 負責文件與 metadata 的真實儲存、Redis 負責快取。這篇整理各自的本命定位、什麼情境該怎麼組合,以及一條務實的演進路徑。

核心觀念:它們不是三選一

在 RAG 系統裡,Qdrant、MongoDB 與 Redis 常被誤解為彼此競爭的替代方案。實際上,它們分屬不同層,各有「本命定位」。雖然三者現在都能做向量搜尋,但在一套成熟的 RAG 系統裡,理想狀態是三者協作:Qdrant 負責語意檢索、MongoDB 負責文件與 metadata 的真實儲存、Redis 負責快取。它們是接力關係,而非競爭關係。

flowchart LR
    Q([使用者提問]) --> R{Redis
快取命中?} R -->|命中| A([直接回傳]) R -->|未命中| D[Qdrant
語意檢索] D --> M[MongoDB
補完原文與 metadata] M --> L[LLM 生成回答] L --> W[寫回 Redis 快取] W --> A

各自的本命定位

Qdrant — 專用向量檢索引擎

Qdrant 只做一件事:高效能的近似最近鄰搜尋(HNSW)。換來的好處是豐富的 payload 過濾、向量量化(quantization)省記憶體,以及水平擴展。對「檢索品質與規模」這一塊,專用引擎通常贏在細節。

缺點是它不是設計來存原始文件的。你會把 chunk 原文與完整 metadata 放在別處,Qdrant 裡只放向量加上少量過濾用欄位。

MongoDB — 文件資料庫,現在也能當向量庫

MongoDB 的本命是存半結構化文件,剛好對應 RAG 裡最雜的那塊:chunk 原文、來源、版本、章節結構、權限標記。

重點更新是:從 MongoDB Community Edition 8.2 起,全文檢索與向量檢索已能直接在資料庫內使用,支援 $search、$searchMeta、$vectorSearch 這幾個 aggregation 階段。這在過去只有 Atlas 雲端版才有,現在自建環境也能用了,而且這些核心向量搜尋階段在功能上與 Atlas 對等(透過獨立的 mongot 二進位運作)。

這代表 MongoDB 可以「一庫到底」:向量、原文、metadata 都在同一處,省掉跨庫同步。代價是它目前仍是 public preview,且在超大規模、極端過濾場景下,調校彈性不如 Qdrant。

這點更新了上一篇裡「自架版 MongoDB 社群版沒有向量搜尋能力」的說法——8.2 起這個限制已經解除,但仍是 public preview,正式上線前建議先在非關鍵系統驗證。

Redis — 快取層,不建議當主向量庫

Redis 確實能做向量搜尋(Redis 8 起 RediSearch 已內建,另有原生 Vector Sets 提供 VADD/VSIM,不需額外 module),但它是記憶體資料庫,所有向量常駐 RAM。一個動輒數十萬到數百萬 chunk 的知識庫全塞進記憶體,成本非常不划算。

所以在 RAG 裡 Redis 的甜蜜點是快取:embedding 快取(同樣文字不重複呼叫 embedding API)、檢索結果快取,以及語意相同問題的 LLM 回應快取。它的價值在「省掉重複的 API 呼叫與檢索」,而不是當檢索主力。

三種選型情境

情境一:架構單純、資料量在百萬 chunk 以下、想少維運一個服務。 直接用 MongoDB 8.2+ 一庫到底最省心,向量與文件同源,少一層同步問題。唯一保留是它還在 preview,正式上線前建議先在非關鍵系統試。

情境二:在意檢索效能、過濾彈性與未來規模。 維持 Qdrant 當專用檢索層,再配一個文件庫存原文。不需打掉重練。

情境三:不論選哪個,Redis 都值得疊上去當快取層。 投入小、回報直接,尤其 embedding 與 LLM 呼叫都是要花錢的(若走 LiteLLM Proxy,每次呼叫都計入用量)。

具體建議

若已把 Qdrant 端對端跑通,不建議換掉。最務實的演進路徑是:Qdrant 維持檢索層,把可能還塞在 Qdrant payload 裡的長原文與完整 metadata 挪到 MongoDB(Qdrant 只留向量 + chunk_id + 少數過濾欄位),再加一層 Redis 快取。三者各司其職,最貼近正式系統的樣子。

技術棧上對 C# 優先的偏好也順:這三者的 .NET client 都很成熟(Qdrant.Client、MongoDB.Driver、StackExchange.Redis)。

唯一要先想清楚的是維運成本。三個服務(都能用 Docker self-host)對一個人維護的專案是負擔。如果要進公司正式環境、且 chunk 規模不大,可認真評估「MongoDB 8.2+ 一庫到底 + Redis 快取」這個兩件式組合,把 Qdrant 的經驗當作理解原理的墊腳石,但生產環境用更少的元件。

關鍵判斷因素:chunk 規模

選型方向很大程度取決於 chunk 規模。百萬以下與千萬以上,建議會明顯不同。

延伸閱讀:向量資料庫與 MongoDB 差在哪?、LangChain 在 RAG 中的角色定位。

Creative Commons 姓名標示 非商業性

本文採用 CC BY-NC 4.0 授權

歡迎轉載與引用,請標明出處(RAG 系統的向量儲存選型:Qdrant、MongoDB 與 Redis 的分層協作 — mur mur);禁止用於商業用途。

商業使用或合作提案,歡迎來信洽談:[email protected]

留言
分享

留言