具代表性的面試主題

後端面試:如何用 Redis Vector Sets 設計可控的混合相似度搜尋?

後端困難
Offer.cc 編輯團隊發佈 更新

題幹

你要用 Redis vector sets 做商品語意檢索,並按租戶、年份和庫存過濾。如何設計寫入、VSIM 查詢、索引容量和結果品質驗證?

題目

你要用 Redis vector sets 做商品語意檢索,並按租戶、年份和庫存過濾。如何設計寫入、VSIM 查詢、索引容量和結果品質驗證?

場景與適用邊界

每個元素有字串 ID、固定維度向量和可選 JSON 屬性。Redis vector sets 使用 HNSW 做相似度搜尋,也支援用 FILTER 對屬性做簡單數學過濾。回答要涵蓋更新、刪除、冷啟動、記憶體上限、跨平台 FP32 編碼和搜尋降級;不要把它描述成自動保證業務級精確召回的黑盒。

面試官考察點

考察你能否把向量召回、結構化約束、資料生命週期和容量治理放在同一套服務契約裡。Redis 文件說明 VADD 可新增或更新元素,VSIM 可按向量相似度查詢,屬性過濾表達式決定候選是否保留;FP32 blob 需要小端位元組序,VALUES 形式可避免跨平台編碼差異。

回答前可以先確認:

  • 向量維度、距離度量、每個租戶的資料量和更新頻率是多少?
  • 過濾條件是強約束,還是允許擴大候選後在應用層補篩?
  • 結果需要 top-k、相似度分數、屬性還是可解釋的過濾原因?
  • 記憶體預算、持久化方式、故障恢復和跨可用區複製如何要求?

30 秒回答框架

先定義 key、元素 ID、向量維度和屬性 schema;再說明 VADD/VSETATTR 寫入與冪等更新、VSIM 的 top-k 和過濾;最後講容量估算、品質基準、不可用時的關鍵字或舊索引回退。

分步驟深入解答

  1. 資料契約:固定維度和模型版本,元素 ID 全域唯一或按租戶分 key,屬性只保存過濾所需欄位。
  2. 寫入路徑:先驗證維度與模型版本,再用冪等 VADD 更新向量,單獨用 VSETATTR 更新屬性;刪除使用 VREM
  3. 查詢路徑:先驗證租戶邊界與過濾表達式,再用 VSIM 請求略大於最終 k 的候選,返回分數和屬性供服務層稽核。
  4. 容量治理:估算向量、HNSW 鄰接和屬性記憶體,設定單租戶上限、淘汰策略與分片;避免把任意大的 JSON 放進屬性。
  5. 一致性與恢復:記錄模型版本和寫入事件,快照/恢復後驗證維度、元素數和抽樣召回;更新失敗不能留下半新半舊的屬性。
  6. 品質與降級:用標註集測 Recall@k、過濾後命中率和 p95 延遲;Redis 不可用或過濾表達式不支援時,切到關鍵字索引或舊版本快照。

高品質示範回答

我會按租戶和模型版本設計 key,元素 ID 保持穩定,向量維度固定。寫入時先驗證維度與模型版本,用 VADD 冪等更新向量,再用 VSETATTR 寫入年份、庫存和租戶屬性;刪除用 VREM。查詢先在服務層驗證租戶條件,再請求略大於 k 的候選:

text
VSIM products:{tenant}:{model} VALUES 3 0.12 0.08 0.44 COUNT 50 WITHSCORES FILTER ".year >= 2024 && .stock > 0"

我會記錄維度、元素數、HNSW 資訊和屬性記憶體,按租戶設定容量上限。基準同時測 Recall@k、過濾後命中率、p95/p99 延遲、讀寫吞吐和恢復時間,並用精確暴力檢索作為品質基線。FP32 跨平台傳輸統一使用小端編碼,或使用 VALUES 避免 blob 位元組序差異。Redis 不可用、過濾不支援或模型版本不一致時,降級到關鍵字檢索或上一版快照,並記錄結果來源。

常見錯誤

  • 只說「用 HNSW 很快」,沒有維度、k、過濾和品質指標。
  • 把屬性過濾當成任意 SQL,忽略表達式能力和租戶隔離。
  • 直接把模型輸出的任意維度向量寫入同一個 vector set。
  • 忽略 FP32 位元組序、屬性 JSON 大小和 HNSW 記憶體成本。
  • 沒有舊索引、關鍵字檢索或快照恢復的降級路徑。

評估時看能否把寫入、查詢、容量、一致性和品質驗證串成閉環,說明 Redis 原生命令的邊界,並給出可量化的降級策略。一般回答停留在「向量資料庫加過濾」,沒有資料契約和運行指標。

追問及應對

為什麼不把所有業務欄位都放進屬性?

屬性參與過濾並消耗記憶體;只保留候選篩選所需欄位,其餘詳情按 ID 從主儲存讀取,避免索引膨脹和隱私擴散。

模型升級導致維度變化怎麼辦?

為新模型建立獨立 key 或版本空間,雙寫並行評估,達到 Recall@k、延遲和成本門檻後切換,不能在同一集合混用不同維度。

過濾條件過嚴導致沒有結果怎麼辦?

先返回明確的零結果原因和指標,按產品允許的優先順序逐步放寬條件或切換關鍵字召回;不能靜默返回不符合租戶或庫存約束的結果。

面試作答要點

一句話總結

把 vector set 當成有明確維度、屬性和容量契約的召回元件,再用品質基線和安全降級保證可控搜尋。

公開來源

同類題目