OA0
OA0 是一个探索 AI 的社区
现在注册
已注册用户请  登录
OA0  ›  代码  ›  GPTCache — 为大模型应用提供语义缓存,降低成本与延迟

GPTCache — 为大模型应用提供语义缓存,降低成本与延迟

 
  believe ·  2026-03-19 11:00:22 · 5 次点击  · 0 条评论  

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

将 LLM API 成本降低 10 倍 💰,速度提升 100 倍 ⚡

Release
pip download
Codecov
License
Twitter
Discord

🎉 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

🚀 什么是 GPTCache?

ChatGPT 和各种大语言模型 (LLM) 具有惊人的多功能性,能够开发广泛的应用。然而,随着应用日益流行并遇到更高的流量水平,与 LLM API 调用相关的费用可能变得相当可观。此外,LLM 服务可能响应缓慢,尤其是在处理大量请求时。

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

😊 快速开始

注意

  • 您可以快速尝试 GPTCache 并将其投入生产环境,无需大量开发。但请注意,该仓库仍在大力开发中。
  • 默认情况下,仅安装了有限数量的库以支持基本的缓存功能。当您需要使用额外功能时,相关库将自动安装
  • 确保 Python 版本为 3.8.1 或更高,检查命令:python --version
  • 如果因 pip 版本过低而遇到安装库的问题,请运行:python -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 的文件。

点击 展开 示例代码 #### 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 原始用法
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 服务根据请求数量和令牌数的组合收费。GPTCache 通过缓存查询结果有效降低了您的费用,从而减少了发送到 LLM 服务的请求数和令牌数。因此,您可以在使用服务时享受更具成本效益的体验。
  • 提升性能:LLM 使用生成式 AI 算法实时生成响应,这个过程有时可能很耗时。然而,当缓存了类似的查询时,响应时间会显著提高,因为结果直接从缓存中获取,无需与 LLM 服务交互。在大多数情况下,GPTCache 还可以提供比标准 LLM 服务更优的查询吞吐量。
  • 灵活的开发与测试环境:作为开发 LLM 应用的开发者,您知道通常需要连接到 LLM API,并且在将应用移至生产环境之前进行全面测试至关重要。GPTCache 提供了一个镜像 LLM API 的接口,并支持存储 LLM 生成的数据和模拟数据。此功能使您能够轻松开发和测试您的应用,无需连接到 LLM 服务。
  • 提高可扩展性和可用性:LLM 服务经常强制执行速率限制,这是 API 对用户或客户端在给定时间段内访问服务器次数施加的限制。达到速率限制意味着在特定时间段过去之前,额外的请求将被阻止,导致服务中断。使用 GPTCache,您可以轻松扩展以适应不断增长的查询量,确保随着应用用户群的扩大,性能保持一致。

🤔 它是如何工作的?

在线服务通常表现出数据局部性,用户经常访问流行或热门内容。缓存系统利用这种行为存储常用数据,从而减少数据检索时间、提高响应速度并减轻后端服务器的负担。传统的缓存系统通常利用新查询与缓存查询之间的精确匹配来确定请求的内容是否在缓存中可用,然后再获取数据。

然而,对于 LLM 缓存,使用精确匹配方法效果较差,因为 LLM 查询的复杂性和可变性导致缓存命中率低。为了解决这个问题,GPTCache 采用了替代策略,如语义缓存。语义缓存识别并存储相似或相关的查询,从而增加缓存命中概率并提高整体缓存效率。

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

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

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

  • 命中率:此指标量化缓存成功满足内容请求的能力,与其接收的请求总数相比。更高的命中率表示缓存更有效。
  • 延迟:此指标测量查询被处理以及从缓存中检索相应数据所需的时间。更低的延迟意味着更高效和响应更快的缓存系统。
  • 召回率:此指标表示缓存服务的查询占应由缓存服务的总查询数的比例。更高的召回率百分比表明缓存正在有效地服务适当的内容。

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

🤗 模块

GPTCache 结构

  • 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 Pipeline(本地推理)。
  • [ ] 支持其他多模态服务或自托管大型多模态模型。
  • 嵌入生成器
    创建此模块是为了从请求中提取嵌入以进行相似性搜索。GPTCache 提供了一个支持多种嵌入 API 的通用接口,并提供了一系列解决方案供选择。
  • [x] 禁用嵌入。这将把 GPTCache 变成关键字匹配缓存。
  • [x] 支持 OpenAI 嵌入
5 次点击  ∙  0 人收藏  
登录后收藏  
0 条回复
关于 ·  帮助 ·  PING ·  隐私政策 ·  服务条款   
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
耗时 25 ms
Developed with Cursor