概要
在处理大规模语言模型(LLMs)时,频繁的API调用不仅耗费时间和金钱,还可能导致不必要的延迟。为了解决这个问题,LangChain 提供了一种缓存机制,通过存储先前请求的结果来避免重复调用相同的API。本文将详细介绍 LangChain 的缓存机制及其使用方法。
缓存的重要性
缓存对于提高应用程序的性能和减少成本有着重要的意义:
节省资金:如果您的应用程序频繁请求相同的完成结果,缓存可以帮助减少对LLM提供商的API调用次数,从而节省资金。
加速应用:通过减少API调用次数,缓存还可以加快应用程序的响应速度,提升用户体验。
整体架构流程
启用缓存
启用LangChain的缓存功能非常简单,只需几行代码即可完成。下面我们将通过具体的例子来展示如何启用内存缓存。
首先,我们需要初始化一个ChatOpenAI实例,这将是我们的LLM客户端:
然后,我们可以尝试不使用缓存的情况下调用一次:
# 初始化客户端
from langchain_community.llms.ollama import Ollama
ollama_client = Ollama(model="qwen:7b")
ollama_client.invoke("请问2只兔子有多少条腿?")
接下来,我们将启用内存缓存:
from langchain.globals import set_llm_cache
from langchain.cache import InMemoryCache
set_llm_cache(InMemoryCache())
然后创建一个请求链
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("请根据下面的主题写一篇小红书营销的短文: {topic}")
output_parser = StrOutputParser()
chain = prompt | ollama_client | output_parser
首次调用请求链
chain.invoke({"topic": "康师傅绿茶"})
次调用相同的主题,这次应该从缓存中获取结果:
chain.invoke({"topic": "康师傅绿茶"})
可以看到,第二次调用的速度更快,因为它直接从缓存中读取了结果。
SQLite 缓存
除了内存缓存之外,LangChain 还支持使用 SQLite 数据库存储缓存。SQLite 是一种轻量级的数据库,非常适合用于缓存数据,特别是当需要持久化存储时。
启用 SQLite 缓存
启用 SQLite 缓存的步骤与内存缓存类似,只需更改缓存的类型即可:
from langchain.cache import SQLiteCache
set_llm_cache(SQLiteCache(database_path="./db/langchain.db"))
现在,我们可以使用 SQLite 缓存来处理一个新的请求:
chain.invoke({"topic": "旺仔小馒头"})
再次调用相同的主题,这次也应该从缓存中获取结果:
chain.invoke({"topic": "旺仔小馒头"})
小结
通过启用LangChain的缓存功能,您可以显著减少对LLM提供商的API调用次数,从而节省成本并提高应用程序的响应速度。本文介绍了如何使用内存缓存和SQLite缓存两种方式来实现这一目标。希望这篇博客能够帮助您更好地理解和应用LangChain的缓存机制。