更新时间: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));
父主题: Memory(记忆)