
向量儲存索引損壞:原因、偵測與復原
生產RAG系統中向量儲存索引損壞的診斷與復原實用指南——涵蓋部分寫入、索引期間OOM、版本不匹配以及經過驗證的復原策略。
你的RAG管線一直在正常運作。檢索品質很好,利害關係人很滿意,系統準確地回答著問題。然後,逐漸地或突然地,它停止了運作。曾經回傳相關上下文的查詢現在回傳不相關的片段或什麼都不回傳。LLM開始產生幻覺,因為它使用的是糟糕的上下文——或者根本沒有上下文。
嵌入模型沒有改變。文件還在。問題出在中間環節:向量儲存索引損壞了。
索引損壞是生產RAG中最令人困惑的故障之一,因為其症狀模仿了其他問題。糟糕的檢索結果看起來像是分塊問題、嵌入問題或提示詞工程問題。團隊可能花費數天時間調整錯誤的元件,然後才發現索引本身已經損壞。
本文涵蓋了向量儲存索引損壞的原因、如何系統地偵測它,以及如何在不遺失整個索引的情況下復原。
什麼導致索引損壞
向量儲存索引是複雜的資料結構——HNSW圖、IVF分區或帶有中繼資料映射的平面索引。它們不是簡單的鍵值儲存。當這些結構的內部一致性被破壞時,就會發生損壞。
索引期間的部分寫入
最常見的原因。當你向索引新增新向量時,操作涉及多個步驟:插入向量、更新圖結構(對於HNSW)或分區指派(對於IVF),以及寫入中繼資料。如果過程在寫入中途被中斷——由於當機、部署、容器重新啟動或網路逾時——索引可能處於不一致狀態。
結果:一些向量被插入但未連接到圖,或中繼資料參照指向不存在的向量。搜尋回傳不完整的結果,因為圖遍歷無法到達斷開連接的向量。
索引期間的記憶體不足
大批量索引操作可能超出可用記憶體,特別是當向量數量接近機器能夠保持在RAM中的限制時。當程序被OOM killer終止時,磁碟上的索引檔案可能只寫了一部分。
這對於記憶體映射索引特別危險。作業系統可能已將一些髒頁刷新到磁碟但未刷新其他頁,使索引檔案處於不代表任何單一時間點的狀態。
版本不匹配
向量儲存函式庫在版本之間會演進其磁碟格式。升級函式庫而不遷移索引——或者更糟的是,讓不同的服務使用不同的函式庫版本針對同一個索引——會造成表現為靜默檢索退化而非硬錯誤的損壞。
一個常見場景:開發環境更新到最新函式庫版本,而生產環境保持在之前的版本。在開發環境中建構或修改的索引被部署到生產環境。舊版函式庫部分讀取新格式,遺漏向量或誤解圖的邊。
並行寫入衝突
多個程序在沒有適當鎖定的情況下同時寫入同一個索引是損壞的配方。這比預期更常發生——重新索引作業在應用程式仍在處理寫入時啟動,或兩個工作程序都嘗試從不同的文件批次新增向量。
硬體級故障
磁碟損壞、故障的SSD和不可靠的網路附加儲存可能翻轉索引檔案中的位元。這些故障很少見,但會產生最令人困惑的症狀,因為損壞是隨機的且不遵循任何邏輯模式。
如何偵測索引損壞
偵測是困難的部分。損壞很少以清晰的錯誤訊息宣告自己。相反,你看到的是可能有多種原因的檢索品質退化。
診斷框架
第1步:建立檢索基線。 維護一組具有已知正確預期結果的測試查詢。定期執行這些查詢(每天或每次索引操作後)。如果結果偏離預期,說明有什麼改變了——如果文件和嵌入沒有改變,索引是首要嫌疑。
第2步:檢查向量計數一致性。 比較索引中的向量數量與你的管線產生的分塊數量。如果它們不一致,向量要麼在索引期間遺失,要麼索引由於損壞而丟棄了它們。這是最可靠的單一損壞訊號。
第3步:執行最近鄰健全性檢查。 用一個已經在索引中的向量查詢索引(使用已知分塊的精確嵌入)。最高結果應該是該精確分塊,距離為零(或相似度分數為1.0)。如果不是,索引結構已損壞——圖無法到達它應該包含的向量。
第4步:檢查中繼資料孤兒。 按中繼資料篩選器查詢文件,並將結果與應該存在的內容進行比較。缺失的結果表明向量或其中繼資料映射已損壞。
第5步:驗證索引檔案完整性。 如果你的向量儲存支援,執行內建的索引驗證或修復命令。例如,FAISS沒有內建驗證器,但Qdrant和Milvus公開了報告索引狀態的健康檢查端點。
指向損壞vs.其他問題的症狀
| 症狀 | 可能是損壞 | 可能是其他原因 |
|---|---|---|
| 檢索對曾經有效的查詢回傳零結果 | 是——向量不可達 | 嵌入模型改變 |
| 檢索回傳結果但不相關 | 可能——部分圖損壞 | 分塊策略或提示詞問題 |
| 向量計數低於預期 | 是——寫入期間向量遺失 | 索引管線bug |
| 查詢對最近文件有效但對舊文件無效 | 是——舊索引段損壞 | 重新索引覆寫了舊資料 |
| 間歇性故障(有時有效,有時無效) | 是——部分圖損害 | 網路或資源爭用 |