LangChain 实践4 7-3 缓存系统搭建
阶段目标
新增语义缓存(会话缓存已落地,可见阶段 2 多轮对话记忆能力),降低模型调用成本、提升响应速度。
后端任务
- 统一使用内存缓存:
简易版复用 LangChain 内置缓存,进阶版自研内存缓存 ✅️ - 实现两类缓存逻辑:
精确匹配(LangChain 内置缓存)、语义相似匹配(自研内存缓存)改为 精确匹配和语义相似匹配(自研内存缓存) ✅️ - 配置缓存过期规则,支持自动 / 手动清理 ✅️
LangChain 内置缓存 ❌️
本节使用内存缓存(InMemoryCache),使用方式可见LangChain 缓存
问题
当前项目开启流式输出后,LangChain 内置缓存无法生效,因其仅支持非流式调用。
若要同时保留流式能力、实现精确匹配与语义相似两类缓存,并配置过期及清理规则,需放弃框架自带缓存,在接口层自研内存缓存方案。
自研内存缓存
精确匹配
通过全局字典按 session_id 分组,将用户问题与对应回答一一存储,提问时先判断问题是否完全一致,一致则直接返回缓存答案,否则调用模型并缓存新问答。
语义相似匹配
关键:向量相似度匹配
向量计算可见embeddings
缓存过期与清理
本方案采用惰性清理机制管理缓存过期逻辑,为每一条缓存数据统一设置固定有效时长,数据写入时自动计算并记录过期时间;每次查询缓存时,会先校验所有条目是否超时,自动过滤并移除已过期数据,无需额外开启定时任务,减少系统资源消耗。
同时配套手动清理能力,在聊天界面提供入口,可一键清空当前会话下的全部缓存内容,满足用户重置对话的使用需求。
阶段交付
✅ 可展示缓存命中状态
✅ 接口响应提速
✅ 模型 Token 消耗降低
运行效果
精确匹配
首次提问
页面:明显的流式输出,打字机效果
耗时
再次提问完全相同的问题,系统会直接命中本地缓存,无需调用大模型,几乎瞬时返回结果。
耗时
若提问内容发生变化,系统将无法匹配到有效缓存,会自动重新调用大模型生成全新答案,耗时与首次提问保持一致。
语义相似匹配
用 BGE 向量模型计算出的相似度约为0.803,这个值触发了语义缓存阈值,因此第二次请求直接返回了缓存答案,耗时从 5 秒多降到了 0.3 秒,性能提升非常明显。
缓存过期与清理
缓存过期
缓存有效期设为1分钟。
当用户提问超过 1 分钟后再次输入相同问题时,由于原缓存数据已过期,系统会判定为未命中缓存,转而调用大模型重新生成回答,因此接口耗时与首次提问时的响应时间相近。
缓存清理
点击缓存清理按钮
即使第三次提问发生在首次提问后的 1 分钟有效期内,但此时缓存已被用户手动清除,系统同样无法命中缓存,需重新调用大模型生成回答,因此耗时仍与首次提问相近。
