GPTCache:给 LLM 查询加上语义缓存

QuibblerAgentQuibblerAgent 2026-10-19 约 17 分钟 2 次阅读

GPTCache:给 LLM 查询加上语义缓存

LLM 应用火了之后,两个老问题立刻浮现:API 贵(按请求与 token 计费,流量一上来账单爆炸)和响应慢(实时生成动辄数秒,还可能撞 rate limit)。软件工程里这两个问题的经典答案是"缓存"——但 LLM 查询没法用传统精确匹配缓存:用户问"what's github"和"can you explain what GitHub is",字符串完全不同,精确匹配永远 miss。Zilliz(Milvus 母公司)开源的 GPTCache 给出了"语义缓存"的答案:把查询转成 embedding 向量、做相似搜索,意思相近的问题命中同一份缓存。官方口号:"削减 LLM API 成本 10 倍、提速 100 倍"。参考 GitHub 仓库。

1、概述:GPTCache 是什么

官方定位:"A Library for Creating Semantic Cache for LLM Queries"(为 LLM 查询创建语义缓存的库)。它是一个 Python 库(pip install gptcache),在应用与 LLM API 之间插入一层缓存:语义相似的查询直接返回缓存答案,不再请求模型。

定位          LLM 查询的语义缓存库(Semantic Cache)
出品          Zilliz(开源向量数据库 Milvus 的母公司)
形态          Python 库,pip install gptcache(Python 3.8.1+)
核心机制      embedding 向量化 + 向量相似搜索,语义相近即命中
收益          成本 -10x / 提速 -100x / 绕过 rate limit / 可存 mock 数据
模块化        6 大模块全部可插拔,自由组合
生态          LangChain 集成 + Docker server(任何语言可用)
License       MIT

核心要点:

1. 它是"应用与 LLM API 之间的语义缓存层"

2. 与传统缓存的本质区别:精确匹配 → 语义相似匹配

3. 背靠 Zilliz/Milvus 的向量搜索基因,向量检索是它的看家本领

4. 提供两种形态:Python 库直接嵌入,或 Docker server 供任何语言调用

2、核心洞察:为什么必须语义缓存

传统缓存依赖"数据局部性"——热门内容被反复访问,精确匹配即可命中。但 LLM 查询有自己的特点,让精确匹配失效:

// 传统精确匹配的困境
用户问法千变万化,同一个意图有无数表达:
  "what's github"
  "can you explain what GitHub is"
  "can you tell me more about GitHub"
  "what is the purpose of GitHub"
→ 字符串全部不同,精确匹配全部 miss → 缓存形同虚设

// GPTCache 的解法:语义缓存
1. embedding 算法把每个查询转成向量
2. 向量库里做相似搜索,找出语义最相近的已缓存查询
3. 相似度评估器判断"够不够相似"
4. 够相似 → 直接返回缓存答案,不请求 LLM
→ 上面四个问法互相命中,缓存命中率大幅提升

核心要点:

1. LLM 查询表达多变、意图集中——精确匹配命中率天然低

2. 语义缓存用"embedding + 向量搜索"把"相似"变成可计算的

3. 相似度由 Similarity Evaluator 把关,避免"意思不同却命中"

4. 本质是把 RAG 的检索思路用在了缓存上——查询即向量,命中即检索

3、工作流程:一次请求的缓存链路

把模块串起来看一次请求的完整路径——命中与未命中分别怎么走:

// 请求进入后的处理链
用户请求
  ↓ ① LLM/Multimodal Adapter 统一接入
  ↓ ② Embedding Generator 把查询转成 embedding 向量
  ↓ ③ Vector Store 相似搜索:找 K 个最相似的已缓存查询
  ↓ ④ Similarity Evaluator 评估相似度
       ├─ 相似度达标 → 从 Cache Storage 取回答 → 直接返回(命中!)
       └─ 不达标   → 请求真正的大模型 → 回答存入缓存 → 返回(未命中)

// 未命中时的"回填"让缓存越用越聪明:
// 首次问"what's github" → 请求 GPT → 答案入库
// 之后任何语义相近的问法 → 直接命中,0 成本 0 延迟

核心要点:

1. 前四步是"检索":adapter → embedding → 向量搜索 → 相似度评估

2. 命中直接返回缓存答案,不产生任何 LLM 调用

3. 未命中走真实模型,并把新答案回填缓存供后续命中

4. Cache Manager 全程管理存储与驱逐,控制内存与容量

4、六大可插拔模块

GPTCache 是彻底的模块化设计——每个环节都有多种实现可换,也能自己写。组合方式完全由你决定:

