GPTCache介绍
ChatGPT和其他大型语言模型(LLM)具有令人难以置信的多功能性,可用于广泛的应用程序开发。然而,随着对应开发的应用程序受欢迎程度的提高和流量级别的增加,与LLM API调用相关的费用可能会变得非常高昂。此外,当处理大量请求时,LLM服务可能会表现出缓慢的响应时间。
为了应对这一挑战,我们创建了GPTCache项目,该项目致力于构建用于存储LLM响应的语义缓存。
LangChain 介绍
大型语言模型 (LLM) 正在成为一种变革性技术,使开发人员能够构建以前无法实现的应用程序。然而,仅仅依靠单个 LLM 往往难以创建一个真正强大的应用程序。真正的力量在于将它们与其他计算或知识来源相结合。因此,LangChain这个库旨在协助开发这些类型的应用程序。
LangChain 缓存现状
在接入GPTCache之前,LangChain的缓存是基于字符串匹配实现,也就是只有当字符完全一致的两个请求,后者从缓存中获得相应的数据,其实现包括了:Memory Cache
, SQLite Cache
, Redis Cache
。
用法大致如下:
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")
LangChain 缓存分析
从运行时间时间角度,可以清晰看出如果请求命中缓存,将大幅度减少请求响应时间。同时目前LLM的使用成本还是相对较高的,使用在线服务,如OpenAI、Cohere等,一般通过token进行计费;或者自己部署响应的LLM模型,其一次推理耗时取决于计算机资源多少,包括CPU、内存、GPU等,同时如果并发进行多个请求处理,对于计算资源则有更高的要求。如果请求可以多次命中缓存,则可以有效减少计算机资源压力,同时也可以给其他任务更多的计算机资源。
LangChain命中缓存的条件是,必须是完全相同的两个问题,在实际使用过程,要命中缓存还是有一定难度,其缓存利用率有比较大的提升空间。
GPTCache 接入
GPTCache的接入,将可以很好的完善LangChain缓存模块的功能,提高缓存命中率,从而降低LLM使用成本和响应时间。因为GPTCache会先讲输入进行embedding操作,得到向量后,然后在Cache存储中进行向量近似搜索,得到搜索结果后进行相似评估,达到设定阈值后在进行返回。可以通过调节阈值,改变其模糊搜索结果的精确度。
LangChain中使用GPTCache的相似搜索例子:
i = 0
file_prefix = "data_map"
llm_cache = Cache()
def init_gptcache_map(cache_obj: gptcache.Cache):
global i
onnx = Onnx()
cache_base = CacheBase('sqlite', sql_url=f'sqlite:///./sqlite_{i}.db')
vector_base = VectorBase('faiss', dimension=onnx.dimension, index_path=f'faiss_{i}.index')
data_manager = get_data_manager(cache_base, vector_base)
cache_obj.init(
pre_embedding_func=get_prompt,
embedding_func=onnx.to_embeddings,
data_manager=data_manager,
similarity_evaluation=SearchDistanceEvaluation(),
)
i += 1
langchain.llm_cache = GPTCache(init_gptcache_map)
# CPU times: user 1.01 s, sys: 153 ms, total: 1.16 s
# Wall time: 2.49 s
llm("Tell me a joke")
# This is not an exact match, but semantically within distance so it hits!
# CPU times: user 737 ms, sys: 7.79 ms, total: 745 ms
# Wall time: 135 ms
llm("Tell me joke")
参考链接: