解码 LangChain | LangChain + GPTCache =强强联合
本文为解码 LangChain 系列,将从 GPTCache 的适用场景出发,厘清 GPTCache 和 LangChain 集成的原理,并附赠集成教程。
上周我们邀请到了 LangChain 联合创始人 Harrison Chase 分享【如何用 LangChain 和 Milvus 进行检索】,Harrison 提到,多跳问题会给语义检索带来挑战,并提出可以试用 AI 代理工具解决。不过,频繁调用 LLM 会导致出现使用成本高昂的问题。
对此,Zilliz 软件工程师 Filip Haltmayer 指出,将 GPTCache 与 LangChain 集成,可以有效解决这一问题。
GPTCache 是一个用于存储 LLM 响应的语义缓存层。它可以为 LLM 相关应用构建相似语义缓存,当相似的问题请求多次出现时,可以直接从缓存中获取,在减少请求响应时间的同时也降低了 LLM 的使用成本。
本文为解码 LangChain 系列,将从 GPTCache 的适用场景出发,厘清 GPTCache 和 LangChain 集成的原理,并附赠集成教程。
GPTCache 的功能和原理
GPTCache 能做什么?
- 降低 LLM 使用费用:目前大多数LLM服务均通过请求token数进行计费,当请求使用缓存结果,自然降低请求次数,则减少了LLM使用成本;
- 性能优化:相比于大模型的推理时间,从缓存数据中获取时间将降低一个数量级;
- 兼容性强,适用于多种应用场景:GPTCache 提供多种 LLM 的镜像接口,只需修改 import 路径,即可缓存 LLM 请求;
- 改善LLM服务的可扩展性和可用性:目前 LLM 服务都有请求速率限制,达到这一限制则服务无法进行响应。如果对于相似的问题使用缓存答案,将有效缓解服务无法响应这一问题。
GPTCache 的推荐场景有哪些?
- 某一垂直领域的 LLM 相关应用,如法律、生物、医学等;
- 固定的 LLM 相关应用,如某公司内部或个人使用的 ChatBot;
- 开发的 LLM 应用在某些时间内的请求具有高度相似性,如节日祝福语模版等;
- 具有大用户群体的 LLM 应用,如果给用户群体进行分类,类似用户用同一缓存。
LangChain 的大型语言模型(LLM)是一种革命性的技术,允许开发人员构建许多在以前不可想象的应用。然而,仅依靠单个 LLM 就创建一整套应用是几乎不可能的。因此,我们需要将 LLM 与其他计算资源或知识源进行结合。 LangChain 就能帮助我们将 LLM 和其他知识相结合,从而开发出完美的应用。
LangChain 缓存分析
LangChain 的缓存方式
在学习如何集成 GPTCache 之前,我们先来看看 LangChain 是如何实现缓存的。事实上,LangChain 缓存是通过字符串匹配来实现的。也就是说,如果有两个请求字符串完全相同,那么收到后一个请求时,可以从缓存中检索出相应的数据。具体实现过程中使用了内存缓存(Memory Cache)、SQ Lite 缓存 (SQLite Cache)和 Redis 缓存(Redis Cache)。
LangChain 缓存的使用方法大致如下:
import langchain
from langchain.cache import InMemoryCache
langchain.llm_cache = InMemoryCache()
llm = OpenAI(model_name="text-davinci-002", n=2, best_of=2)
// CPU times: user 14.2 ms, sys: 4.9 ms, total: 19.1 ms
// Wall time: 1.1 s
llm("Tell me a joke")
// CPU times: user 162 µs, sys: 7 µs, total: 169 µs
// Wall time: 175 µs
llm("Tell me a joke")
从运行角度来看,如果请求命中缓存,那么响应时间会显著缩短。不过,我们还需要思考另一个问题,即 LLM 高昂的使用成本问题。
我们都知道,使用 OpenAI 和 Cohere 等在线服务通常需要 token,部署相应的 LLM 模型也会产生费用。单次 LLM 推理(inference)时间取决于你的计算资源量,包括 CPU、内存、GPU 等。如果需要同时处理多个请求,对计算资源的要求就更高。如果请求多次命中缓存,则可以减少对计算机资源的压力,并合理地将更多的计算资源分配给其他任务。
LangChain 命中缓存的条件是两个问题必须完全相同。但是在实际使用中,这种情况十分罕见,因此很难命中缓存。这也意味着,我们还有很多空间可以用来提升缓存利用率,集成 GPTCache 就是方法之一。
集成 GPTCache
集成 GPTCache 能够显着提升 LangChain 缓存模块的功能,增加缓存命中率,从而降低 LLM 使用成本和响应时间。GPTCache 首先将输入的问题转化为 embedding 向量,随后 GPTCache 会在缓存中进行向量近似搜索。获取向量相似性检索的结果后,GPTCache 会执行相似性评估,并将达到设置阈值的结果作为最终返回结果。大家可以通过调整阈值来调节 GPTCache 模糊搜索结果的准确性。
以下示例中在 LangChain 中集成了 GPTCache,并使用了 GPTCache 进行向量相似性检索。
from gptcache import Cache
from gptcache.adapter.api import init_similar_cache
from langchain.cache import GPTCache
import hashlib
def get_hashed_name(name):
return hashlib.sha256(name.encode()).hexdigest()
def init_gptcache(cache_obj: Cache, llm: str):
hashed_llm = get_hashed_name(llm)
init_similar_cache(cache_obj=cache_obj, data_dir=f"similar_cache_{hashed_llm}")
langchain.llm_cache = GPTCache(init_gptcache)
# The first time, it is not yet in cache, so it should take longer
# CPU times: user 1.42 s, sys: 279 ms, total: 1.7 s
# Wall time: 8.44 s
llm("Tell me a joke")
# This is an exact match, so it finds it in the cache
# CPU times: user 866 ms, sys: 20 ms, total: 886 ms
# Wall time: 226 ms
llm("Tell me a joke")
# This is not an exact match, but semantically within distance so it hits!
# CPU times: user 853 ms, sys: 14.8 ms, total: 868 ms
# Wall time: 224 ms
llm("Tell me joke")
以上就是关于 GPTCache 和 LangChain 集成的全部内容。大家如果想了解更多关于 LangChain 和 Milvus 集成的内容,可以阅读《LLMs 诸神之战:LangChain ,以【奥德赛】之名》。
预告一下,解码 LangChain 系列的下一篇将详解如何用 LangChain 和 Milvus 增强 LLM 应用,以及构建和优化 AIGC 应用的小秘籍,敬请期待!