简要介绍语义缓存的基本原理,这是一个更偏业务侧的Technic,通常要结合具体场景制定策略。
概念
语义缓存通常指代一种较为规则的简易记忆机制,典型工作流为
- 存储:将问题-答案对embedding缓存到向量数据库
- 查询:以新问题为key搞相似度检索
- 命中:当找到匹配分数超出阈值的问题后,直接使用缓存的原始答案,不再经过LLM
细节(可以和RAG的选择对比)
- 存储:
- 需要满足低延迟高QPS高频读写
- 典型选择:Redis
- 往往需要权限/租户等业务相关字段,查的时候在filter那里加
- TTL
- 典型的缓存策略:只缓存有价值的问题
- 非时效性问题,非隐私问题,etc
- 长问题(短问题LLM消耗低,缓存性价比就偏低了)
- 热点问题
- LLM回答出现明显问题的问题(“对不起,我无法回答……”)
- ……
- 需要满足低延迟高QPS高频读写
- 查询
- 需要警惕是否确实可以直接以新问题为key,很多时候session是有上下文的
- rewrite,用一个小LLM结合当前session若干历史问答改写问题
- 也可以结合业务制定其他策略
- embedding对否定词不敏感
- 可能需要一个小模型/关键词匹配,在score没有特别高时执行额外判断,传统NLP应该有相当多的工具
- 多语种mismatch
- 用高质量embedding model,要么就统一翻译
- 需要警惕是否确实可以直接以新问题为key,很多时候session是有上下文的
- 命中
- 通常会取很高的score threshold,否则性能要大跳水
- 通常还是要加个后处理,重点是改一下实体(这个NER搞一下好办)或者加一些额外策略。但这里一定要快,通常用轻量规则搞一下就行