Skip to content

Latest commit

 

History

History
82 lines (58 loc) · 4.14 KB

File metadata and controls

82 lines (58 loc) · 4.14 KB

ADR-003: 多层缓存体系

上下文

TokenRouter 的核心商业价值在于通过结构收敛降低 AI Token 调用成本。大模型厂商的缓存读取价格通常为正常价格的 1/10(如 Claude: $0.30 vs $3.00/MTok)。v2 架构采用 Envelope + Block 中间格式,通过 Chunker + Arranger + Canonicalizer 将请求标准化,再经 CacheInjector 注入厂商缓存标记,最大化厂商侧 KV Cache 命中率。

缓存需求分析:

需求 描述 数据特征
厂商侧 KV Cache 通过前缀共享最大化 Anthropic/OpenAI 等厂商的缓存命中 前缀匹配、确定性 JSON
请求去重 相同完整请求的并发复用 精确哈希、短 TTL
元数据缓存 模型信息、定价、用户配额等 键值对、低频变更

候选方案:

方案 说明 优势 劣势
单一缓存层 统一用 Redis 做所有缓存 实现简单 无法针对不同场景优化、缓存策略冲突
多层缓存体系 L1-L3 分层,每层解决不同问题 精准优化、策略独立、可独立演进 架构复杂度增加

决策

选择 三层缓存体系(L1-L3),各层职责明确,可渐进式实施。

L1 厂商侧 KV Cache(核心商业价值)

  • 解决的问题:通过结构收敛(Chunker + Arranger + Canonicalizer)+ 缓存标记注入,最大化厂商侧的 KV Cache 命中率
  • 存储:无本地存储,命中效果直接体现在厂商响应的 cache_read_tokens
  • 策略
    1. Chunker 将请求切分为 System / Tool / History / Query Block
    2. Arranger 合并 System、排序 Tool、截断 History
    3. Canonicalizer 生成字节级确定性的 JSON
    4. CacheInjector 按厂商要求注入 cache_control 等标记
    5. Hasher 对 System + Tool 计算前缀哈希,用于观测与聚类
  • 命中效果:节省约 90% 的缓存 Token 费用

接口定义详见 ../CODE_WIKI.md,实现示例详见 ../modules/cache-intelligence.md

L2 请求去重(并发复用)

  • 解决的问题:非流式相同完整请求的并发复用,减少上游调用次数
  • 存储:内存 map + 短 TTL(2 分钟)
  • 策略:Canonicalizer 输出后计算 FullHash,相同 hash 的并发请求挂起等待首个请求返回后复用
  • 命中效果:减少重复上游调用,降低延迟和成本

接口定义详见 ../CODE_WIKI.md,实现示例详见 ../modules/cache-intelligence.md

L3 元数据缓存(Metadata Cache)

  • 解决的问题:模型列表、定价信息、用户配额等低频变更数据的本地缓存
  • 存储:进程内 sync.Map + Redis 二级缓存
  • TTL:5 分钟,主动失效
  • 命中效果:减少数据库查询,降低请求延迟

渐进式实施路径

阶段 缓存层 优先级 预期收益
Phase 1 L1 厂商侧 KV Cache P0 核心商业价值,直接降低 Token 成本
Phase 1 L2 请求去重 P0 减少并发重复调用
Phase 1 L3 元数据缓存 P0 基础设施必需,降低 DB 压力

后果

正面影响

  • 精准优化:每层缓存针对特定场景设计,策略独立,互不干扰
  • 渐进式实施:可按优先级逐步上线,MVP 阶段即可完整运行
  • 可观测:每层缓存独立监控命中率,便于定位优化方向
  • 灵活扩展:新增缓存层不影响已有层级,架构可扩展

负面影响

  • 架构复杂度:三层缓存增加了系统复杂度,需要统一的缓存管理器协调各层
  • Redis 依赖加重:L2-L3 依赖 Redis,Redis 成为关键路径上的单点(需通过 Redis Cluster/Sentinel 保障高可用)
  • 一致性挑战:多层缓存的一致性管理复杂,特别是在数据更新时需要级联失效
  • 调试困难:缓存命中/未命中的链路较长,排查问题时需要逐层检查