LangChain 缓存:同样的请求别反复花钱
个人主页 for_ever_love__ 欢迎各位大佬莅临其他栏目: 大模型开发从0到1 其他栏目: iOS项目总结大全 其他栏目: 我想学python了 其他栏目: iOS UI 文章目录LangChain 缓存同样的请求别反复花钱一、两种缓存二、精确缓存四种后端2.1 怎么选2.2 Redis 缓存要装依赖三、缓存的边界什么会被缓存四、语义缓存意思相近就命中4.1 score_threshold 怎么定4.2 语义缓存的风险五、哪些请求不该缓存六、手动管理缓存6.1 清空6.2 查看是否命中6.3 缓存过期七、缓存之外的省钱招八、开发期的小技巧九、常见坑十、小结LangChain 缓存同样的请求别反复花钱开发时反复调试同一条 prompt每次都真调 API——一天下来账单不难看才怪。缓存是成本优化里投入产出比最高的一招几行代码可能省掉 30%~60% 的调用。一、两种缓存类型原理省钱适合精确缓存prompt 完全一样才命中中调试、重复问题语义缓存意思相近就命中高客服 FAQ、相似提问先上精确缓存简单可靠有余力再上语义缓存。二、精确缓存四种后端fromlangchain_core.cachesimportInMemoryCachefromlangchain_community.cacheimportSQLiteCache,RedisCachefromlangchain_core.globalsimportset_llm_cache# 1. 内存进程内重启即丢set_llm_cache(InMemoryCache())# 2. SQLite单机持久化set_llm_cache(SQLiteCache(database_path.langchain.db))# 3. Redis分布式生产首选set_llm_cache(RedisCache(redis_urlredis://localhost:6379))设完之后什么都不用改所有 LLM 调用自动走缓存llm.invoke(你好)# 真调用耗时 2sllm.invoke(你好)# 命中缓存瞬间返回2.1 怎么选场景选哪个本地开发调试SQLiteCache重启还在省事单机服务SQLiteCache多实例 / 生产RedisCache共享缓存临时脚本InMemoryCache多实例部署一定要用 Redis否则每个实例各缓存一份命中率被实例数摊薄。2.2 Redis 缓存要装依赖pipinstallredisfromlangchain_community.cacheimportRedisCachefromlangchain_core.globalsimportset_llm_cacheimportredis set_llm_cache(RedisCache(redis_redis.Redis(hostlocalhost,port6379,db0)))三、缓存的边界什么会被缓存缓存 key 模型 完整 prompt 参数temperature 等。所以llm.invoke(今天天气如何)# 调用 Allm.invoke(今天天气如何 )# 多了个空格 → 不命中llm.invoke(今天天气如何)# 多了个问号 → 不命中llm2ChatOpenAI(temperature0.7)llm2.invoke(今天天气如何)# temperature 不同 → 不命中这就是精确缓存命中率不高的原因——用户的提问千变万化完全一样的很少。四、语义缓存意思相近就命中pipinstallfaiss-cpufromlangchain_community.cacheimportRedisSemanticCachefromlangchain_openaiimportOpenAIEmbeddingsimportredis set_llm_cache(RedisSemanticCache(redis_urlredis://localhost:6379,embeddingOpenAIEmbeddings(modeltext-embedding-3-small),score_threshold0.2,# 距离阈值越小越严格))原理1. 把新请求 embedding 成向量 2. 在缓存里找最相似的已有请求 3. 距离 阈值 → 命中直接返回旧答案 4. 否则真调用并把 (请求, 答案) 存进缓存4.1 score_threshold 怎么定这是语义缓存唯一的、也是最重要的参数。阈值行为风险0.1很严格几乎要一模一样命中率低省钱少0.2推荐起点平衡0.3很宽松会串答案“退款多久到账命中退款流程是什么”务必用你的真实问题测一批再定。拿 20 个问题试试看有没有明显答非所问的误命中。4.2 语义缓存的风险它会让不同的问题返回同一个答案。这在以下场景是灾难需要精确数字的场景“北京多少度” vs “上海多少度”需要时效性的场景“今天汇率”个性化场景不同用户同一问题应有不同答案。安全做法只给确定性的知识问答开语义缓存FAQ、产品介绍个性化和实时类请求直接跳过。fromlangchain_core.globalsimportget_llm_cachedefanswer(question:str,user_id:str,use_semantic_cache:bool):llmChatOpenAI(modelgpt-4o-mini,cacheuse_semantic_cache)returnllm.invoke(question)注意cache是模型级参数可以给某些实例关掉。五、哪些请求不该缓存llm_no_cacheChatOpenAI(modelgpt-4o-mini,cacheFalse)这几类要关掉场景原因含时间戳/随机数的 prompt每次都不一样缓存白占空间实时数据查询答案会变创意生成每次要不同命中缓存就失去多样性了需要 tracing 的调试命中缓存拿不到真实调用六、手动管理缓存6.1 清空fromlangchain_core.globalsimportget_llm_cache get_llm_cache().clear()6.2 查看是否命中importtime t0time.time()llm.invoke(一个很长的问题……)elapsedtime.time()-t0print(命中缓存ifelapsed0.1else真实调用)更可靠的方式是看 callbackfromlangchain_core.callbacksimportBaseCallbackHandlerclassCacheWatcher(BaseCallbackHandler):defon_llm_start(self,serialized,prompts,**kwargs):print(真实调用:,prompts[0][:50])llm.invoke(...,config{callbacks:[CacheWatcher()]})命中缓存时on_llm_start不会触发——这就是判断依据。6.3 缓存过期Redis 缓存可以设置 TTLRedisCache(redis_redis_client,ttl3600)# 1 小时过期生产建议设 TTL否则缓存无限增长Redis 内存会爆。七、缓存之外的省钱招缓存只是其中一招按性价比排序招数省多少难度缓存30%~60%⭐便宜模型处理简单任务50%⭐⭐缩短 prompt去掉废话10%~30%⭐限制max_tokens10%~20%⭐批量请求batch API50%部分供应商支持⭐⭐蒸馏/微调小模型80%⭐⭐⭐⭐先做缓存和限制 max_tokens这两个是零风险的。八、开发期的小技巧调试时不想每次真调又不想开缓存怕拿到旧答案可以用Fake LLM后面测试那篇会细讲fromlangchain_community.llms.fakeimportFakeListLLM llmFakeListLLM(responses[答案1,答案2])但要验证真实效果时记得关掉它——我见过调试完忘记换回来上线后所有请求返回固定字符串的事故。九、常见坑现象原因解法设了缓存没生效在set_llm_cache之前就创建了 llm先设缓存再建模型或全局设置后再 import多实例命中率低用了 SQLite/内存换 Redis答案串了语义缓存阈值太松降到 0.15或只给 FAQ 用Redis 内存涨没设 TTL加ttl改了 prompt 还拿旧答案缓存命中清缓存或开发期关掉每次都不同的输出变成一样了创意任务开了缓存cacheFalse十、小结精确缓存三选一SQLite单机/开发、Redis生产/多实例、InMemory临时缓存 key 包含模型 完整 prompt 参数一个空格不同就不命中语义缓存命中率高但有串答案风险score_threshold从0.2起步必须用真实问题测一批实时、个性化、创意类请求要关缓存cacheFalseRedis 缓存必须设 TTL否则内存无限涨判断命中的方法命中时on_llm_start不触发。下一篇讲 Token 计数与成本控制——知道钱花在哪。

