AI +Redis 缓存增强

张开发
2026/4/11 8:49:10 15 分钟阅读

分享文章

AI +Redis 缓存增强
Spring AI + Redis:AI 应用缓存增强完整实践AI 应用在生产环境中面临两大核心痛点:高延迟(模型推理通常需要 1-5 秒)和高成本(GPT-4 每百万 token 约 $30)。Redis 作为高性能内存数据库,与 Spring AI 结合可以构建多层次的缓存体系,从根本上解决这些问题。本文将系统讲解三种缓存策略:精确缓存、语义缓存和提示词缓存,并展示如何通过 Advisor 机制实现缓存层的无侵入集成。一、缓存分层架构text┌─────────────────────────────────────────────────────────────────┐ │ Application Layer │ ├─────────────────────────────────────────────────────────────────┤ │ Advisor Chain (缓存拦截) │ │ ┌─────────────────────────────────────────────────────────┐ │ │ │ SemanticCacheAdvisor (语义缓存 - 向量相似度匹配) │ │ │ │ PromptCacheAdvisor (提示词缓存 - 精确前缀匹配) │ │ │ │ MessageChatMemoryAdvisor (对话历史 - 会话级缓存) │ │ │ └─────────────────────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────────────────┤ │ 缓存存储层 │ │ ┌──────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ │ │ 精确缓存 │ │ 语义缓存 │ │ 提示词缓存 │ │ │ │ (String Key) │ │ (向量相似度搜索) │ │ (前缀匹配) │ │ │ └──────────────┘ └──────────────────┘ └─────────────────┘ │ │ Redis Stack (向量数据库 + KV) │ └─────────────────────────────────────────────────────────────────┘三种策略的适用场景对比:策略匹配方式适用场景命中率实现复杂度精确缓存字符串完全匹配固定问答对、FAQ高低语义缓存向量相似度(余弦距离)同一问题的不同表述中高中提示词缓存前缀精确匹配系统提示词、工具定义极高低(模型原生)二、精确缓存:最简单的降本增效2.1 实现方式精确缓存适用于用户问题完全一致的场景,如 FAQ 问答、固定模板查询。java@Service @Slf4j public class CachedAIService { @Autowired private ChatModel chatModel; @Autowired private RedisTemplateString, String redisTemplate; private static final String CACHE_KEY_PREFIX = "ai:cache:"; private static final Duration CACHE_TTL = Duration.ofHours(24); /** * 带精确缓存的 AI 调用 * @param question 用户问题 * @return AI 响应 */ public String getAnswerWithCache(String question) { // 1. 生成缓存 Key(可选:MD5/SHA-256 压缩长问题) String cacheKey = CACHE_KEY_PREFIX + DigestUtils.sha256Hex(question); // 2. 查询缓存 String cachedAnswer = redisTemplate.opsForValue().get(cacheKey); if (cachedAnswer != null) { log.info("Cache HIT for question: {}", question.substring(0, Math.min(50, question.length()))); return cachedAnswer; } // 3. 缓存未命中,调用 AI 模型 log.info("Cache MISS for question: {}", question); long startTime = System.currentTimeMillis(); String answer = chatModel.call(question); long elapsed = System.currentTimeMillis() - startTime; log.info("AI call completed in {}ms", elapsed); // 4. 写入缓存(带随机 TTL,防止缓存雪崩) long jitter = ThreadLocalRandom.current().nextLong(3600); // 随机 0-1 小时 Duration effectiveTtl = CACHE_TTL.plusSeconds(jitter); redisTemplate.opsForValue().set(cacheKey, answer, effectiveTtl); return answer; } }2.2 使用 Spring Cache 抽象更优雅的方式是利用 Spring Cache 注解:java@Service @CacheConfig(cacheManager = "redisCacheManager") public class AIService { @Autowired private ChatModel chatModel; /** * @Cacheable 会自动将结果缓存到 Redis * key = "ai:answer:" + SHA256(question) */ @Cacheable(value = "ai-answers", key = "#question", unless = "#result == null") public String getAnswer(String question) { return chatModel.call(question); } /** * 带过期时间的缓存(通过配置实现) */ @Cacheable(value = "ai-answers-ttl", key = "#question") public String getAnswerWithTTL(String question) { return chatModel.call(question); } } @Configuration @EnableCaching public class CacheConfig { @Bean public RedisCacheManager redisCac

更多文章