LiteLLM 缓存配置指南:4 类后端怎么选,重复请求的账单能省多少
【免费下载链接】litellmThe fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]项目地址: https://gitcode.com/GitHub_Trending/li/litellm
LiteLLM 是统一调用 100+ LLM API 的网关,其缓存机制在请求发往模型前先查历史结果:命中直接返回,未命中再调用并写入。本文沿一条重复请求的路径,讲命中逻辑、后端选型、TTL 与阈值调参,以及上线后怎么算账。
请求进来先查哪里:命中与未命中的判定
缓存不是“存了再说”。每次completion()调用,LiteLLM 缓存会先构造一个缓存键:
- 键由模型名、请求参数(temperature、max_tokens 等)与消息内容共同决定,任一参数不同即视为不同请求;
- 键做 SHA256 哈希后拼接命名空间前缀,多业务共用同一后端时互不污染;
- 查不到才真正调用上游模型,响应回来后再写回缓存。
缓存默认开启,也可设为default_off改为默认不缓存、由请求显式声明开启;单次调用想跳过,传cache={"no-cache": True}即可。各后端的实现集中在源码目录litellm/caching/下,排查问题可以按文件名直接定位到对应存储。
🗂️ 三步启用 Redis 缓存:初始化、命名空间与 TTL
单进程开发用type="local"的内存缓存即可;多实例部署必须上 Redis,否则每个进程的缓存各自为政,命中率会明显偏低。
import litellm from litellm import Cache litellm.cache = Cache( type="redis", host="localhost", port=6379, namespace="my-project", # 不同命名空间的键互不共享 default_in_redis_ttl=86400, # 默认 1 天过期(秒) )三步要点:
- 初始化:一行
Cache()挂到litellm.cache,全进程生效; - 命名空间:按项目或租户划分键空间,后续做隔离与清理不用动数据;
- TTL:全局默认值用
default_in_redis_ttl(Redis)或default_in_memory_ttl(内存),单个键的过期时间可在请求级覆盖。
对象存储也能当缓存:type="s3"配桶名与 region,Azure Blob、GCS 同理,适合要和现有存储对齐权限与合规体系的场景;代价是对象存储延迟高于 Redis,高频热数据不建议放这里。
语义缓存阈值如何取值
精确匹配要求消息一字不差;而 LiteLLM 语义缓存会把消息向量化后做相似度检索,措辞不同也能命中:
litellm.cache = Cache( type="redis-semantic", host="localhost", port=6379, similarity_threshold=0.95, # 余弦相似度低于该值视为未命中 redis_semantic_cache_embedding_model="text-embedding-3-small", )similarity_threshold是这套机制里最敏感的参数:
- 取高(0.97 以上):只命中几乎同义的请求,安全但收益小;
- 取低(0.9 以下):“怎么退订”和“怎么退款”可能互相命中,返回错误答案;
- 建议从 0.95 起步,拿真实流量看一周命中样本:误命中多就上调,命中率上不去且请求高度重复再下调。
语义缓存每次请求多一次 embedding 调用,请求量低或对延迟敏感时,精确匹配反而更划算。
caching_groups 跨模型复用与请求级动态控制
两个进阶能力都作用在“缓存键怎么算”上:
caching_groups:在metadata里传caching_groups=[["gpt-4o", "claude-3-5-sonnet"]],同组模型共用一个缓存键。主模型限流切到备用模型时能直接复用结果,也方便在切换模型时做 LLM API 降本对比;- 请求级覆盖:
completion()的cache参数可对单次调用指定过期时间与空间,如cache={"s-maxage": 3600, "namespace": "user_123"},表示这条结果只缓存一小时且归属独立用户空间。
这套粒度适合“大部分请求走默认缓存、个别实时接口例外”的系统,不用为少数请求牺牲全局配置。
📊 上线后如何核算:命中率、成本与响应时间
缓存值不值,看四个数:
| 指标 | 含义 | 获取位置 |
|---|---|---|
| 命中率 | 直接由缓存返回的请求占比 | 代理访问日志 |
| 成本节省 | 命中次数 × 单次调用均价 | 代理成本统计 |
| 响应时间 | 命中 / 未命中两组 P50、P95 对比 | APM 或日志 |
| 存储占用 | Redis 内存或对象存储用量 | 后端自身监控 |
接入日志后端后可逐条看到每次调用的耗时与花费,把命中流量和真实上游流量分开统计。做缓存命中率优化的一般经验:低于 20% 先查键是否因参数漂移频繁变化(例如请求里带了时间戳);高于 60% 则可以考虑放宽 TTL,进一步压上游调用量。
聊天机器人与批量请求的落地方式
- 聊天机器人:FAQ 复用率最高,用命名空间分“全局知识 / 会话级”两层,全局问答共用缓存,带个人上下文的消息单独空间或不缓存;
- 批量请求:离线任务先对输入去重,同批任务统一命名空间、跑完整批失效;批量中间结果挂
no-cache,避免污染线上缓存。
四个落地注意事项
- 先用小流量命名空间灰度,观察命中率与误命中,再全量放开;
- TTL 跟着数据时效走:知识类按周,行情新闻类按分钟甚至不缓存;
- 语义缓存阈值上线后要抽检命中样本,不能只看命中率数字;
- 给命名空间级 TTL 兜底,定期清理长尾键,防止存储无限增长。
把上面的 Redis 配置和命名空间策略套到现有部署上,先跑一周命中率与成本数据,再回填 TTL 与阈值的具体数值,是最省心的起步路径。
【免费下载链接】litellmThe fastest, litest AI Gateway. Rust core with Python SDK. Call 100+ LLM APIs in OpenAI (or native) format with cost tracking, guardrails, load balancing, and logging [Bedrock, Azure, OpenAI, Anthropic, OpenAI, VertexAI, vLLM, Nvidia NIM]项目地址: https://gitcode.com/GitHub_Trending/li/litellm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考