語意快取:相似問題直接回舊答案,可以嗎
語意快取能省下大量成本,但誤命中的代價很高。要有明確的適用邊界。
精確字串快取的命中率通常很低,因為使用者不會問一模一樣的話。語意快取改用向量相似度判斷「問的是不是同一件事」,命中率高得多——但也可能把不同的問題誤判成同一個。
基本流程
def ask(q):
v = embed(q)
hit = cache.search(v, top_k=1)
if hit and hit.score >= THRESHOLD:
return hit.answer, {'cached': True, 'score': hit.score}
ans = call_model(q)
cache.insert(v, q, ans)
return ans, {'cached': False}門檻要保守
相似度門檻設得越低,命中率越高,誤命中也越多。建議從很嚴格開始(例如 0.95 以上)再慢慢放寬,並且人工檢視一批命中案例確認合理。
適合與不適合
- 適合:FAQ 型問答、產品說明、固定知識查詢。
- 不適合:帶有具體參數的查詢(「我的訂單」「這個月的報表」)。
- 不適合:需要即時資料的問題。
- 不適合:對話中的追問,因為上下文不同答案就不同。
快取鍵要包含情境
只用問題文字當鍵是常見錯誤。使用者身分、語言、模型版本、提示版本都應該納入,否則會出現「A 使用者看到 B 使用者的答案」這種嚴重問題。
含個人資料的答案不要進共用快取。要嘛完全不快取,要嘛快取空間依使用者隔離。