相关新闻

让 AI 每周交出项目报告:把跨系统更新整理成变化说明与风险清单

让 AI 每周交出项目报告:把跨系统更新整理成变化说明与风险清单

项目周报的难点,是解释“这一周改变了什么” 项目周报看起来只是每周写一次文档,实际却要回答几个彼此关联的问题:哪些工作完成了,哪些承诺发生了变化,哪些阻塞仍未解除,以及下周需要谁做决定。 这些信息…

2026/10/15 21:25:40 阅读更多 →
MateClaw DSH Runtime源码解析:如何用JSON-RPC把DeepSeek Harness变成受管理的外部推理循环

MateClaw DSH Runtime源码解析:如何用JSON-RPC把DeepSeek Harness变成受管理的外部推理循环

人工智能AI AgentAgent 工作流Agent 编排RAG工具调用后端前端 【免费下载链接】mateclaw 🤖 MateClaw — Your second brain with Multi-Agent Orchestration, MCP Protocol, Skills & Memory, Dream, and Multi-Channel Support. Built on Spring AI Alibaba. …

2026/10/15 21:24:38 阅读更多 →
RustDesk 1.5.0 升级安装故障处理笔记

RustDesk 1.5.0 升级安装故障处理笔记

RustDesk 1.5.0 升级安装故障处理笔记故障现象:旧版本可正常安装运行,升级1.5.0版本,点击安装出现进度条后直接消失,无报错,系统服务RustDesk未注册,sc query RustDesk返回【指定的服务未安装 1060】 根因&…

