在 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()

冀公网安备13050302001966号