RAG 的快取設計:哪些能快取,哪些不能
RAG 有三個可快取的層次,用對了能省下大半成本,用錯了會回傳過期答案。
RAG 每次請求要做嵌入、檢索、重排、生成四件事,全部都可能重複。分層快取是成本優化最快的一步。
三個層次
- 嵌入快取:相同查詢字串的向量,鍵用字串雜湊。最安全,命中即省。
- 檢索結果快取:查詢加上過濾條件的組合,鍵要包含
filter與索引版本。 - 生成結果快取:完整答案,鍵必須包含查詢、片段 id 清單與提示版本。
def gen_cache_key(query, chunk_ids, prompt_ver, model):
raw = json.dumps({
'q': query.strip(),
'c': sorted(chunk_ids),
'p': prompt_ver,
'm': model,
}, ensure_ascii=False, sort_keys=True)
return hashlib.sha256(raw.encode()).hexdigest()什麼不能快取
- 帶有使用者權限過濾的檢索結果——快取鍵沒含權限就會跨帳號外洩。
- 含個人資料的答案,除非快取本身也做了隔離。
- 會隨時間改變的查詢,例如「目前的方案價格」。
失效策略
索引更新時,把索引版本號加一,所有舊鍵自然失效,不必逐筆清除。這比維護精確的失效清單簡單且不易出錯。
快取鍵漏掉提示版本,是很隱蔽的錯誤:你改了提示卻發現「怎麼沒效果」,其實一直在回傳舊答案。