对此,Zilliz 软件工程师 Filip Haltmayer 指出,将 GPTCache 与 LangChain 集成,可以有效解决这一问题。
GPTCache 是一个用于存储 LLM 响应的语义缓存层。它可以为 LLM 相关应用构建相似语义缓存,当相似的问题请求多次出现时,可以直接从缓存中获取,在减少请求响应时间的同时也降低了 LLM 的使用成本。
本文为解码 LangChain 系列,将从 GPTCache 的适用场景出发,厘清 GPTCache 和 LangChain 集成的原理,并附赠集成教程。
01.
GPTCache 的功能和原理
- GPTCache 能做什么?
- 降低 LLM 使用费用:目前大多数LLM服务均通过请求token数进行计费,当请求使用缓存结果,自然降低请求次数,则减少了LLM使用成本;
- 性能优化:相比于大模型的推理时间,从缓存数据中获取时间将降低一个数量级;
- 兼容性强,适用于多种应用场景:GPTCache 提供多种 LLM 的镜像接口,只需修改 import 路径,即可缓存 LLM 请求;
- 改善LLM服务的可扩展性和可用性:目前 LLM 服务都有请求速率限制,达到这一限制则服务无法进行响应。如果对于相似的问题使用缓存答案,将有效缓解服务无法响应这一问题。
- GPTCache 的推荐场景有哪些?
- 某一垂直领域的 LLM 相关应用,如法律、生物、医学等;
- 固定的 LLM 相关应用,如某公司内部或个人使用的 ChatBot;
- 开发的 LLM 应用在某些时间内的请求具有高度相似性,如节日祝福语模版等;
- 具有大用户群体的 LLM 应用,如果给用户群体进行分类,类似用户用同一缓存。
LangChain 的大型语言模型(LLM)是一种革命性的技术,允许开发人员构建许多在以前不可想象的应用。然而,仅依靠单个 LLM 就创建一整套应用是几乎不可能的。因此,我们需要将 LLM 与其他计算资源或知识源进行结合。 LangChain 就能帮助我们将 LLM 和其他知识相结合,从而开发出完美的应用。
02.
LangChain 缓存分析
- LangChain 的缓存方式
在学习如何集成 GPTCache 之前,我们先来看看 LangChain 是如何实现缓存的。事实上,LangChain 缓存是通过字符串匹配来实现的。也就是说,如果有两个请求字符串完全相同,那么收到后一个请求时,可以从缓存中检索出相应的数据。具体实现过程中使用了内存缓存(Memory Cache)、SQ Lite 缓存 (SQLite Cache)和 Redis 缓存(Redis Cache)。
LangChain 缓存的使用方法大致如下:
代码语言:javascript复制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 就是方法之一。
03.
集成 GPTCache
集成 GPTCache 能够显着提升 LangChain 缓存模块的功能,增加缓存命中率,从而降低 LLM 使用成本和响应时间。GPTCache 首先将输入的问题转化为 embedding 向量,随后 GPTCache 会在缓存中进行向量近似搜索。获取向量相似性检索的结果后,GPTCache 会执行相似性评估,并将达到设置阈值的结果作为最终返回结果。大家可以通过调整阈值来调节 GPTCache 模糊搜索结果的准确性。
以下示例中在 LangChain 中集成了 GPTCache,并使用了 GPTCache 进行向量相似性检索。
代码语言:javascript复制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 应用的小秘籍,敬请期待!