尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

[LangChain] 03. 缓存

[LangChain] 03. 缓存
📅 发布时间:2026/6/19 20:21:37

在实际开发 AI 应用的过程中,我们经常会遇到重复输入的情况:

  • 同一用户多次询问相同的问题
  • 刷新页面或误触按钮触发了相同请求
  • 不同用户提出了内容高度相似的问题

如果每次都让大模型重新生成响应,不仅效率低下,还会带来不必要的计算成本。为了解决这个问题,我们可以引入“缓存机制”。

启用缓存的好处

  1. 提升响应速度:重复问题无需重新调用模型,直接命中缓存结果
  2. 降低调用成本:尤其对于调用远程 LLM(如 GPT-4),可节省大量费用
  3. 避免冗余请求:减少系统负担,提升整体并发性能

要启用缓存,非常简单,只需要在模型实例中一行代码就可以启用:

import { Ollama } from "@langchain/ollama";const model = new Ollama({model: "llama3",cache: true, // 启用缓存机制
});

课堂练习

  1. 快速上手案例

  2. 解决缓存默认使用的哈希算法不够安全的问题

我们在开启缓存的时候,官方会给出提示。未来会更新成更安全的算法。

  1. 流式输出下想要实现缓存
import { Ollama } from "@langchain/ollama";
import { SecureCache } from "./utils.js";// 创建安全缓存实例
const secureCache = new SecureCache();// 配置模型并启用安全缓存
const model = new Ollama({model: "llama3",cache: secureCache, // 使用自定义的安全缓存stream: true,
});async function callWithStreamAndCache(inputText) {const start = Date.now();const stream = await model.stream(inputText);let fullResponse = "";for await (const chunk of stream) {process.stdout.write(chunk); // 实时打印fullResponse += chunk; // 累积结果,用于缓存比较}const end = Date.now();console.log(`\n⏱️ 本次耗时:${end - start}ms`);return fullResponse;
}// 第一次调用(无缓存)
console.log("\n🎯 第一次调用(无缓存):");
await callWithStreamAndCache("请用中文介绍一下AI的影响");// 第二次调用(应命中缓存)
console.log("\n\n🎯 第二次调用(命中缓存):");
await callWithStreamAndCache("请用中文介绍一下AI的影响");

🤔 为什么流式模式下没有命中缓存?

这是因为 LangChain 的默认缓存机制目前只对同步调用接口(如 .invoke()、.predict())生效。这些方法会在调用前先检查是否存在缓存结果,如果有,就直接返回;否则才会请求模型。

而 .stream() 方法返回的是一个异步迭代器(AsyncIterable),数据是一块一块地实时生成的。当前在 LangChain.js 的实现中,大多数模型(包括 Ollama)对 .stream() 并未内建完整的缓存处理逻辑。

课堂练习

综合案例:实现如下特性:

  • 流式输出
  • 支持缓存
  • 内容高度相似的问题也采用缓存的方式

import { Ollama, OllamaEmbeddings } from "@langchain/ollama";
import cosineSimilarity from "cosine-similarity";const model = new Ollama({model: "llama3",stream: true,
});const embeddings = new OllamaEmbeddings({model: "nomic-embed-text",
});const cache = [];async function callLLM(inputText, threshold = 0.7) {const queryEmbedding = await embeddings.embedQuery(inputText);for (const item of cache) {const similarity = cosineSimilarity(queryEmbedding, item.embedding);if (similarity >= threshold) {process.stdout.write(item.response);return;}}const stream = await model.stream(inputText);let fullResponse = "";for await (const chunk of stream) {process.stdout.write(chunk);fullResponse += chunk;}cache.push({input: inputText,embedding: queryEmbedding,response: fullResponse,});
}// 第一次调用(无缓存)
console.log("\n🎯 第一次调用(无缓存):");
await callLLM("请用中文介绍一下AI的影响,最多200字");// 第二次调用(应命中缓存)
console.log("\n\n🎯 第二次调用(命中缓存):");
await callLLM("请用中文介绍一下AI时代的影响,最多200字");

相关新闻

  • C语言编程之旅:从入门到实战
  • docling
  • Selenium元素定位总失败?这8种定位策略你必须掌握

最新新闻

  • 2026萍乡2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 深入解析LPC2478:ARM7TDMI-S内核、双AHB总线与关键外设实战
  • 5倍效率提升:Dify官方插件集的AI集成革命
  • 2026潮州漏水检测维修精选优质服务商TOP5推荐!卫生间漏水/厨房漏水/屋顶天花板漏水/阳台漏水/地下室漏水防水补漏检测维修-正规防水补漏公司优选口碑榜测评推荐 - 即刻修防水
  • 2026年天津GEO优化服务商推荐指南 - GEO优化
  • 2026年近期陕西消防:专业消防技术服务商选择与推荐 - 品牌鉴赏官2026

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号