2026/10/15 21:24:38 阅读更多 →

最新新闻

告别命令行!OpenClaw 小白保姆级安装教程,看完就会(TaoToken 统一 Key 版)

告别命令行!OpenClaw 小白保姆级安装教程,看完就会(TaoToken 统一 Key 版)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 22:23:06 阅读更多 →
STM32+FreeRTOS下FreeModbus主从站移植指南

STM32+FreeRTOS下FreeModbus主从站移植指南

简介:面向嵌入式开发者的FreeModbus协议栈系统学习资料,聚焦STM32H743与FreeRTOS环境下的主站、从站同时移植场景。原版FreeModbus只开源从机,主机协议栈需付费,作者为解决这一痛点,自行开发了与从机风格、接口保持一致…

2026/10/15 22:23:06 阅读更多 →
FizzGate二次开发手册:扩展核心过滤器与Spring Boot Starter的进阶技巧

FizzGate二次开发手册:扩展核心过滤器与Spring Boot Starter的进阶技巧

后端API网关微服务服务注册发现认证鉴权 【免费下载链接】fizz-gateway-node An Aggregation API Gateway in Java . FizzGate 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、…

2026/10/15 22:23:06 阅读更多 →
PixVerse挑战活动报名启动:AI视频生成实战赛事

PixVerse挑战活动报名启动:AI视频生成实战赛事

我无法根据当前输入内容生成符合要求的博文。原因如下:输入中仅提供了项目标题“PixVerse 挑战活动开启报名”,但缺少所有必要结构化信息:→ 无【项目正文】(零散原始描述)→ 无【关键词】列表(仅出现“相关…

2026/10/15 22:23:06 阅读更多 →
数据共享治理框架:从不敢共享到放心共享的落地指南

数据共享治理框架:从不敢共享到放心共享的落地指南

做数据共享做了几年,我最大的感受是:真正挡住共享的,从来不是技术,而是"不敢"。数据方怕泄露、怕担责,需求方怕拿到一堆没法用的脏数据,两边来回拉扯,最后大家只能继续各建各的烟囱。…

2026/10/15 22:23:06 阅读更多 →
n8n+云函数:构建无服务器文件转换工作流的实战指南

n8n+云函数:构建无服务器文件转换工作流的实战指南

总有朋友在 n8n 社区里问:文件转换这种活儿,能不能用 n8n 直接啃下来?我的答案往往会泼一盆冷水——能,但只限小打小闹。PDF 加水印、图片压个尺寸,n8n 自带的节点和外部 HTTP 请求勉强能绕出来;一旦涉及 O…

2026/10/15 22:22:03 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →