prompt-cache
Go 编写的 LLM 语义缓存中间件,通过向量相似度匹配将重复请求命中缓存,降低 80% API 成
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Go 编写的 LLM 语义缓存中间件,通过向量相似度匹配将重复请求命中缓存,降低 80% API 成
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
图1:PromptCache 工作流程示意
想象你开发了一款企业内部 RAG 助手,上线后每天处理员工的各种查询。运营三个月后,你打开账单发现:LLM API 费用是预期的三倍。
问题出在哪里?仔细看日志后发现了规律——员工反复问同一类问题,只是措辞略有不同:
这三条在语义上完全等价,但传统字符串缓存根本识别不出来。AI 应用中有大量这样的"隐性重复请求",据项目作者调查,这类请求在实际生产环境中占比往往超过 30%。
传统的解决方案是加一层内存缓存,但关键词匹配无法处理同义不同词的表达方式。
PromptCache 就是来解决这个问题的——它是一个专门为 LLM 应用设计的语义缓存层,部署在你的应用和 LLM API 之间,通过理解语义来判断当前请求是否可以用历史答案来回答。
PromptCache 由独立开发者 messkan 开发,首个版本发布于 2025 年 11 月。从 GitHub 提交记录来看,作者在真实生产环境中遇到了 RAG 应用的 API 成本问题后,决定用 Go 从头实现一个专门的语义缓存方案。
作者在 Medium 上详细讲述了开发动机:
"Same intent → same answer → but three full OpenAI calls."
这个项目选择了 Go 语言而不是更常见的 Python,主要出于三点考量:
项目已发布 4 个正式版本(v0.1.0 ~ v0.4.0),最新版本为 2026 年 4 月的 v0.4.0,正在向 v1.0.0 迈进。
PromptCache 的核心技术是语义相似度匹配,但其设计亮点在于三层安全策略,避免"语义接近但意图不同"导致的错误命中。
每个请求的 prompt 会被转换为高维向量(通过 OpenAI text-embedding-3-small / Mistral embed / Voyage-3 等 embedding 模型),存入 ANN(Approximate Nearest Neighbor)索引。
当新请求到达时,计算其向量与缓存中所有条目的余弦相似度,取最高分。
Benchmark 数据(项目内置测试):
BenchmarkCosineSimilarity-12 2593046 441.0 ns/op
BenchmarkFindSimilar-12 50000 32000 ns/op 2048 B/op
单次相似度计算仅需 441 纳秒,FindSimilar 约 32 微秒,完全在毫秒级以内。
项目设计了高/低两个可配置阈值:
这是项目最有价值的设计——当相似度落在灰度区时,系统会调用一个小型便宜的 LLM(默认 gpt-4o-mini 或 haiku)问一个简单问题:
"Do these two prompts ask for the same thing?"
这个设计解决了语义缓存的核心风险:两句话可能表面相似但意图不同。例如:
项目采用 Go 1.24+,整体代码组织清晰,分为以下核心模块:
| 模块 | 文件 | 职责 |
|---|---|---|
| cmd/api | main.go | 入口,HTTP 服务器 |
| internal/semantic | semantic.go, providers.go | 语义匹配核心,embedding provider 抽象 |
| internal/ann | ann.go | ANN 近似最近邻索引 |
| internal/cache | cache.go | LRU 缓存逻辑 |
| internal/storage | badger.go | BadgerDB 持久化存储 |
| internal/http | client.go | 上游 LLM API 调用 |
| internal/middleware | middleware.go | 认证、中间件逻辑 |
| internal/metrics | metrics.go | Prometheus 指标暴露 |
| internal/logging | logger.go | 结构化 JSON 日志 |
关键设计决策:
/v1/chat/completions 接口,应用侧只需改 base_url,零代码改造支持的运行环境:
不支持 GPU,无需额外硬件,普通云服务器即可运行。
对于已有 OpenAI SDK 应用,接入 PromptCache 只需要改一行代码:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1", # 之前是 https://api.openai.com/v1
api_key="your-openai-api-key"
)
# 后续所有 API 调用无需任何改动
client.chat.completions.create(model="gpt-4", messages=[...])
这是项目最有价值的设计理念——drop-in replacement。LangChain、LlamaIndex 等主流框架也原生支持自定义 base_url,接入无压力。
v0.4.0 还新增了 Streaming SSE 支持,缓存命中时自动将 response 组装成 OpenAI SSE 格式返回,streaming 客户端完全透明。
实测性能数据(官方 benchmark):
| 指标 | 无缓存 | 有 PromptCache | 提升 |
|---|---|---|---|
| 每1000请求成本 | ~$30 | ~$6 | -80% |
| 平均延迟 | ~1.5s | ~300ms | -80% |
| 吞吐量 | 受 API 限制 | 无限 | 取决于本地硬件 |
PromptCache 并非银弹,以下场景需要注意:
语义缓存并非 PromptCache 独占,同类项目包括:
PromptCache 的差异化定位是:轻量、Go 编写、零依赖、单二进制部署。相比 GPTCache 的 Python 全家桶,PromptCache 在资源占用和部署便捷性上有明显优势。
从 GitHub topics 可以看出,这个项目同时贴了 llm, cost-optimization, rag, llmops 等多个标签,说明它处于 LLM 应用运维(LLMOps)工具链的核心位置。随着 RAG 和 AI Agent 的普及,语义缓存作为降低 LLM API 成本的基础设施,价值会持续凸显。
本文档基于 GitHub 开源项目 messkan/prompt-cache 生成,分析版本:v0.4.0,发布时间:2026-04-24