GPTCache:为LLM查询创建语义缓存的库#

将LLM API成本削减10倍💰,速度提升100倍⚡

Release pip download Codecov License Twitter Discord

🎉 GPTCache 已与 🦜️🔗LangChain 完全集成!这里是详细的使用说明

🐳 GPTCache服务器Docker镜像已发布,这意味着任何语言都能使用GPTCache了!

📔 本项目正在快速开发中,因此API可能会随时变更。如需获取最新信息,请参考最新的文档发布说明

快速安装#

pip install gptcache

🚀 什么是GPTCache?#

ChatGPT和各种大型语言模型(LLMs)拥有惊人的多功能性,能够支持开发各种应用程序。然而,随着应用程序的普及和遇到更高的流量水平,与LLM API调用相关的费用可能会变得相当可观。此外,LLM服务的响应时间可能较慢,特别是在处理大量请求时。

为了应对这一挑战,我们创建了GPTCache,这是一个致力于构建语义缓存以存储LLM响应的项目。

😊 快速开始#

注意:

  • 您可以快速尝试GPTCache并将其投入生产环境而无需大量开发工作。但请注意,该代码库仍在积极开发中。

  • 默认情况下,仅安装了有限数量的库来支持基本缓存功能。当您需要使用额外功能时,相关库将会自动安装

  • 确保Python版本为3.8.1或更高,检查方法:python --version

  • 如果因pip版本过低导致安装库时遇到问题,请运行:python -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上运行示例。更多示例可以参考Bootcamp

在运行示例之前,请确保通过执行echo $OPENAI_API_KEY来设置OPENAI_API_KEY环境变量。

如果尚未设置,可以在Unix/Linux/MacOS系统上使用export OPENAI_API_KEY=YOUR_API_KEY或在Windows系统上使用set OPENAI_API_KEY=YOUR_API_KEY进行设置。

需要注意的是,这种方法只是暂时有效,如果想要永久生效,需要修改环境变量配置文件。例如在Mac系统上,可以修改位于/etc/profile的文件。

Click to SHOW examples

OpenAI API 原始用法

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')

OpenAI API + GPTCache,精确匹配缓存

如果你向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')

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,使用temperature参数

在请求API服务或模型时,您可以随时传递temperature参数。

temperature 的范围是 [0, 2],默认值为 0.0。

较高的温度意味着更高的跳过缓存搜索并直接请求大模型的可能性。 当温度为2时,它一定会跳过缓存并直接向大模型发送请求。当温度为0时,它会在请求大模型服务前先搜索缓存。

默认的post_process_messages_functemperature_softmax。在这种情况下,请参考API reference了解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",
**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服务根据请求数量和token count的组合来收费。GPTCache通过缓存查询结果有效降低了您的开支,从而减少了发送给LLM服务的请求数量和token。因此,您可以在使用服务时享受更具成本效益的体验。

  • 性能提升: 大型语言模型(LLMs)使用生成式AI算法实时生成响应,这个过程有时可能很耗时。但当类似查询被缓存时,响应时间会显著改善,因为结果直接从缓存中获取,无需与LLM服务交互。在大多数情况下,GPTCache还能提供比标准LLM服务更优的查询吞吐量。

  • 灵活的开发与测试环境:作为开发LLM应用的开发者,您知道通常需要连接LLM API,并且在将应用迁移到生产环境之前进行全面测试至关重要。GPTCache提供了一个镜像LLM API的接口,并支持存储LLM生成的数据和模拟数据。这一功能让您能够轻松开发和测试应用,无需连接LLM服务。

  • 提升可扩展性和可用性: LLM服务通常会实施速率限制,这是API对用户或客户端在特定时间范围内访问服务器次数的约束。达到速率限制意味着额外的请求将被阻止,直到特定时间段过去,从而导致服务中断。使用GPTCache,您可以轻松扩展以容纳不断增长的查询量,确保随着应用程序用户群的扩大而保持一致的性能。

🤔 它是如何工作的?#

在线服务通常表现出数据局部性特征,用户频繁访问热门或趋势内容。缓存系统利用这一行为模式,通过存储经常被访问的数据来减少数据检索时间、提升响应速度,并减轻后端服务器负担。传统缓存系统通常采用新查询与缓存查询的精确匹配机制,在获取数据前判断请求内容是否已存在于缓存中。

然而,由于LLM查询的复杂性和多变性,采用精确匹配方法进行LLM缓存效果较差,导致缓存命中率低下。为解决这一问题,GPTCache采用了语义缓存等替代策略。语义缓存能够识别并存储相似或相关的查询,从而提高缓存命中概率并增强整体缓存效率。

GPTCache 采用嵌入算法将查询转换为嵌入向量,并利用向量存储对这些嵌入进行相似性搜索。这一过程使 GPTCache 能够从缓存存储中识别并检索相似或相关的查询,如模块部分所示。

GPTCache采用模块化设计,使用户能够轻松定制自己的语义缓存。该系统为每个模块提供了多种实现方式,用户甚至可以根据自己的特定需求开发自定义实现。

在语义缓存中,您可能会遇到缓存命中时的误报和缓存未命中时的漏报。GPTCache提供了三种指标来衡量其性能,这些指标有助于开发者优化其缓存系统:

  • 命中率: 该指标衡量缓存成功响应内容请求的能力,与其接收的请求总数之比。命中率越高表明缓存效率越高。

  • 延迟: 该指标衡量查询被处理以及从缓存中检索相应数据所需的时间。较低的延迟意味着缓存系统更高效、响应更迅速。

  • 召回率: 该指标表示缓存处理的查询数量占本应由缓存处理的总查询数量的比例。召回率百分比越高,表明缓存能有效提供合适的内容。