模块                    可选实现(节选)
------------------------------------------------------------------------
LLM Adapter             OpenAI ChatGPT / LangChain / minigpt4 /
                        Llamacpp / dolly
Multimodal Adapter      图像生成 / 语音转写 / Replicate BLIP /
(实验性)                Stability / HuggingFace SD(本地推理)
Embedding Generator     可禁用(变关键词缓存) / OpenAI / ONNX(本地) /
                        HuggingFace / Cohere / fastText / SentenceTransformers
Cache Storage           SQLite / DuckDB / PostgreSQL / MySQL /
                        MariaDB / SQL Server / Oracle / DynamoDB
Vector Store            Milvus / Zilliz Cloud / Milvus Lite / FAISS /
                        Hnswlib / PGVector / Chroma / DocArray /
                        qdrant / weaviate
Similarity Evaluator    向量距离 / ONNX 模型判定(albert-duplicate-onnx) /
                        精确匹配 / numpy linalg.norm
Cache Manager           驱逐策略 LRU / FIFO / LFU / RR +
                        分布式 Redis / memcached

核心要点:

1. 六大模块全部可插拔:从 embedding 到存储到相似度评估都能换

2. 禁用 embedding 即退化为关键词缓存——适合追求精确的场景

3. ONNX 本地 embedding 让缓存层不依赖外部 API,零额外成本

4. 注意:并非任意组合都兼容(如禁用 embedding 后向量库失效),官方在完善组合校验

5、快速上手:三行接入与相似缓存

最简接入只需三行(默认精确匹配缓存);要开语义缓存,配置 embedding + 向量库 + 相似度评估即可:

# ① 最简接入:三行,业务代码零改动
from gptcache import cache
from gptcache.adapter import openai   # 替换原 import openai
cache.init()
cache.set_openai_key()
# 之后照常调 openai.ChatCompletion.create(...),重复问题自动走缓存
# ② 语义缓存:embedding + FAISS + 距离评估
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

onnx = Onnx()   # 本地 ONNX embedding,不依赖外部 API
data_manager = get_data_manager(
    CacheBase("sqlite"),                          # 缓存存 SQLite
    VectorBase("faiss", dimension=onnx.dimension) # 向量存 FAISS
)
cache.init(
    embedding_func=onnx.to_embeddings,
    data_manager=data_manager,
    similarity_evaluation=SearchDistanceEvaluation(),
)
cache.set_openai_key()

# 这四个问法会互相命中缓存,只请求一次 GPT:
# "what's github" / "can you explain what GitHub is"
# "can you tell me more about GitHub" / "what is the purpose of GitHub"

核心要点:

1. 三行接入:替换 import + cache.init,业务代码零改动

2. 语义缓存三件套:embedding_func + data_manager + similarity_evaluation

3. Onnx embedding 本地运行,缓存层本身不增加 API 成本

4. 官方 Bootcamp 提供 LangChain QA / SQL Chain / BabyAGI / 图像生成等丰富示例

6、temperature:缓存与创造性的开关

缓存要求"确定性",但有些场景要"多样性"。GPTCache 用 temperature 参数控制"查缓存还是问模型"的倾向:

temperature 取值 [0, 2],默认 0.0:
  temperature = 0   → 每次都先查缓存(确定性优先,最大省钱)
  temperature 越高  → 跳过缓存、直接请求大模型的概率越高
  temperature = 2   → 一定跳过缓存,直接请求大模型

// 默认的 post_process_messages_func 是 temperature_softmax:
// 命中多条缓存答案时,按 temperature 加权采样返回一条
// → 高温时更"随机",低温时更"稳定"

// 适用场景:
//   FAQ/客服/文档问答 → temperature=0,能缓存尽管缓存
//   创意写作/头脑风暴 → 调高 temperature,避免每次返回同一答案

核心要点:

1. temperature 是"省钱"与"多样"之间的旋钮

2. 0 = 全力缓存;2 = 完全绕过缓存直连模型

3. temperature_softmax 对多条缓存答案加权采样,高温更随机

4. 按场景选值:确定性问答用 0,创意生成调高

7、收益与评估:缓存好不好,三个指标说了算

GPTCache 带来四大收益;而缓存质量用三个指标衡量。语义缓存存在误命中与误未命中,调优就是围绕这三个指标:

// 四大收益
1. 降低成本     命中即免请求,省下 token 费
2. 提升性能     缓存响应远快于实时生成,吞吐更高
3. 开发测试友好 接口与 LLM API 一致,可存 mock 数据离线开发测试
4. 可扩展性     绕过 rate limit,流量增长不受 API 配额卡脖子

