总结之LangChain(三)——模型IO缓存
一、聊天模型缓存
LangChain为聊天模型提供了一个可选的缓存层。这有两个好处:
如果您经常多次请求相同的完成结果,它可以通过减少您对LLM提供程序的API调用次数来帮您节省费用。
它可以通过减少您对LLM提供程序的API调用次数来加快您的应用程序速度。
from langchain_openai import ChatOpenAIllm = ChatOpenAI()
from langchain.globals import set_llm_cache
内存缓存
%%time 是一个魔术命令,用于在代码中测量代码块的执行时间。它是Python编程语言中的一个内置命令,可以用来计算代码块的执行时间。通过在代码块前加上"%%time",可以获取代码块的执行时间信息,包括总时间、CPU时间和内存使用情况等。
注意:%%time是Jupyter Notebook和IPython环境的特性,标准Python脚本(.py)或其他非交互式Python环境中无法直接使用。如果你在非Jupyter环境下需要类似功能,可以使用time模块来手动计时。
%%time
from langchain.cache import InMemoryCacheset_llm_cache(InMemoryCache())# 第一次,它尚未在缓存中,所以需要更长的时间
llm.predict("明天天气怎么样")
%%time
# 第二次,由于已存在于缓存中,因此速度更快
llm.predict("明天天气怎么样")
完整示例代码
from langchain_openai import ChatOpenAI
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache
import time
llm = ChatOpenAI(api_key="sk-XXXXX")set_llm_cache(InMemoryCache())start_time = time.time()print(llm.predict("明天天气怎么样?"))
end_time = time.time()
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time} 秒")start_time = time.time()
print(llm.predict("明天天气怎么样?"))
end_time = time.time()
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time} 秒")
结果
抱歉,我无法提供明确的明天天气预报,因为我无法访问实时天气数据。建议你查看天气预报应用或网站,以获取最新的天气信息。
代码执行时间: 5.457608938217163 秒
抱歉,我无法提供明确的明天天气预报,因为我无法访问实时天气数据。建议你查看天气预报应用或网站,以获取最新的天气信息。
代码执行时间: 0.0010001659393310547 秒
当然,可以结合我们的Chain来使用,如下:
from langchain_openai import ChatOpenAI
from langchain.cache import InMemoryCache
from langchain.globals import set_llm_cache
import time
llm = ChatOpenAI(api_key="sk-XXX")from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([("system", "你是一个专业的天气播报员"),("user", "{input}")
])chain = prompt | llm
set_llm_cache(InMemoryCache())
start_time = time.time()print(chain.invoke("明天天气怎么样?"))
end_time = time.time()
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time} 秒")start_time = time.time()
print(chain.invoke("明天天气怎么样?"))
end_time = time.time()
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time} 秒")
结果
content='明天的天气预报如下:\n- 地点:[请提供具体地点]\n- 天气:[晴/多云/阴/雨/雪/雾等]\n- 温度范围:[最高温度]℃ 到 [最低温度]℃\n- 风力风向:[风力等级],[风向]\n\n请提供具体地点,我可以帮您查询更详细的天气情况。' response_metadata={'token_usage': {'completion_tokens': 131, 'prompt_tokens': 33, 'total_tokens': 164}, 'model_name': 'gpt-35-turbo', 'system_fingerprint': 'fp_811936bd4f', 'finish_reason': 'stop', 'logprobs': None} id='run-c07a049c-727d-47bc-a6c4-89135ff279c6-0' usage_metadata={'input_tokens': 33, 'output_tokens': 131, 'total_tokens': 164}
代码执行时间: 3.432565689086914 秒
content='明天的天气预报如下:\n- 地点:[请提供具体地点]\n- 天气:[晴/多云/阴/雨/雪/雾等]\n- 温度范围:[最高温度]℃ 到 [最低温度]℃\n- 风力风向:[风力等级],[风向]\n\n请提供具体地点,我可以帮您查询更详细的天气情况。' response_metadata={'token_usage': {'completion_tokens': 131, 'prompt_tokens': 33, 'total_tokens': 164}, 'model_name': 'gpt-35-turbo', 'system_fingerprint': 'fp_811936bd4f', 'finish_reason': 'stop', 'logprobs': None} id='run-c07a049c-727d-47bc-a6c4-89135ff279c6-0' usage_metadata={'input_tokens': 33, 'output_tokens': 131, 'total_tokens': 164}
代码执行时间: 0.0029997825622558594 秒```
程序或者脚本运行周期结束,缓存失效。
SQLite缓存
from langchain_openai import ChatOpenAI
from langchain.cache import SQLiteCache
from langchain.globals import set_llm_cache
import time
llm = ChatOpenAI(api_key="sk-XXX")from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([("system", "你是一个专业的天气播报员"),("user", "{input}")
])chain = prompt | llm
set_llm_cache(SQLiteCache(database_path=".langchain.db"))
start_time = time.time()print(chain.invoke("明天天气怎么样?"))
end_time = time.time()
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time} 秒")start_time = time.time()
print(chain.invoke("明天天气怎么样?"))
end_time = time.time()
execution_time = end_time - start_time
print(f"代码执行时间: {execution_time} 秒")
结果
content='明天的天气预报如下:预计会有阵雨,气温介于20-25摄氏度之间,风力较强,东北风,风速大约在20-25公里/小时。请注意携带雨具并做好防风保暖措施。' response_metadata={'token_usage': {'completion_tokens': 90, 'prompt_tokens': 33, 'total_tokens': 123}, 'model_name': 'gpt-35-turbo-16k', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-55940874-2056-44e8-90e2-c0163b218ced-0' usage_metadata={'input_tokens': 33, 'output_tokens': 90, 'total_tokens': 123}
代码执行时间: 2.634726047515869 秒
content='明天的天气预报如下:预计会有阵雨,气温介于20-25摄氏度之间,风力较强,东北风,风速大约在20-25公里/小时。请注意携带雨具并做好防风保暖措施。' response_metadata={'token_usage': {'completion_tokens': 90, 'prompt_tokens': 33, 'total_tokens': 123}, 'model_name': 'gpt-35-turbo-16k', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None} id='run-55940874-2056-44e8-90e2-c0163b218ced-0' usage_metadata={'input_tokens': 33, 'output_tokens': 90, 'total_tokens': 123}
代码执行时间: 0.23708701133728027 秒
相关文章:
总结之LangChain(三)——模型IO缓存
一、聊天模型缓存 LangChain为聊天模型提供了一个可选的缓存层。这有两个好处: 如果您经常多次请求相同的完成结果,它可以通过减少您对LLM提供程序的API调用次数来帮您节省费用。 它可以通过减少您对LLM提供程序的API调用次数来加快您的应用程序速度。…...
判断一个Java服务是不是GateWay
方法 直接在对应服务的url后变加上后缀/actuator/gateway/routes,看是否会返回Gateway的路由信息。 如果返回了GateWay的路由列表,则该服务为Gateway服务。...
三次插值曲线--插值技术
三次插值曲线 1.1.三次样条曲线 三次样条曲线的基本思想是,在给定的一系列点(称为控制点或数据点)之间,通过一系列三次多项式曲线段来拟合这些点,使得整个曲线既平滑又准确地通过所有控制点。 1.1.1.数学定义 给定…...
python循环结构
1.while 循环 语句: while 循环条件表达式: 代码块 else: 代码块 小练: 设计一百以内的偶数相加 n 0 while n < 100:n 1if n % 2 0 :print(n) 判断是不是闰年(四年一润和百年不润,或者四百年一润&am…...
深入理解Netty的Pipeline机制:原理与实践详解
深入理解Netty的Pipeline机制:原理与实践详解 Netty是一个基于Java的高性能异步事件驱动的网络应用框架,广泛应用于高并发网络编程。(学习netty请参考:深入浅出Netty:高性能网络应用框架的原理与实践)Nett…...
直方图均衡化示例
禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》 图3-17...
私域电商新纪元:消费增值模式的创新与成功实践
大家好,我是吴军,很高兴能够与您分享私域电商领域的魅力与机遇。今天,我将为大家呈现一个令人瞩目的成功案例,这个案例充分展现了私域电商的巨大潜力和无限可能。 在短短一个月的时间里,我们的客户成功实现了业绩的飞跃…...
Java——IO流(一)-(6/8):字节流-FileInputStream 每次读取多个字节(示例演示)、一次读取完全部字节(方式一、方式二,注意事项)
目录 文件字节输入流:每次读取多个字节 实例演示 注意事项 文件字节输入流:一次读取完全部字节 方式一 方式二 注意事项 文件字节输入流:每次读取多个字节 用到之前介绍过的常用方法: 实例演示 需求:用每次读取…...
服务器SSH 免密码登录
1. 背景 为了服务器的安全着想,设置的服务器密钥非常长。但是这导致每次连接服务器都需要输入一长串的密码,把人折腾的很痛苦,所以我就在想,能不能在终端SSH的时候无需输入密码。 windows 可以使用 xshell 软件,会自…...
Linux安装MySQL以及远程连接
1、Linux安装MySQL 1.1、准备解压包 MySQL5.x解压包 提取码:9y7n 1.2、通过rpm脚本安装 切记安装顺序:common --> libs --> client --> server 因为它们之间存在依赖关系,所以务必按照顺序安装 安装前请确保当前目录/文…...
SQL Server 数据库分页技术详解:选择最佳方法优化查询性能”。
当今数据驱动的应用程序中,数据库分页技术在优化查询性能和提升用户体验中扮演着重要角色。在 SQL Server 环境下,开发者面对大数据集时,常常需要选择合适的分页方法以平衡功能需求和性能优化。本文将详细介绍 SQL Server 中几种主要的分页技…...
electron录制-镜头缩放、移动
要求 1、当录屏过程中,鼠标点击,镜头应该往点击处拉近,等一段时间还原 2、录屏过程中,可能会发生多次点击,但是点击位置偏差大,可能会导致缩放之后,画面没出来,因此需要移动镜头帧 …...
红队内网攻防渗透:内网渗透之内网对抗:信息收集篇自动项目本机导出外部打点域内通讯PillagerBloodHound
红队内网攻防渗透 1. 内网自动化信息收集1.1 本机凭据收集类1.1.1、HackBrowserData 快速获取浏览器的账户密码1.1.2、Searchall 快速搜索服务器中的有关敏感信息还有浏览器的账户密码1.1.3、Pillager 适用于后渗透期间的信息收集工具,可以收集目标机器上敏感信息1.2 对外打点…...
2024最新IDEA插件开发+发布全流程 SelectCamelWords[选中驼峰单词](idea源代码)
2024最新IDEA插件开发(发布)-SelectCamelWords[选中驼峰单词](idea源代码) 参考文档 Jetbrains Idea插件开发文档: https://plugins.jetbrains.com/docs/intellij/welcome.html代码地址:https://github.com/yangfeng…...
【网络安全】网络安全基础精讲 - 网络安全入门第一篇
目录 一、网络安全基础 1.1网络安全定义 1.2网络系统安全 1.3网络信息安全 1.4网络安全的威胁 1.5网络安全的特征 二、入侵方式 2.1黑客 2.1.1黑客入侵方式 2.1.2系统的威胁 2.2 IP欺骗 2.2.1 TCP等IP欺骗 2.2.2 IP欺骗可行的原因 2.3 Sniffer探测 2.4端口扫描技术…...
初识 GPT-4 和 ChatGPT
文章目录 LLM 概述理解 Transformer 架构及其在 LLM 中的作用解密 GPT 模型的标记化和预测步骤 想象这样⼀个世界:在这个世界里,你可以像和朋友聊天⼀样快速地与计算机交互。那会是怎样的体验?你可以创造出什么样的应用程序?这正是…...
【C语言】解决C语言报错:Array Index Out of Bounds
文章目录 简介什么是Array Index Out of BoundsArray Index Out of Bounds的常见原因如何检测和调试Array Index Out of Bounds解决Array Index Out of Bounds的最佳实践详细实例解析示例1:访问负索引示例2:访问超出上限的索引示例3:循环边界…...
【C++】一个极简但完整的C++程序
一、一个极简但完整的C程序 我们编写程序是为了解决问题和任务的。 1、任务: 某个书店将每本售出的图书的书名和出版社,输入到一个文件中,这些信息以书售出的时间顺序输入,每两周店主会手工计算每本书的销售量、以及每个出版社的…...
Lua迭代器详解(附加红点功能实例)
Lua迭代器详解与用法 1. 什么是迭代器2. 为什么需要理解迭代器的原理3. 迭代器的实现0. 闭包1. 有状态迭代器2. 无状态迭代器 4. 红点树系统基础 1. 什么是迭代器 迭代器是一种能让我们遍历一个集合中的所有元素的代码结构。比如常用ipairs()和pairs()。 2. 为什么需要理解迭代…...
锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品
锂磷硫(LPS)属于硫化物固态电解质 Li7P3S11是代表性产品 锂磷硫(LPS),为非晶态材料,是硫化物固态电解质代表性产品之一,具有热稳定性好、成本较低等优点,在固态电解质中离子电导率较…...
PointCloudLib 点云边缘点提取 C++版本
0.实现效果 1.算法原理 PCL(Point Cloud Library)中获取点云边界的算法主要基于点云数据的几何特征和法向量信息。以下是对该算法的详细解释,按照清晰的格式进行归纳: 算法概述 PCL中的点云边界提取算法主要用于从3D点云数据中识别并提取出位于物体边界上的点。这些边界…...
【Qt】QList<QVariantMap>中数据修改
1. 问题 QList<QVariantMap> 类型中,修改QVariantMap中的值。 2. 代码 //有效代码1QVariantMap itemMap itemList.at(0);itemMap.insert("title", "test");itemList.replace(0, itemMap);//有效代码 2itemList.operator [](0).insert(…...
如何避免vue的url中使用hash符号?
目录 1. 安装 Vue Router 2. 配置 Vue Router 使用 history 模式 3. 更新 main.js 4. 配置服务器以支持 history 模式(此处需要仔细测试) a. Nginx 配置 b. Apache 配置 5. 部署并测试 总结 在 Vue.js 项目中,避免 URL 中出现 # 符号的…...
Java学习 - MySQL存储过程、函数和触发器练习实例
存储过程 存储过程是什么 存储过程是一组已经编译好的SQL语句存储过程优点有什么 安全 性能高 提高代码复用性创建存储过程的语法 DELIMITER $ # 不能加分号CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型) BEGIN存储过程语句块 END;$DELIMITER ;创建一个无参的存储…...
【深度神经网络 (DNN)】
深度神经网络 (DNN) 深度神经网络 (DNN) 是机器学习领域中一种强大的工具,它由多层神经元组成,能够学习复杂的数据模式,解决各种任务,如图像识别、语音识别、自然语言处理等。 DNN 的构成: 神经元: DNN 的基本单元&…...
ES全文检索支持繁简和IK分词检索
ES全文检索支持繁简和IK分词检索 1. 前言2. 引入繁简转换插件analysis-stconvert2.1 下载已有作者编译后的包文件2.2 下载源码进行编译2.3 复制解压插件到es安装目录的plugins文件夹下 3. 引入ik分词器插件3.1 已有作者编译后的包文件3.2 只有源代码的版本3.3 安装ik分词插件 4…...
解决Visual Studio Code在Ubuntu上崩溃的问题
解决Visual Studio Code在Ubuntu上崩溃的问题 我正在使用Ubuntu系统,每次打开Visual Studio Code时,只能短暂打开一秒钟,然后就会崩溃。当通过终端使用code --verbose命令启动Visual Studio Code时,出现以下错误信息:…...
【OpenGauss源码学习 —— (ALTER TABLE(SET attribute_option))】
ALTER TABLE(SET attribute_option) ATExecSetOptions 函数 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果,力求遵循合理使用原则,并在适用的情况下注明引用来源。…...
Elasticsearch 数据提取 - 最适合这项工作的工具是什么?
作者:来自 Elastic Josh Asres 了解在 Elasticsearch 中为你的搜索用例提取数据的所有不同方式。 对于搜索用例,高效采集和处理来自各种来源的数据的能力至关重要。无论你处理的是 SQL 数据库、CRM 还是任何自定义数据源,选择正确的数据采集…...
‘浔川画板v5.1’即将上线!——浔川python社
1 简介: 浔川画板是一款专业的数字绘画和漫画创作软件,它为艺术家和设计师提供了丰富的绘画工具、色彩管理功能以及易于使用的界面。用户可以使用浔川画板进行手绘风格的绘画、精细的素描、漫画分格、UI设计等多种创作。该软件支持多种笔刷和特效&#…...
RockChip Android12 System之Datetime
一:概述 本文将针对Android12 Settings二级菜单System中Date&time的UI修改进行说明。 二:Date&Time 1、Activity packages/apps/Settings/AndroidManifest.xml <activityandroid:name="Settings$DateTimeSettingsActivity"android:label="@stri…...
详解 ClickHouse 的副本机制
一、简介 副本功能只支持 MergeTree Family 的表引擎,参考文档:https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/ ClickHouse 副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机&#…...
速卖通测评成本低见效快,自养号测评的实操指南,快速积累销量和好评
对于初入速卖通的新卖家而言,销量和评价的积累显得尤为关键。由于新店铺往往难以获得平台活动的青睐,因此流量的获取成为了一大挑战。在这样的背景下,进行产品测评以积累正面的用户反馈和销售记录,成为了提升店铺信誉和吸引潜在顾…...
php反序列化漏洞简介
目录 php序列化和反序列化简介 序列化 反序列化 类中定义的属性 序列化实例 反序列化实例 反序列化漏洞 序列化返回的字符串格式 魔术方法和反序列化利用 绕过wakeup 靶场实战 修复方法 php序列化和反序列化简介 序列化 将对象状态转换为可保持或可传输的格式的…...
力扣随机一题 模拟+字符串
博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 1910.删除一个字符串中所有出现的给定子字符串【中等】 题目: …...
java-正则表达式 1
Java中的正则表达式 1. 正则表达式的基本概念 正则表达式(Regular Expression, regex)是一种用于匹配字符串中字符组合的模式。正则表达式广泛应用于字符串搜索、替换和解析。Java通过java.util.regex包提供了对正则表达式的支持,该包包含两…...
Python xlrd库:读excel表格
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...
开发中遇到的一个bug
遇到的报错信息是这样的: java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [hm-api,hm-common,hm-service] are excluded from annotation processing 翻译过来就是存在循环引用的情况,导…...
Java面试题:对比不同的垃圾收集器(如Serial、Parallel、CMS、G1)及其适用场景
Java虚拟机(JVM)提供了多种垃圾收集器,每种垃圾收集器在性能和适用场景上各有不同。以下是对几种常见垃圾收集器(Serial、Parallel、CMS、G1)的对比及其适用场景的详细介绍: 1. Serial 垃圾收集器 Serial…...
每日一题——冒泡排序
C语言——冒泡排序 冒泡排序练习 前言:CSDN的小伙伴们,大家好!今天我来给大家分享一种解题思想——冒泡排序。 冒泡排序 冒泡法的核心思想:两两相邻的元素进行比较 2.冒泡排序的算法描述如下。 (1)比较相邻的元素。如果第一 个比…...
javascript浏览器对象模型
BOM对象: BOM 是浏览器对象模型的简称。JavaScript 将整个浏览器窗口按照实现的功能不同拆分成若干个对象; 包含:window 对象、history 对象、location 对象和 document 对象等 window对象: 常用方法: 1.prompt();…...
C语言之链表以及单链表的实现
一:链表的引入 1:从数组的缺陷说起 (1)数组有两个缺陷。一个是数组中所有元素类型必须一致,第二是数组的元素个数必须事先指定并且一旦指定后不能更改 (2)如何解决数组的两个缺陷:数…...
AI在线免费视频工具2:视频配声音;图片说话hedra
1、视频配声音 https://deepmind.google/discover/blog/generating-audio-for-video/ https://www.videotosoundeffects.com/ (免费在线使用) 2、图片说话在线图片生成播报hedra hedra 上传音频与图片即可合成 https://www.hedra.com/ https://www.…...
Elastic字段映射(_source,doc_value,fileddata,index,store)
Elastic字段映射(_source,doc_value,filed_data,index,store) _source: source 字段用于存储 post 到 ES 的原始 json 文档。为什么要存储原始文档呢?因为 ES 采用倒排索引对文本进行搜索,而倒排索引无法存储原始输入…...
kotlin空类型安全 !! ?. ?:
1、定义可空类型 fun main(){// 定义可空类型var x:String? "hello"x null } 2、!! 强转类型 定义可空类型之后,如果使用其内置方法,编译不会通过,因为值有可能为null,可以使用 !! 把类型强转为不可空:…...
通过 WireGuard 组建虚拟局域网 实现多个局域网全互联
本文后半部分代码框较多,欢迎点击原文链接获得更佳的阅读体验。 前言 上一篇关于 WireGuard 的文章通过 Docker 安装 wg-easy 的形式来使用 WireGuard,但 wg-easy 的功能比较有限,并不能发挥出 WireGuard 的全部功力。 如果只是想要出门在外连随时随地的连回家里的局域网,…...
qmt量化交易策略小白学习笔记第47期【qmt编程之期货仓单】
qmt编程之获取期货数据 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 感谢关注,咨询免费开通量化回测与获取实盘权限,欢迎和博主联系! 期货仓单 提示 1…...
点云处理中阶 Sampling
目录 一、什么是点云Sampling 二、示例代码 1、下采样 Downsampling 2、均匀采样 3、上采样 4、表面重建 一、什么是点云Sampling 点云处理中的采样(sampling)是指从大量点云数据中选取一部分代表性的数据点,以减少计算复杂度和内存使用,同时保留点云的几何特征和重…...
为什么print语句被Python3遗弃?
在开发和维护python项目的时候发现经常有print语句报错,原因是python3放弃了print语句 print 语句 早就被列在了不可靠的语言特性列表中,例如 Guido 的“Python 之悔”(Python Regrets)演讲【1】,并计划在 Python 300…...
067、Python 高阶函数的编写:优质冒泡排序
以下写了个简单的冒泡排序函数: def bubble_sort(items: list) -> list:for i in range(1, len(items)):swapped Falsefor j in range(0, len(items) - 1):if items[j] > items[j 1]:items[j], items[j 1] items[j 1], items[j]swapped Trueif not swa…...