在 LangChain 中,缓存机制是一种用于提升语言模型调用效率、降低成本的重要手段。其核心思想是:将提示词的响应结果缓存起来,在后续遇到相同或相似的请求时直接复用,从而避免重复调用模型。
1. 缓存策略
目前 LangChain 提供了两类主流的缓存方法:
- 基于 Prompt 文本匹配的缓存(非语义缓存)
- 基于 Prompt 语义匹配的缓存(语义缓存)
这两种方法的区别主要在于缓存命中的判断方式:
- 基于文本匹配:将每次输入的 Prompt 作为 Key,语言模型生成的响应作为 Value 存储在缓存中。只有当新的 Prompt 文本与缓存中某条完全一致时,才会命中缓存,直接返回历史结果。这种方式简单高效,适合提示词保持不变的开发调试场景。
- 基于语义匹配:将 Prompt 向量化后与缓存中已有的 Prompt 向量进行相似度计算。当相似度超过设定阈值时,即认为命中缓存。这种方式更智能,适合处理语义相近但表达不同的提示词,能提升缓存命中率,尤其适用于提示词变化频繁的场景。
2. 使用示例
from dotenv import load_dotenv load_dotenv('llm.env') from langchain_deepseek import ChatDeepSeek from langchain_core.caches import InMemoryCache from langchain_community.cache import SQLiteCache from langchain_community.cache import RedisSemanticCache from langchain_openai import OpenAIEmbeddings from langchain_core.globals import set_llm_cache import time def demo(): # 以输入的 prompt 和 llm 信息为 key,模型的输出为 value 进行缓存。 # maxsize 表示缓存的最大容量(最多能存多少条数据,None 表示没有限制 cache = InMemoryCache(maxsize=100) # cache = SQLiteCache(database_path='cache.db') # 安装 docker,并下载镜像 redis-stack # 启动 redis-stack: docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest # score_threshold 越小,要求相似度越高,越难以命中缓存 # embeddimg = OpenAIEmbeddings(model='doubao-embedding-text-240715', check_embedding_ctx_length=False) # cache = RedisSemanticCache(redis_url='redis://127.0.0.1:6379', embedding=embeddimg, score_threshold=0.005) # 开启响应缓存 set_llm_cache(cache) model = ChatDeepSeek(model='deepseek-chat') start = time.time() from langchain_core.messages import HumanMessage, SystemMessage, AIMessage response = model.invoke([SystemMessage('你是一个作家。'), HumanMessage('你好'), AIMessage('你好。'), HumanMessage('你叫什么?')]) print(response.content) print('time:', time.time() - start) start = time.time() response = model.invoke('生成一首关于夏天的七言绝句。') print(response.content) print('time:', time.time() - start) if __name__ == '__main__': demo()