背景描述

可以将问答的内容缓存起来,如果是相同的问题,那么将会直接把答案返回去,可以节约费用和计算。


安装依赖

pip install -qU langchain-core langchain-openai

缓存类型及工作原理

1. 内存缓存(In-Memory Cache)

  • 默认缓存方式,使用Python的lru_cache实现
  • 缓存保存在程序运行时的内存中
  • 进程结束后缓存自动清除
  • 适合短期、小规模应用的快速原型开发

2. 持久化缓存(Persistent Cache)

  • 支持多种后端存储:SQLite、Redis、本地文件系统等
  • 缓存可跨会话和进程持久保存
  • 适合生产环境和大型应用
  • 示例:SQLiteCache会创建一个本地数据库文件存储缓存记录

缓存的实际应用场景

  1. 开发调试阶段:减少重复API调用次数
  2. 生产环境:降低LLM服务的调用成本
  3. 内容不变的查询:如FAQ回答、固定知识库查询
  4. 批量处理:需要处理大量相似请求时

配置与使用示例

from langchain.cache import InMemoryCache, SQLiteCache
from langchain.globals import set_llm_cache

# 使用内存缓存
set_llm_cache(InMemoryCache())

# 或者使用SQLite持久化缓存
set_llm_cache(SQLiteCache(database_path=".langchain.db"))

详细代码实现

from langchain.globals import set_llm_cache
from langchain_openai import ChatOpenAI
from langchain.cache import InMemoryCache
from langchain.cache import SQLiteCache


llm = ChatOpenAI(
    model="gpt-3.5-turbo",
)
# 保存在内存中
set_llm_cache(InMemoryCache())
# 也可以持久化在数据库中
# set_llm_cache(SQLiteCache(database_path=".langchain.db"))

# The first time, it is not yet in cache, so it should take longer
message1 = llm.predict("Tell me a joke")
print(f"message1: {message1}")

# The second time it is, so it goes faster
message2 = llm.predict("Tell me a joke")
print(f"message2: {message2}")

运行结果说明

  • 第一次请求:完整调用OpenAI API,响应时间3-5秒
  • 第二次请求:直接返回缓存结果,响应时间约500毫秒
  • 性能差异明显,表明缓存机制生效

缓存失效与更新

  1. 自动失效:基于输入参数自动判断是否使用缓存
  2. 手动清除:可通过cache.clear()方法清除全部缓存
  3. 细粒度控制:可以为特定调用设置use_cache=False禁用缓存

性能考量

  1. 响应时间:缓存命中时响应速度可提升10-100倍
  2. 成本节约:减少API调用次数可大幅降低使用成本
  3. 吞吐量:系统整体吞吐量可提高3-5倍

最佳实践建议

  1. 开发环境优先使用内存缓存
  2. 生产环境推荐使用Redis等高性能持久化缓存
  3. 对于频繁变更的内容,适当降低缓存时间或禁用缓存
  4. 定期监控缓存命中率和效果

缓存技术细节

  • 默认缓存时间:30分钟
  • 缓存大小限制:100MB
  • 淘汰策略:LRU(最近最少使用)