将 LLM API 成本降低 10 倍 💰,速度提升 100 倍 ⚡
🎉 GPTCache 已与 🦜️🔗LangChain 完全集成!详细使用说明请见此处。
🐳 GPTCache 服务器 Docker 镜像已发布,这意味着任何语言都能使用 GPTCache!
📔 本项目正在快速开发中,因此 API 可能随时更改。请参考最新的文档和发布说明以获取最新信息。
注意: 由于大模型数量爆炸式增长且其 API 形态不断演变,我们不再为新的 API 或模型添加支持。我们鼓励使用 GPTCache 中的 get 和 set API,演示代码请见:https://github.com/zilliztech/GPTCache/blob/main/examples/adapter/api.py
pip install gptcache
ChatGPT 和各种大语言模型 (LLM) 具有惊人的多功能性,能够开发广泛的应用。然而,随着应用日益流行并遇到更高的流量水平,与 LLM API 调用相关的费用可能变得相当可观。此外,LLM 服务可能响应缓慢,尤其是在处理大量请求时。
为了应对这一挑战,我们创建了 GPTCache,这是一个致力于构建用于存储 LLM 响应的语义缓存的项目。
注意:
python --versionpython -m pip install --upgrade pip。# 克隆 GPTCache 仓库
git clone -b dev https://github.com/zilliztech/GPTCache.git
cd GPTCache
# 安装仓库
pip install -r requirements.txt
python setup.py install
这些示例将帮助您了解如何结合缓存使用精确匹配和相似匹配。您也可以在 Colab 上运行示例。更多示例请参考 Bootcamp。
运行示例前,请确保已设置 OPENAI_API_KEY 环境变量,可通过执行 echo $OPENAI_API_KEY 检查。
如果尚未设置,在 Unix/Linux/MacOS 系统上可使用 export OPENAI_API_KEY=YOUR_API_KEY,在 Windows 系统上可使用 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 原始用法
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')
#### OpenAI API + GPTCache,精确匹配缓存
> 如果您向 ChatGPT 提出完全相同的两个问题,第二个问题的答案将从缓存中获取,无需再次请求 ChatGPT。
import time
def response_text(openai_resp):
return openai_resp['choices'][0]['message']['content']
print("Cache loading.....")
# 使用 GPTCache,仅需以下代码
# -------------------------------------------------
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')
#### OpenAI API + GPTCache,相似搜索缓存
> 在从 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')
#### OpenAI API + GPTCache,使用温度参数
> 您可以在请求 API 服务或模型时传递温度参数。
>
> `temperature` 的范围是 [0, 2],默认值为 0.0。
>
> 较高的温度意味着更高的可能性跳过缓存搜索并直接请求大模型。
> 当温度为 2 时,它将跳过缓存并直接向大模型发送请求。当温度为 0 时,它将在请求大模型服务前搜索缓存。
>
> 默认的 `post_process_messages_func` 是 `temperature_softmax`。在这种情况下,请参考 [API 参考](https://gptcache.readthedocs.io/en/latest/references/processor.html#module-gptcache.processor.post) 了解 `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, # 在此处更改温度
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 提供了三个指标来衡量其性能,有助于开发者优化其缓存系统:
包含一个示例基准测试,供用户开始评估其语义缓存的性能。
