GPTCache 快速上手:两步构建 LLM 语义缓存(Usage 指南深度解析)
AI 应用大模型【免费下载链接】GPTCacheSemantic cache for LLMs. Fully integrated with LangChain and llama_index.项目地址https://gitcode.com/gh_mirrors/gp/GPTCache点击查看免费下载GPTCache 是一个面向大语言模型LLM查询的语义缓存库核心思路是用「向量相似度」代替「字符串精确匹配」来判定缓存命中让语义相近的问题直接复用历史回答。本文以 docs/usage.md 为主线结合仓库源码与示例完整讲解 GPTCache 的两步接入流程、五个关键决策点Embedding 生成、标量存储、向量存储、淘汰策略、相似度评估、OpenAI 与 LangChain 适配器、请求级参数以及 Server 部署方式。读完本文你将能够在不改动现有调用代码的前提下为 ChatGPT / LangChain 应用叠加一层可命中语义相近问题的缓存层。一、GPTCache 快速入门两步构建语义缓存官方文档将 GPTCache 的使用概括为两步构建你的缓存Build your cache决定 embedding 函数、相似度评估函数、数据存储位置以及淘汰策略选择你的 LLMChoose your LLMGPTCache 当前支持 OpenAI ChatGPTGPT-3.5-turbo以及 LangChainLangChain 又兼容 Anthropic、Huggingface、Cohere 等多种模型。对应到代码最小可用形态只需三行from gptcache import cache from gptcache.adapter import openai cache.init() cache.set_openai_key()cache.init()完成缓存体系初始化cache.set_openai_key()则从环境变量OPENAI_API_KEY读取密钥并写入 openai 客户端。查看 gptcache/core.py 可以看到Cache.init的真实签名与默认值def init( self, cache_enable_funccache_all, pre_embedding_funclast_content, pre_funcNone, embedding_funcstring_embedding, data_manager: DataManager get_data_manager(), similarity_evaluationExactMatchEvaluation(), post_process_messages_functemperature_softmax, post_funcNone, configConfig(), next_cacheNone, ):对照文档给出的接口骨架可以梳理出各参数的职责参数默认值职责cache_enable_funccache_all决定是否启用缓存可自定义开关逻辑pre_embedding_funclast_content从请求中提取用于向量化的文本默认取messages最后一条的contentembedding_funcstring_embedding把文本编码成稠密向量用于语义检索data_managerget_data_manager()统一管理标量存储与向量存储similarity_evaluationExactMatchEvaluation()判定缓存是否命中post_process_messages_functemperature_softmax对命中结果做后处理如按相似度软采样configConfig()全局配置项如相似度阈值next_cacheNone多级缓存串联时的下一级缓存对象小提示pre_func与pre_embedding_func、post_func与post_process_messages_func是等价别名任一传入即可生效见 gptcache/core.py 的实现。二、构建缓存前需要回答的五个问题文档明确建议在创建 GPTCache 之前先想清楚以下五个问题。1. 如何生成查询的 Embeddingembedding_funcEmbedding 函数将文本编码为稠密向量供向量存储做上下文相似度检索。GPTCache 支持多种 Embedding 方案OpenAI、Cohere、Huggingface、ONNX、SentenceTransformers并内置了string_embedding作为简单的字符串直通方案见 gptcache/embedding/string.py实际实现位于gptcache.embedding.string.to_embeddings。例如使用 ONNX Embedding基于 GPTCache/paraphrase-albert-onnx 模型只需把onnx.to_embeddings作为embedding_func传入data_manager get_data_manager(CacheBase(sqlite), VectorBase(faiss, dimensiononnx.dimension)) cache.init( embedding_funconnx.to_embeddings, data_managerdata_manager, similarity_evaluationSearchDistanceEvaluation(), ) cache.set_openai_key()注意VectorBase(faiss, dimensiononnx.dimension)中的dimension必须与所选 Embedding 模型的输出维度一致ONNX 模型会通过onnx.dimension自动暴露维度。更多 Embedding 函数的完整用法可参考 examples/embedding 目录下的default.py、onnx.py、paddlenlp.py、random.py等示例以及 examples/README.md。2. 标量数据缓存在哪里data_manager的 Cache StorageCache Storage 负责保存所有标量数据包括原始问题、提示词、答案以及访问时间。GPTCache 支持 SQLite、MySQL、PostgreSQL 等多种数据库未来会继续扩展 NoSQL 支持。从源码看标量存储的抽象基类定义在 gptcache/manager/scalar_data/base.py具体实现分散在 gptcache/manager/scalar_data 下的sql_storage.py、dynamo_storage.py、mongo.py、redis_storage.py中。3. 向量 Embedding 存在哪里、如何检索data_manager的 Vector Storage向量存储负责存放所有 Embedding并执行语义相似检索找出与当前查询最相似的历史结果。GPTCache 既支持 FAISS 这类向量检索库也支持 Milvus 这类向量数据库。相关实现见 gptcache/manager/vector_data 下的faiss.py、milvus.py、hnswlib_store.py、pgvector.py、qdrant.py、weaviate.py、chroma.py等文件。文档给出的几种典型组合如下## create user defined data manager data_manager get_data_manager() ## create data manager with sqlite and faiss data_manager get_data_manager(CacheBase(sqlite), VectorBase(faiss, dimension128)) ## create data manager with mysql and milvus, max cache size is 100 data_manager get_data_manager(CacheBase(mysql), VectorBase(milvus, dimension128), max_size100) ## create data manager with mysql and milvus, max cache size is 100, eviction policy is LRU data_manager get_data_manager(CacheBase(mysql), VectorBase(milvus, dimension128), max_size100, evictionLRU)除了get_data_manager还推荐使用工厂方法manager_factory。它只需给定一个根目录就能自动管理所有本地文件SQLite 库、FAISS 索引等from gptcache.manager import manager_factory # 等价于 sqlite faiss数据统一落在 ./workspace 目录下 data_manager manager_factory(sqlite,faiss, data_dir./workspace, vector_params{dimension: 128}) # 用 Redis 作为分布式淘汰存储 data_manager manager_factory( redis,faiss, eviction_managerredis, scalar_params{maxmemory: 2mb, policy: allkeys-lru}, vector_params{dimension: 128}, eviction_paramsdict(urlredis://localhost:6379), )manager_factory的签名与默认值managermap、max_size1000、eviction_managermemory在 gptcache/manager/factory.py 中有完整定义。注意manager参数的格式为{scalar},{vector}可选的第三段{object}用于对象存储如本地路径或 S3。当标量存储与淘汰管理器都是 Redis 时工厂会自动切换为no_op_eviction以避免重复操作避免冗余开销见 gptcache/manager/factory.py。4. 淘汰策略怎么选Eviction PolicyGPTCache 目前基于缓存条目数量进行淘汰支持 LRU 与 FIFO 两种策略并计划后续支持基于最后访问时间或最后写入时间的策略。默认的get_data_manager()返回MapDataManager其底层直接使用cachetools.LRUCache(max_size)因此默认就是 LRU见 gptcache/manager/data_manager.py通过get_data_manager(..., evictionLRU/FIFO, max_size...)可以显式指定。更完整的淘汰策略体系含 LFU、RR 以及基于 Redis 的分布式淘汰可参考 gptcache/manager/eviction 目录与 docs/feature.md。5. 如何判定缓存命中与未命中similarity_evaluation评估函数接收三个输入用户请求数据、缓存数据和用户自定义参数据此判断缓存答案是否与当前查询匹配。GPTCache 支持三类评估函数精确匹配评估ExactMatchEvaluation默认值Embedding 距离评估SearchDistanceEvaluationONNX 模型评估EvaluationOnnx可运行任何能部署在 ONNX 上的模型。启用 ONNX 评估的完整示例onnx EmbeddingOnnx() data_manager get_data_manager(CacheBase(sqlite), VectorBase(faiss, dimensiononnx.dimension)) evaluation_onnx EvaluationOnnx() cache.init( embedding_funconnx.to_embeddings, data_managerdata_manager, similarity_evaluationevaluation_onnx, )ExactMatchEvaluation、SearchDistanceEvaluation、EvaluationOnnx等实现分别位于 gptcache/similarity_evaluation 下的exact_match.py、distance.py、onnx.py配套的可运行示例见 examples/similarity_evaluation。附加配置log_time_func与similarity_threshold除上述核心参数外cache.init(configConfig(...))还支持传入其他配置log_time_func记录耗时操作如embedding、search的函数similarity_threshold判定 Embedding 是否相似的阈值。Config的完整参数表见 gptcache/config.py参数默认值说明log_time_funcNone自定义耗时日志函数similarity_threshold0.801 之间的相似度过滤阈值0 表示无命中1 表示全部命中超出 [0,1] 会抛出CacheErrorpromptsNone请求内容包含这些提示词时将其移除templateNone从模板中剥离固定文本只保留模板参数值作为缓存键auto_flush20每新增 20 条数据自动 flush 一次enable_token_counterTrue是否启用 token 计数input_summary_lenNone将输入摘要到指定长度后再向量化context_lenNone上下文长度配合concat_all_queries使用skip_list[system, assistant]序列化预处理时跳过这些角色的消息data_checkFalse命中时校验向量库与标量库是否一致disable_reportFalse是否关闭缓存报告三、选择你的 LLM 适配器GPTCache 当前支持两个 LLM 适配器OpenAI 与 LangChain其抽象基类BaseCacheLLM定义在 gptcache/adapter/base.py。OpenAI 适配器使用 OpenAI 适配器时可以像平时一样调用openai.ChatCompletion.create并指定模型、以 user 角色生成查询cache.init() cache.set_openai_key() question whats github answer openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ { role: user, content: question } ], ) print(answer)这里的openai必须从gptcache.adapter导入from gptcache.adapter import openai它是 OpenAI 官方类的包装子类见 gptcache/adapter/openai.py。命中缓存时返回的响应对象结构完全兼容 OpenAI 原始格式但带有gptcache: True标记与saved_token字段构造逻辑见 gptcache/adapter/openai.py。流式响应streamTrue官方示例同样支持 OpenAI 的流式响应 API。命中缓存时适配器会构造出与真实流一致的 chunk 序列未命中时则边接收真实流、边在流结束后把完整答案写回缓存挂钩逻辑见 gptcache/adapter/openai.pyfrom gptcache.manager import get_data_manager from gptcache.core import cache, Cache from gptcache.adapter import openai cache.init(data_managerget_data_manager()) os.environ[OPENAI_API_KEY] API KEY cache.set_openai_key() response openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: user, content: Whats 11? Answer in one word.} ], temperature0, streamTrue # this time, we set streamTrue ) # create variables to collect the stream of chunks collected_chunks [] collected_messages [] # iterate through the stream of events for chunk in response: collected_chunks.append(chunk) # save the event response chunk_message chunk[choices][0][delta] # extract the message collected_messages.append(chunk_message) # save the message full_reply_content .join([m.get(content, ) for m in collected_messages])LangChain 适配器如果使用其他 LLMLangChain 适配器提供了与 LangChain 标准接口对接的方式。核心是两步先用Cache配置预处理函数如get_prompt提取 prompt、postnop不做后处理再通过LangChainLLMs(llm)包装任意 LangChain 模型template Question: {question} Answer: Lets think step by step. prompt PromptTemplate(templatetemplate, input_variables[question]) llm OpenAI() question What NFL team won the Super Bowl in the year Justin Bieber was born? llm_cache Cache() llm_cache.init( pre_embedding_funcget_prompt, post_process_messages_funcpostnop, ) cached_llm LangChainLLMs(llm) answer cached_llm(question, cache_objllm_cache)LangChainLLMs的实现位于 gptcache/adapter/langchain_models.py。LangChain 场景的更多实战示例可参考 examples/integrate/langchain 目录langchain_prompt_openai.py、langchain_llms_mock.py、langchain_qa_chain.py等。四、请求级参数精细控制每一次调用除了在cache.init()层面做全局配置GPTCache 还支持在每个请求上单独传入参数。这些参数在 gptcache/adapter/adapter.py 的adapt中被统一解析。cache_obj自定义请求级缓存对象默认所有请求共享全局cache单例如需让某个请求使用独立的缓存实例例如配置不同的相似度阈值传入cache_objonnx Onnx() data_manager get_data_manager(CacheBase(sqlite), VectorBase(faiss, dimensiononnx.dimension)) one_cache Cache() one_cache.init(embedding_funconnx.to_embeddings, data_managerdata_manager, evaluation_funcpair_evaluation, configConfig( similarity_threshold1, ), ) question what do you think about chatgpt openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: user, content: question} ], cache_objone_cache )cache_context按请求覆盖缓存函数可以在每次请求时单独覆盖缓存管线中的任意环节预处理、Embedding、搜索、取标量数据、评估question what do you think about chatgpt openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: user, content: question} ], cache_context{ pre_embedding_func: {}, embedding_func: {}, search_func: {}, get_scalar_data: {}, evaluation_func: {}, } )在adapt内部这些覆盖项通过extra_param透传给对应环节见 gptcache/adapter/adapter.py 及搜索、取数、评估处的调用空字典表示沿用全局默认实现。cache_skip跳过检索但依然写入该选项允许跳过缓存搜索但仍会把 LLM 返回的结果存入缓存适合「本轮必须走模型、但结果为后续复用」的场景question what do you think about chatgpt openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: user, content: question} ], cache_skipTrue )session会话级缓存隔离与命中规则Session 可以隔离每个连接/用户的上下文并自定义命中检查规则——若命中结果不满足会话规则则回退为重新请求 LLM。默认检查函数check_hit_session会保证同一会话内相同或相似的问题不被直接复用见 gptcache/session.py 与 gptcache/processor/check_hit.pyfrom gptcache.session import Session session Session(namemy-session) question what do you think about chatgpt openai.ChatCompletion.create( modelgpt-3.5-turbo, messages[ {role: user, content: question} ], sessionsession )完整会话示例见 examples/session/session.py。temperature用随机度控制「是否走缓存」temperature的取值范围是[0, 2]默认值0.0。它同时控制模型输出的随机性与缓存检索策略温度越高越可能跳过缓存直接请求大模型temperature 2时必然跳过缓存、直接请求大模型temperature 0时必然先查缓存再请求大模型。默认的post_process_messages_func是temperature_softmaxgptcache/processor/post.py温度为 0 时直接返回相似度最高的答案温度大于 0 时按softmax(scores / temperature)概率采样。adapt中正是用它对[跳过缓存, 查缓存]做随机决策见 gptcache/adapter/adapter.py。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_funconnx.to_embeddings, data_managerdata_manager, similarity_evaluationSearchDistanceEvaluation(), post_process_messages_functemperature_softmax ) # cache.config Config(similarity_threshold0.2) question whats github for _ in range(3): start time.time() response openai.ChatCompletion.create( modelgpt-3.5-turbo, temperature 1.0, # Change temperature here messages[{ role: user, content: question }], ) print(Time elapsed:, round(time.time() - start, 3)) print(Answer:, response[choices][0][message][content])五、使用 GPTCache Server把缓存服务化GPTCache 支持构建带缓存与对话能力的独立服务任何语言都可以通过 HTTP 使用缓存能力。服务端基于 FastAPI 实现见 gptcache_server/server.py除文档中使用的/put、/get外还提供了/flush刷新缓存与/cache_file下载缓存文件接口。启动服务安装 GPTCache 后一行命令即可启动$ gptcache_server -s 127.0.0.1 -p 8000其中-s指定绑定地址-p指定端口。使用 Docker 启动也可以直接拉取官方镜像运行无需本地安装 Python 依赖$ docker pull zilliz/gptcache:latest $ docker run -p 8000:8000 -it zilliz/gptcache:latest与服务器交互命令行方式写入缓存/putcurl -X POST \ http://localhost:8000/put \ -H accept: application/json \ -H Content-Type: application/json \ -d { prompt: Hi, answer: Hi back }读取缓存/getcurl -X POST \ http://localhost:8000/get \ -H accept: application/json \ -H Content-Type: application/json \ -d { prompt: Hi }与服务器交互Python 客户端GPTCache 同时提供 Python 客户端封装gptcache/client.py from gptcache.client import Client client Client(urihttp://localhost:8000) client.put(Hi, Hi back) 200 client.get(Hi) Hi back六、背后的调用链一次请求在缓存中的完整旅程结合 gptcache/adapter/adapter.py 的adapt逻辑一次带缓存的 LLM 请求大致经历以下阶段预处理pre_processpre_embedding_func从请求中提取待向量化文本默认last_content取messages最后一条内容gptcache/processor/pre.py向量化embeddingembedding_func把文本转为稠密向量检索searchdata_manager.search在向量库中查找 top-k 近似结果SSDataManager会先对向量做 L2 归一化再检索gptcache/manager/data_manager.py取标量数据get_scalar_data按检索到的 id 回查标量存储拿到原始问答相似度评估evaluationsimilarity_evaluation.evaluation结合阈值与cache_factor计算命中门限rank_threshold高于门限的候选进入cache_answers后处理post_processpost_process_messages_func从候选答案中挑出最终返回内容默认temperature_softmax命中则返回若最终答案非空直接cache_data_convert组装成兼容格式返回响应中带gptcache: True未命中则请求模型并回写调用真实 LLM通过update_cache_callback把结果写入缓存写满auto_flush条后自动flush。这套管线中的每一步pre_process、embedding、search、evaluation、post_process、save等都有埋点计时可在Config(log_time_func...)中自定义耗时日志。七、进一步阅读docs/feature.md当前缓存支持的全部功能特性清单examples/README.md更丰富的自定义缓存示例索引examples/adapterapi.py中的 get/set 直连 API 用法以及 OpenAI、LangChain 适配器示例examples/embedding 与 examples/similarity_evaluation不同 Embedding 与相似度评估函数的对照示例docs/horizontal-scaling-usage.md分布式缓存与水平扩展指南gptcache_server/server.py服务端实现源码FastAPI 路由与缓存封装。赞分享AI 应用大模型【免费下载链接】GPTCacheSemantic cache for LLMs. Fully integrated with LangChain and llama_index.项目地址https://gitcode.com/gh_mirrors/gp/GPTCache点击查看免费下载相关推荐NuGet.Client高级功能Visual Studio扩展开发与自定义包管理器UINuGet.Client高级功能Visual Studio扩展开发与自定义包管理器UI NuGet.Client是一套强大的客户端工具集为开发者提供了Vis开发工具TypeChat 快速上手用 TypeScript 类型定义构建自然语言接口Basic TypeScript Usage 深度指南TypeChat 快速上手用 TypeScript 类型定义构建自然语言接口Basic TypeScript Usage 深度指南 TypeChat 是一大模型AI 应用后端如何构建高性能LLM缓存系统GPTCache与Milvus深度整合指南如何构建高性能LLM缓存系统GPTCache与Milvus深度整合指南 GPTCache是一款专为大型语言模型 LLM 设计的语义缓存系统能够显著提升AI应AI 应用大模型上一篇Apache APISIX consumer-restriction 插件基于 Consumer、Consumer Group、Service 与 Route 的精细化访问控制实战下一篇在 Plate 编辑器中重开权威空白editor-behavior 文档治理命令 reinterview-open-authority-gaps 实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考