将您的LLM API削减10倍?,提高速度升至100倍⚡
? gptcache已与?l兰班(Langchain)完全集成在一起!以下是详细的用法说明。
? GPTCache Server Docker映像已发布,这意味着任何语言都可以使用GPTCACHE!
?该项目正在进行迅速发展,因此,API可能随时发生变化。有关最新信息,请参阅最新文档和发行说明。
注意:由于大型模型的数量正在爆炸性地增长,并且它们的API形状不断发展,因此我们不再为新的API或型号增加支持。我们鼓励使用GPTCACHE中使用GET和设置API,这是演示代码:https://github.com/zilliztech/gptcache/blob/blob/main/main/examples/adapter/api.py.py.py.py.py.py.py.py.py
pip install gptcache
Chatgpt和各种大型语言模型(LLMS)具有令人难以置信的多功能性,从而可以开发广泛的应用程序。但是,随着您的应用程序的普及并遇到较高的流量水平,与LLM API呼叫有关的费用可能会变得巨大。此外,LLM服务可能会表现出缓慢的响应时间,尤其是在处理大量请求时。
为了应对这一挑战,我们创建了GPTCACHE,该项目致力于构建用于存储LLM响应的语义缓存。
笔记:
python --versionpython -m pip install --upgrade pip 。 # clone GPTCache repo
git clone -b dev https://github.com/zilliztech/GPTCache.git
cd GPTCache
# install the repo
pip install -r requirements.txt
python setup.py install这些示例将帮助您了解如何使用缓存的精确匹配和类似的匹配。您也可以在Colab上运行示例。还有更多示例您可以参考训练营
在运行示例之前,请确保通过执行echo $OPENAI_API_KEY设置OpenAI_API_KEY环境变量。
如果尚未设置它,则可以通过使用Unix/Linux/MacOS系统上的export OPENAI_API_KEY=YOUR_API_KEY进行设置,或在Windows Systems上set OPENAI_API_KEY=YOUR_API_KEY 。
重要的是要注意,此方法仅暂时有效,因此,如果您想要永久效果,则需要修改环境变量配置文件。例如,在Mac上,您可以修改位于
/etc/profile文件。
import os
import time
import openai
def response_text ( openai_resp ):
return openai_resp [ 'choices' ][ 0 ][ 'message' ][ 'content' ]
question = 'what‘s chatgpt'
# OpenAI API original usage
openai . api_key = os . getenv ( "OPENAI_API_KEY" )
start_time = time . time ()
response = openai . ChatCompletion . create (
model = 'gpt-3.5-turbo' ,
messages = [
{
'role' : 'user' ,
'content' : question
}
],
)
print ( f'Question: { question } ' )
print ( "Time consuming: {:.2f}s" . format ( time . time () - start_time ))
print ( f'Answer: { response_text ( response ) } n ' )如果您向chatgpt提出完全相同的两个问题,则第二个问题的答案将从缓存中获得,而无需再次要求chatgpt。
import time
def response_text ( openai_resp ):
return openai_resp [ 'choices' ][ 0 ][ 'message' ][ 'content' ]
print ( "Cache loading....." )
# To use GPTCache, that's all you need
# -------------------------------------------------
from gptcache import cache
from gptcache . adapter import openai
cache . init ()
cache . set_openai_key ()
# -------------------------------------------------
question = "what's github"
for _ in range ( 2 ):
start_time = time . time ()
response = openai . ChatCompletion . create (
model = 'gpt-3.5-turbo' ,
messages = [
{
'role' : 'user' ,
'content' : question
}
],
)
print ( f'Question: { question } ' )
print ( "Time consuming: {:.2f}s" . format ( time . time () - start_time ))
print ( f'Answer: { response_text ( response ) } n ' )在回答几个类似问题的Chatgpt答案之后,可以从缓存中检索到后续问题的答案,而无需再次请求ChatGpt。
import time
def response_text ( openai_resp ):
return openai_resp [ 'choices' ][ 0 ][ 'message' ][ 'content' ]
from gptcache import cache
from gptcache . adapter import openai
from gptcache . embedding import Onnx
from gptcache . manager import CacheBase , VectorBase , get_data_manager
from gptcache . similarity_evaluation . distance import SearchDistanceEvaluation
print ( "Cache loading....." )
onnx = Onnx ()
data_manager = get_data_manager ( CacheBase ( "sqlite" ), VectorBase ( "faiss" , dimension = onnx . dimension ))
cache . init (
embedding_func = onnx . to_embeddings ,
data_manager = data_manager ,
similarity_evaluation = SearchDistanceEvaluation (),
)
cache . set_openai_key ()
questions = [
"what's github" ,
"can you explain what GitHub is" ,
"can you tell me more about GitHub" ,
"what is the purpose of GitHub"
]
for question in questions :
start_time = time . time ()
response = openai . ChatCompletion . create (
model = 'gpt-3.5-turbo' ,
messages = [
{
'role' : 'user' ,
'content' : question
}
],
)
print ( f'Question: { question } ' )
print ( "Time consuming: {:.2f}s" . format ( time . time () - start_time ))
print ( f'Answer: { response_text ( response ) } n ' )在请求API服务或型号时,您始终可以传递温度参数。
temperature范围为[0,2],默认值为0.0。较高的温度意味着更高的可能跳过缓存搜索并直接要求大型模型。当温度为2时,它将跳过缓存,并肯定会直接将请求发送到大型型号。当温度为0时,它将在请求大型型号服务之前搜索缓存。
默认的
post_process_messages_func是temperature_softmax。在这种情况下,请参阅API引用以了解temperature如何影响输出。
import time
from gptcache import cache , Config
from gptcache . manager import manager_factory
from gptcache . embedding import Onnx
from gptcache . processor . post import temperature_softmax
from gptcache . similarity_evaluation . distance import SearchDistanceEvaluation
from gptcache . adapter import openai
cache . set_openai_key ()
onnx = Onnx ()
data_manager = manager_factory ( "sqlite,faiss" , vector_params = { "dimension" : onnx . dimension })
cache . init (
embedding_func = onnx . to_embeddings ,
data_manager = data_manager ,
similarity_evaluation = SearchDistanceEvaluation (),
post_process_messages_func = temperature_softmax
)
# cache.config = Config(similarity_threshold=0.2)
question = "what's github"
for _ in range ( 3 ):
start = time . time ()
response = openai . ChatCompletion . create (
model = "gpt-3.5-turbo" ,
temperature = 1.0 , # Change temperature here
messages = [{
"role" : "user" ,
"content" : question
}],
)
print ( "Time elapsed:" , round ( time . time () - start , 3 ))
print ( "Answer:" , response [ "choices" ][ 0 ][ "message" ][ "content" ])要专门使用GPTCACHE,仅需要以下代码行,并且无需修改任何现有代码。
from gptcache import cache
from gptcache . adapter import openai
cache . init ()
cache . set_openai_key ()更多文档:
GPTCACHE提供以下主要好处:
在线服务经常展示数据局部性,用户经常访问流行或流行的内容。缓存系统通过存储通常访问的数据来利用此行为,从而减少数据检索时间,改善响应时间并减轻后端服务器的负担。传统的缓存系统通常使用新查询和缓存查询之间的精确匹配来确定在获取数据之前是否可以在缓存中可用的内容可用。
但是,由于LLM查询的复杂性和可变性,因此使用精确的LLM缓存方法效率较小,从而导致较低的缓存命中率。为了解决这个问题,GPTCACHE采用语义缓存等替代策略。语义缓存识别和存储相似或相关的查询,从而增加了缓存命中率并提高了总体缓存效率。
GPTCACHE采用嵌入算法将查询转换为嵌入式,并使用向量存储在这些嵌入式上进行相似性搜索。此过程使GPTCACHE可以从缓存存储中识别和检索相似或相关的查询,如模块部分所示。
GPTCACHE具有模块化设计,使用户可以轻松自定义自己的语义缓存。该系统为每个模块提供了各种实现,用户甚至可以开发自己的实现以适应其特定需求。
在语义缓存中,您可能会在缓存命中期间遇到误报,而在缓存错过期间的假否定性。 GPTCACHE提供了三个指标来衡量其性能,这对于开发人员优化其缓存系统很有帮助:
包括样本基准,以供用户开始评估其语义缓存的性能。

