更新时间: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

相关文档