你想添加什么内容?
在adapter.py的第108行,当尝试根据矢量数据在缓存存储中搜索数据时:
for search_data in search_data_list:
cache_data = time_cal(
chat_cache.data_manager.get_scalar_data,
func_name="get_data",
report_func=chat_cache.report.data,
)(
search_data,
extra_param=context.get("get_scalar_data", None),
session=session,
)
if cache_data is None:
continue
在这里,if cache_data is None
表示从矢量存储中找不到与缓存存储中的数据相匹配的数据。是否最好从矢量存储中删除相应的数据以避免再次访问它?
为什么需要这样做?
由于缓存存储中的数据不再可用(可能是因为缓存生存时间策略等原因),因此删除矢量数据是必要的,以便不再访问过期的缓存数据。
还有其他需要注意的吗?
如果我遗漏了一些细节,请纠正我。
5条答案
按热度按时间dffbzjpn1#
我不建议在这里清理数据,因为当使用驱逐策略使数据无效时,所有数据都将被删除,包括标量和向量。
详细信息: https://github.com/zilliztech/GPTCache/blob/main/gptcache/manager/eviction_manager.py
ep6jt1vc2#
我不建议在这里清理数据,因为当使用驱逐策略使数据无效时,所有数据都将被删除,包括标量和向量。详情:https://github.com/zilliztech/GPTCache/blob/main/gptcache/manager/eviction_manager.py
感谢您的建议。在使用Redis驱逐策略后,我还有一个问题:似乎在驱逐基础中有一个"deleted"字段,eviction_manager.soft_evict()方法将其标记为-1,然后eviction_manager.delete()方法将永久从标量和向量存储中删除软驱逐的数据。
然而,看起来只有内存驱逐存储会尝试执行soft_evict操作。当使用Redis驱逐策略时,有办法标记为已删除吗?似乎在Redis中使用TTL会导致永久删除,相应的向量数据将永远不会被清理。
46qrfjad3#
关于驱逐管理器与驱逐基元之间的关系,你可以参考这个链接:https://github.com/zilliztech/GPTCache/blob/main/gptcache/manager/data_manager.py#L236。实际上,我们在这里抽象了驱逐基元,驱逐管理器的删除并不真正关心策略。
但是我查看了这部分内容,发现确实存在一个bug。在这里,传递的驱逐基元的on_evict内部属性应该被赋值。非常感谢!
如果你有空闲时间,请帮我创建一个pull request。
lmvvr0a84#
关于驱逐管理器(eviction manager)与驱逐基础(evict base)之间的关系,你可以参考这个链接:https://github.com/zilliztech/GPTCache/blob/main/gptcache/manager/data_manager.py#L236。实际上,我们在这里抽象了驱逐基础,驱逐管理器的删除并不真正关心策略。但是我查看了这部分内容,发现确实存在一个bug。在这里,传递的驱逐基础的on_evict内部属性应该被分配一个值。非常感谢!
如果你有空闲时间,请帮我创建一个pull request。
你是说如果我用RedisCacheEviction(或其他实现)初始化一个SSDataManager时,on_evict属性应该用_clear()方法进行初始化吗?
此外,在MemoryCacheEviction实现中,当内存缓存中的键被驱逐时,on_evict函数用作回调函数。所以我认为在RedisCacheEviction中驱逐一个键时,也有必要以某种方式触发on_evict函数。现在我还不知道RedisCacheEviction中如何触发on_evict。
vwoqyblh5#
是的