包含一个示例基准测试,供用户开始评估其语义缓存的性能。

🤗 模块#

GPTCache Struct
  • LLM适配器: LLM适配器旨在通过统一API和请求协议来集成不同的LLM模型。GPTCache为此提供了标准化接口,目前支持ChatGPT集成。

    • [x] 支持 OpenAI ChatGPT API。

    • [x] 支持 langchain

    • [x] 支持 minigpt4

    • [x] 支持 Llamacpp

    • [x] 支持 dolly

    • [ ] 支持其他LLM,例如Hugging Face Hub、Bard、Anthropic。

  • 多模态适配器(实验性): 多模态适配器旨在通过统一API和请求协议来集成不同的大型多模态模型。GPTCache为此提供了标准化接口,目前支持图像生成和音频转录的集成。

    • [x] 支持OpenAI图像创建API。

    • [x] 支持OpenAI音频转录API。

    • [x] 支持 Replicate BLIP API。

    • [x] 支持 Stability Inference API。

    • [x] 支持 Hugging Face Stable Diffusion 管道(本地推理)。

    • [ ] 支持其他多模态服务或自托管的大型多模态模型。

  • 嵌入生成器: 该模块用于从请求中提取嵌入向量以进行相似性搜索。GPTCache提供了一个通用接口,支持多种嵌入API,并提供了一系列可选解决方案。

    • [x] 禁用嵌入功能。这将使GPTCache变为一个关键词匹配缓存。

    • [x] 支持 OpenAI 嵌入 API。

    • [x] 支持 ONNX 与 GPTCache/paraphrase-albert-onnx 模型。

    • [x] 支持 Hugging Face 嵌入模型,包括 transformers、ViTModel、Data2VecAudio。

    • [x] 支持 Cohere 嵌入 API。

    • [x] 支持 fastText 嵌入。

    • [x] 支持 SentenceTransformers 嵌入。

    • [x] 支持 Timm 模型用于图像嵌入。

    • [ ] 支持其他嵌入API。

  • 缓存存储: 缓存存储是存储来自LLM(如ChatGPT)响应的地方。缓存的响应会被检索以帮助评估相似性,并在语义匹配良好时返回给请求者。目前,GPTCache支持SQLite,并为该模块的扩展提供了通用接口。

  • 向量存储: 向量存储模块帮助从输入请求提取的嵌入向量中找到K个最相似的请求。结果可用于评估相似度。GPTCache提供了用户友好的接口,支持多种向量存储方案,包括Milvus、Zilliz Cloud和FAISS。未来将会提供更多选择。

    • [x] 支持 Milvus,一个面向生产级AI/LLM应用的开源向量数据库。

    • [x] 支持 Zilliz Cloud,这是一个基于 Milvus 的全托管云向量数据库。

    • [x] 支持 Milvus Lite,这是一个可以嵌入到Python应用中的轻量级Milvus版本。

    • [x] 支持 FAISS,这是一个用于高效相似性搜索和密集向量聚类的库。

    • [x] 支持 Hnswlib,这是一个仅头文件的C++/python库,用于快速近似最近邻搜索。

    • [x] 支持 PGVector,Postgres的开源向量相似性搜索。

    • [x] 支持 Chroma,AI原生的开源嵌入数据库。

    • [x] 支持 DocArray,DocArray 是一个用于表示、发送和存储多模态数据的库,非常适合机器学习应用。

    • [ ] 支持 qdrant

    • [ ] 支持 weaviate

    • [ ] 支持其他向量数据库。

  • 缓存管理器: 缓存管理器负责控制缓存存储向量存储的运行。

    • 淘汰策略: 目前,GPTCache仅根据行数来决定淘汰内容。这种方法可能导致资源评估不准确,并可能引发内存不足(OOM)错误。我们正在积极研究和开发更复杂的策略。

      • [x] 支持LRU淘汰策略。

      • [x] 支持FIFO(先进先出)淘汰策略。

      • [ ] 支持更复杂的淘汰策略。

  • 相似度评估器: 该模块从缓存存储向量存储中收集数据,并使用多种策略来确定输入请求与向量存储中请求之间的相似度。基于此相似度,它判断请求是否匹配缓存。GPTCache提供了标准化接口用于集成各种策略,以及一系列现成的实现。目前支持或未来将支持的相似度定义如下:

    • [x] 我们从向量存储中获取的距离。

    • [x] 基于模型的相似度判定,使用来自ONNX的GPTCache/albert-duplicate-onnx模型。

    • [x] 输入请求与从向量存储获取的请求之间的精确匹配。

    • [x] 通过应用numpy中的linalg.norm来计算嵌入向量之间的距离。

    • [ ] BM25 和其他相似度测量方法。

    • [ ] 支持其他模型服务框架,例如 PyTorch。

    注意:并非所有不同模块的组合都能相互兼容。例如,如果我们禁用Embedding ExtractorVector Store可能无法按预期工作。我们目前正在为GPTCache实现组合合理性检查。

😇 路线图#

即将推出!敬请期待!

😍 贡献#

我们非常欢迎各种形式的贡献,无论是通过新功能、增强基础设施还是改进文档。

有关如何贡献的完整说明,请参阅我们的贡献指南