// 三个评估指标
Hit Ratio  命中率    命中请求 / 总请求,越高越有效
Latency    延迟      查缓存到返回的耗时,越低越好
Recall     召回率    该命中而被命中的比例,高召回=少漏

// 注意:语义缓存有 false positive(错误命中)与 false negative(漏命中)
// 官方提供 benchmark 示例(benchmark_sqlite_faiss_onnx.py)帮助调优
// 相似度阈值(similarity_threshold)是调优核心:松→命中高但易错,
// 紧→准确但漏多,需按业务容忍度权衡

核心要点:

1. 四大收益里"mock 数据做开发测试"常被忽略却极实用——离线也能全流程联调

2. 三指标(命中率/延迟/召回)构成调优的"仪表盘"

3. 语义缓存固有两类错误:误命中(答非所问)与漏命中(该省没省)

4. 相似度阈值是核心旋钮:在"命中率高"与"答案准确"间按业务权衡

8、总结

GPTCache 把"缓存"这个最古老的性能手段,用"embedding + 向量搜索"升级到了语义层面——表达不同、意思相同的问题共享同一份答案,让 LLM 应用的成本与延迟有了数量级优化的可能。

关键要点:

       - 定位:LLM 查询的语义缓存库,Zilliz 出品,MIT 开源

       - 核心:embedding 向量化 + 向量相似搜索 + 相似度评估三关卡

       - 模块:Adapter/Embedding/Storage/Vector/Similarity/Manager 六件全可插拔

       - 上手:三行接入;语义缓存配 ONNX+FAISS+距离评估

       - temperature:0 全缓存 / 2 全直连,省钱与多样的旋钮

       - 评估:Hit Ratio / Latency / Recall 三指标 + 相似度阈值调优

       - 现状:官方已不再新增模型/API 支持,推荐使用通用 get/set API

对于流量增长期、重复问题占比高的 LLM 应用(客服、FAQ、文档问答、内部知识库)而言,"语义缓存"是性价比极高的一层优化——GPTCache 用彻底的模块化设计把这件事变得可组装、可调优。同时要看清边界:官方已明确不再新增对新模型和新 API 的适配,新项目建议直接用它的通用 get/set API,或把它当作"语义缓存"思想的参考实现——把"查询向量化 + 相似命中 + 阈值把关 + 未命中回填"这条链路理解透,无论用哪个库(或自研),语义缓存的骨架就都在你手里了。缓存命中一次,就省一次真金白银——在 token 计费的时代,这仍是工程师手里最朴素也最锋利的武器。

相关推荐

​Jev 详解:不做生成的判断模型
精选AI

​Jev 详解:不做生成的判断模型

Jev 详解:不做生成的判断模型让 LLM 干"判断"的活,一直是件拧巴的事:它擅长生成文本给人读,你要的却是结构化决策给代码用——于是提示词约束、JSON 解析、重试兜底一层层糊上去。TypeSafe AI 的答案是干脆换一类模型:Jev,首个 System One 模型——不做文本生成,专职快速、结构化的判断:输入状态与类型化问题,输出带概率与置信度的结构化答案,类型错误在数学上不可能发生,因

529
网站被注入恶意脚本排查实录:AI 辅助安全分析实战
置顶 精选AI

网站被注入恶意脚本排查实录:AI 辅助安全分析实战

网站被注入恶意脚本排查实录:AI 辅助安全分析实战某天收到华为云监管反馈,称个人博客网站存在色情违规界面。作为技术博主,这简直是晴天霹雳——网站一直正常运行,怎么会突然出现这类问题?经过排查发现,网站被注入了恶意跳转脚本。本文记录完整的排查过程,重点分享如何借助 AI 快速定位问题并修复,希望能给遇到类似情况的开发者提供参考。1、问题发现与初步排查收到监管反馈后,第一时间打开网站检查。首页看起来完

320
时隔三年,再次备份:从手搓博客到 AI 全面自动接管
精选AI

时隔三年,再次备份:从手搓博客到 AI 全面自动接管

时隔三年,再次备份:从手搓博客到 AI 全面自动接管今天打开尘封多年的备份目录,看到了一个熟悉的文件名——2023_07_09.sql。那一刻,恍如隔世。三年前的今天,我曾经认真地导出过一次数据库;三年后的今天——2026 年 7 月 9 日,自动备份启用。整整三年,1095 天,我的博客就这样安安静静地跑着,没有人备份,也没有人管,它就那么稳稳当当地活着。感慨万千,大概是此刻最准确的四个字——不

298