总结之LangChain(三)——模型IO缓存

一、聊天模型缓存

LangChain为聊天模型提供了一个可选的缓存层。这有两个好处:

如果您经常多次请求相同的完成结果,它可以通过减少您对LLM提供程序的API调用次数来帮您节省费用。

它可以通过减少您对LLM提供程序的API调用次数来加快您的应用程序速度。

python 复制代码
from langchain_openai import ChatOpenAI
 
llm = ChatOpenAI()
python 复制代码
from langchain.globals import set_llm_cache

内存缓存

%%time 是一个魔术命令,用于在代码中测量代码块的执行时间。它是Python编程语言中的一个内置命令,可以用来计算代码块的执行时间。通过在代码块前加上"%%time",可以获取代码块的执行时间信息,包括总时间、CPU时间和内存使用情况等。

注意:%%time是Jupyter Notebook和IPython环境的特性,标准Python脚本(.py)或其他非交互式Python环境中无法直接使用。如果你在非Jupyter环境下需要类似功能,可以使用time模块来手动计时。

python 复制代码
%%time
from langchain.cache import InMemoryCache
 
set_llm_cache(InMemoryCache())
 
# 第一次,它尚未在缓存中,所以需要更长的时间
llm.predict("明天天气怎么样")
python 复制代码
%%time
# 第二次,由于已存在于缓存中,因此速度更快
llm.predict("明天天气怎么样")

完整示例代码

python 复制代码
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} 秒")

结果

python 复制代码
抱歉,我无法提供明确的明天天气预报,因为我无法访问实时天气数据。建议你查看天气预报应用或网站,以获取最新的天气信息。
代码执行时间: 5.457608938217163 秒
抱歉,我无法提供明确的明天天气预报,因为我无法访问实时天气数据。建议你查看天气预报应用或网站,以获取最新的天气信息。
代码执行时间: 0.0010001659393310547 秒

当然,可以结合我们的Chain来使用,如下:

python 复制代码
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} 秒")

结果

python 复制代码
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缓存

python 复制代码
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} 秒")

结果

python 复制代码
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 秒
相关推荐
1candobetter12 分钟前
JAVA后端开发——Maven 依赖传递 ≠ Spring 自动装配
java·spring·maven
若鱼191914 分钟前
SpringBoot4.0新特性-Null-safety消灭空指针
java·spring
ALex_zry30 分钟前
分布式缓存性能优化策略
分布式·缓存·性能优化
1104.北光c°36 分钟前
【黑马点评项目笔记 | 商户查询缓存篇】基于Redis解决缓存穿透、雪崩、击穿三剑客
java·开发语言·数据库·redis·笔记·spring·缓存
数据知道37 分钟前
PostgreSQL 核心原理:一文掌握数据库的热数据缓存池(共享缓冲区)
数据库·缓存·postgresql
计算机学姐43 分钟前
基于SpringBoot的校园流浪动物救助平台
java·spring boot·后端·spring·java-ee·tomcat·intellij-idea
玄〤1 小时前
SpringCloud微服务用户身份拦截器配置详细解决方案(黑马商城)(springcloud微服务课day6)
spring·spring cloud·微服务
那我掉的头发算什么1 小时前
【Mybatis】动态SQL与留言板小项目
数据库·spring boot·sql·spring·mybatis·配置
難釋懷1 小时前
优惠卷秒杀库存超卖问题分析
redis·缓存
pp起床1 小时前
【苍穹外卖】Day05 Redis快速入门
数据库·redis·缓存