LangChain 响应缓存

在 LangChain 中,缓存机制是一种用于提升语言模型调用效率、降低成本的重要手段。其核心思想是:将提示词的响应结果缓存起来,在后续遇到相同或相似的请求时直接复用,从而避免重复调用模型。

1. 缓存策略

目前 LangChain 提供了两类主流的缓存方法:

  1. 基于 Prompt 文本匹配的缓存(非语义缓存)
  2. 基于 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()
未经允许不得转载:一亩三分地 » LangChain 响应缓存
评论 (0)

6 + 8 =