更新时间:2024-08-29 GMT+08:00
分享

Cache

Cache缓存是一种临时存储数据的方法,它可以把常用的数据保存在内存或者其他设备中,这样当需要访问这些数据时,就不用再去原始的数据源查找,而是直接从缓存中获取,从而节省时间和资源。

  • 对LLM使用缓存:
    LLM llm = LLMs.of(LLMs.PANGU, llmConfig);
    llm.setCache(Caches.of(Caches.IN_MEMORY));
    llm.ask("你能讲一个笑话吗?")
    此时,再次使用同样的问题,则不会再调用大模型,而是直接从内存返回:
    llm.ask("你能讲一个笑话吗?")

Cache缓存有以下几个操作:

  • 初始化:指定缓存使用哪种存储方式。例如,使用内存型缓存可以设置为Cache cache = Caches.of(Caches.IN_MEMORY);。
    import com.huaweicloud.pangu.dev.sdk.api.memory.cache.Cache;
    import com.huaweicloud.pangu.dev.sdk.api.memory.cache.Caches;
    
    // 内存型
    Cache cache = Caches.of(Caches.IN_MEMORY);
    // Redis
    Cache cache = Caches.of(Caches.REDIS);
    // mysql
    Cache cache = Caches.of(Caches.SQL);
  • 更新数据:指向缓存中添加或修改数据,需要指定数据的键值对和结果对象。例如,把1+1这个问题和对应的答案2保存到缓存中,可参考以下示例。
    import com.huaweicloud.pangu.dev.sdk.api.llms.response.LLMResp;
    
    //更新数据
    cache.update("1+1", LLMResp.builder().answer("2").build());
  • 查询数据:从缓存中获取数据,需要指定数据的键值对。例如,查找1+1这个问题对应的答案,可参考以下示例。
    import com.huaweicloud.pangu.dev.sdk.api.llms.response.LLMResp;
    
    // 查找数据
    LLMResp cacheValue = cache.lookup("1+1");
  • 清理数据:删除缓存中的数据。例如,删除对应的缓存数据,可参考以下示例。
    // 清理
    cache.clear()
  • 配置过期策略:设置缓存有效期,支持基于时间和大小的限制。
    // 设置缓存数据10s 后过期
    Cache cache = Caches.of(Caches.IN_MEMORY, CacheStoreConfig.builder().expireAfterWrite(10).build());
  • 参数解释:用于设置缓存对象的一些基本信息,如过期时间等。
    /**
     * 会话标识,业务确定
     */
    @Builder.Default
    private String sessionTag = "";
    
    /**
     * 访问后到期时间,单位为秒, 默认不设置过期
     */
    @Builder.Default
    private int expireAfterAccess = -1;
    
    /**
     * 写入后到期时间,单位为秒, 默认不设置过期
     */
    @Builder.Default
    private int expireAfterWrite = -1;
    
    /**
     * 最大个数, 默认不设置过期
     */
    @Builder.Default
    private int maximumSize = -1;
  • 语义缓存:语义缓存是一种基于向量和相似度的缓存方法,它可以实现对数据的语义匹配和查询。语义缓存可以根据不同的向量存储、相似算法、评分规则和阈值进行配置,并且可以使用不同的词向量模型进行嵌入。
    import com.huaweicloud.pangu.dev.sdk.api.embedings.Embeddings;
    import com.huaweicloud.pangu.dev.sdk.api.llms.response.LLMResp;
    import com.huaweicloud.pangu.dev.sdk.api.memory.cache.Cache;
    import com.huaweicloud.pangu.dev.sdk.api.memory.cache.Caches;
    import com.huaweicloud.pangu.dev.sdk.api.memory.config.CacheStoreConfig;
    import com.huaweicloud.pangu.dev.sdk.api.memory.config.ServerInfoRedis;
    import com.huaweicloud.pangu.dev.sdk.api.memory.vector.Vectors;
    import com.huaweicloud.pangu.dev.sdk.vectorstore.DistanceStrategy;
    
    import org.junit.jupiter.api.Assertions;
    
    //redis向量
    // 不同的向量存储, 不同的相似算法;计算的评分规则不同; 可以同过scoreThreshold 设置相似性判断阈值
    // 例如使用Redis向量、余弦相似度、CSS词向量模型,并且设置相似性判断阈值为0.1f,代码示例如下
    Cache cache = Caches.of(CacheStoreConfig.builder()
    .storeName(Caches.SEMANTIC_REDIS)
    .vectorStoreName(Vectors.REDIS)
    .serverInfo(ServerInfoRedis.builder().build())
    .distanceStrategy(DistanceStrategy.COSINE)
    .scoreThreshold(0.1f)
    .embedding(Embeddings.of(Embeddings.CSS))
    .build());
    
    
    //会话标识
    String sessionTag="test-semantic-cache-vector-001";
    cache.setSessionTag(sessionTag);
    cache.clear();
    
    //数据已清空
    Assertions.assertNull(cache.lookup("缓存是否存在?"));
    
    //更新数据
    //指向语义缓存中添加或修改数据,需要指定数据的键值对和结果对象
    //例如,把“把缓存是否存在?”这个问题和“test-semantic-cache-vector-001”这个会话标识对应的答案“存在”保存到语义缓存中,代码示例如下
    cache.update("缓存是否存在?",LLMResp.builder().answer("存在。").build());
    
    //校验,一致
    //用于检查缓存中的数据是否与查询的数据是否一致,如果一致,就返回缓存中的结果对象
    //例如,查询“缓存是否存在?”这个问题和“test-semantic-cache-vector-001”这个会话标识,就可以从缓存中获取到之前保存的答案“存在”
    String query="缓存是否存在?";
    LLMResp cacheValueAfter=cache.lookup(query);
    Assertions.assertNotNull(cacheValueAfter);
    System.out.println(query+cacheValueAfter.getAnswer());
    
    //校验,相似
    //用于检查缓存中的数据是否与查询的数据语义相似,如果相似,就返回缓存中的结果对象。这个操作需要使用向量和相似度的计算,以及设置的阈值来判断
    //例如,查询“缓存存在?”这个问题和“test-semantic-cache-vector-001”这个会话标识,就可以从缓存中获取到之前保存的答案“存在”,因为这个问题和“缓存是否存在?”问题语义相似
    String query_sim="缓存存在?";
    LLMResp cacheValueSemantic=cache.lookup(query_sim);
    Assertions.assertNotNull(cacheValueSemantic);
    System.out.println(query_sim+cacheValueSemantic.getAnswer());
    
    //校验,不一致
    //用于检查缓存中的数据是否与查询的数据不一致,如果不一致,返回空值
    //例如,查询“有没有数据?”这个问题和“test-semantic-cache-vector-001”这个会话标识,就无法从缓存中获取到任何答案,因为这个问题和之前保存的问题都不一致
    String query_not="有没有数据?";
    Assertions.assertNull(cache.lookup(query_not));

相关文档