更新时间:2024-10-16 GMT+08:00
Cache
Cache缓存是一种临时存储数据的方法,它可以把常用的数据保存在内存或者其他设备中,当需要访问这些数据时,无需再去原始的数据源查找,而是直接从缓存中获取,从而节省时间和资源。
Cache缓存有以下几种操作:
- 初始化:指定缓存使用哪种存储方式,例如,使用内存型缓存可以设置为memory_cache = Caches.of("inMemory")。
from pangukitsappdev.api.memory.cache.factory import Caches # 内存型 memory_cache = Caches.of("inMemory") # Redis redis_cache = Caches.of("redis") # mysql sql_cache = Caches.of("sql")
- 更新数据:指向缓存中添加或修改数据,需要指定数据的键值对和结果对象。例如,把1+1这个问题和用户cache会话下对应的答案2保存到缓存中,参考示例如下:
from pangukitsappdev.api.schema import LLMResp cache = Caches.of("inMemory") # 更新数据 cache.update("1+1", LLMResp(answer=2))
- 查询数据:从缓存中获取数据,需要指定数据的键值对。例如,查找1+1这个问题对应的答案,参考示例如下:
# 查找数据 cache_value = cache.lookup("1+1")
- 清理数据:删除用户cache会话下缓存中的数据。例如,删除所有缓存数据,参考示例如下:
# 清理 cache.clear()
- 参数解释:用于设置缓存对象的一些基本信息,如过期时间、session_tag等。
expire_after_access: int # 缓存失效策略-基于访问后到期时间(支持inMemeory缓存) expire_after_write: int # 缓存失效策略-基于写入后到期时间(支持redis缓存) maximum_size: int # 缓存失效策略-基于个数大小(支持inMemory、sql缓存) session_tag: str # 用户指定cache会话标志
- 缓存失效策略。
from pangukitsappdev.api.memory.cache.cache_config import CacheStoreConfig # redis缓存配置写入2s后到期 redis_cache = Caches.of("redis", CacheStoreConfig(expire_after_write=2)) # inMemory缓存配置缓存窗口数量为3,访问后2s到期 memory_cache = Caches.of("inMemory", CacheStoreConfig(maximum_size=3, expire_after_access=2)) # sql缓存配置缓存窗口数量为3 sql_cache = Caches.of("sql", CacheStoreConfig(maximum_size=3))
- 语义缓存(同步适配langchain语义缓存暂时不支持expire_after_write)
语义缓存是一种基于向量和相似度的缓存方法,它可以实现对数据的语义匹配和查询。语义缓存可以根据不同的向量存储、相似算法、评分规则和阈值进行配置,并且可以使用不同的词向量模型进行嵌入。
from pangukitsappdev.api.memory.cache.cache_config import CacheStoreConfig, ServerInfoRedis from pangukitsappdev.api.embeddings.factory import Embeddings # redis向量 # 不同的向量存储, 不同的相似算法;计算的评分规则不同; 可以同过scoreThreshold 设置相似性判断阈值 # 例如使用Redis向量、余弦相似度、CSS词向量模型,并且设置相似性判断阈值为0.1f,代码示例如下 embedding_api = Embeddings.of("css") cache_config = CacheStoreConfig(store_name="semantic_redis", server_info=ServerInfoRedis(env_prefix="sdk.memory.dcs"), embedding=embedding_api, vector_store_name="redis", distance_strategy="cosine", score_threshold=0.1, session_tag="test-semantic-cache-vector-001") cache = Caches.of("semantic_redis", cache_config) # 更新数据 # 指向语义缓存中添加或修改数据,需要指定数据的键值对和结果对象 # 例如,把“把缓存是否存在?”这个问题和“test-semantic-cache-vector-001”这个会话标识对应的答案“存在”保存到语义缓存中,代码示例如下 cache.update("缓存是否存在?", LLMResp(answer="存在。")) # 校验,一致 # 用于检查缓存中的数据是否与查询的数据是否一致,如果一致,就返回缓存中的结果对象 # 例如,查询“缓存是否存在?”这个问题和“test-semantic-cache-vector-001”这个会话标识,就可以从缓存中获取到之前保存的答案“存在” query = "缓存是否存在?" cache_value_after = cache.lookup(query) assert cache_value_after is not None print(cache_value_after.answer) # 校验,相似 # 用于检查缓存中的数据是否与查询的数据语义相似,如果相似,就返回缓存中的结果对象。这个操作需要使用向量和相似度的计算,以及设置的阈值来判断 # 例如,查询“缓存存在?”这个问题和“test-semantic-cache-vector-001”这个会话标识,就可以从缓存中获取到之前保存的答案“存在”,因为这个问题和“缓存是否存在?”问题语义相似 query_sim = "缓存存在?" cache_value_semantic = cache.lookup(query_sim) assert cache_value_semantic is not None print(cache_value_semantic.answer) # 校验,不一致 # 用于检查缓存中的数据是否与查询的数据不一致,如果不一致,返回空值 # 例如,查询“有没有数据?”这个问题和“test-semantic-cache-vector-001”这个会话标识,就无法从缓存中获取到任何答案,因为这个问题和之前保存的问题都不一致 query_not = "有没有数据?" assert cache.lookup(query_not) is None
父主题: Memory(记忆)