LLM适配器:LLM适配器旨在通过统一其API和请求协议来整合不同的LLM模型。 GPTCACHE为此目的提供了标准化的接口,并提供了ChatGPT集成的当前支持。
多模式适配器(实验) :多模式适配器旨在通过统一其API和请求协议来整合不同的大型多模型。 GPTCACHE为此目的提供了标准化的接口,并提供了对图像生成,音频转录集成的当前支持。
嵌入生成器:创建此模块是为了从请求中提取嵌入式以进行相似性搜索。 GPTCACHE提供了一个通用接口,该接口支持多个嵌入API,并提供一系列可供选择的解决方案。
缓存存储:缓存存储是存储LLM的响应的地方,例如ChatGpt。检索缓存的响应以帮助评估相似性,并在有良好的语义匹配的情况下返回请求者。目前,GPTCACHE支持SQLite,并提供了一个通用的接口,用于扩展此模块。
向量存储:矢量存储模块可帮助从输入请求的提取的嵌入中找到k最相似的请求。结果可以帮助评估相似性。 GPTCACHE提供了一个用户友好的接口,该接口支持各种向量商店,包括Milvus,Zilliz Cloud和Faiss。将来还会有更多选项。
缓存管理器:高速缓存管理器负责控制缓存存储和向量存储的操作。
cachetools或以Redis作为钥匙值商店的方式在内存中管理缓存驱逐。当前,GPTCACHE仅根据行数做出决定。这种方法可能导致资源评估不准确,并可能导致内置(OOM)错误。我们正在积极调查和制定更复杂的策略。
如果您使用内存中的缓存可以水平扩展GPTCACHE部署,那将是不可能的。由于缓存的信息将仅限于单个POD。
使用分布式缓存,缓存信息在所有复制品中都一致,我们可以使用Redis等分布式缓存商店。
相似性评估器:此模块从缓存存储和向量存储中收集数据,并使用各种策略来确定输入请求与矢量存储的请求之间的相似性。基于此相似性,它决定了请求是否匹配缓存。 GPTCACHE提供了一个标准化的接口,用于集成各种策略,以及用于使用的实现集合。目前支持或将来将支持以下相似性定义:
注意:并非不同模块的所有组合都可以彼此兼容。例如,如果我们禁用嵌入式提取器,则矢量存储可能无法按预期运行。我们目前正在努力实施GPTCACHE的组合理智检查。
即将推出!敬请关注!
通过新功能,增强的基础架构或改进的文档,我们对贡献非常开放。
有关如何贡献的全面说明,请参阅我们的贡献指南。