Files
Mofox-Core/src/common/vector_db/base.py
minecraft1024a 8a8d2ed574 refactor(memory): 重构向量记忆清理逻辑以提高稳定性
原有的清理逻辑直接使用 delete 和 where 条件(timestamp: {"$lt": ...})来删除过期记录。然而,ChromaDB 对元数据中复杂的查询操作符(如 $lt)的支持并不可靠。

为确保过期记录能被稳定地清除,本次提交将清理策略修改为更稳健的“获取-过滤-删除”模式:

1.  为向量数据库抽象层新增 `get` 方法,并为 ChromaDB 提供具体实现。
2.  在 `VectorInstantMemoryV2` 中,先获取指定聊天的所有记录。
3.  在应用代码中根据时间戳筛选出过期的记录ID。
4.  最后根据ID列表精确删除过期记录,确保了清理操作的准确性。
2025-08-27 21:40:03 +08:00

145 lines
4.7 KiB
Python

from abc import ABC, abstractmethod
from typing import Any, Dict, List, Optional
class VectorDBBase(ABC):
"""
向量数据库的抽象基类 (ABC),定义了所有向量数据库实现必须遵循的接口。
"""
@abstractmethod
def __init__(self, path: str, **kwargs: Any):
"""
初始化向量数据库客户端。
Args:
path (str): 数据库文件的存储路径。
**kwargs: 其他特定于实现的参数。
"""
pass
@abstractmethod
def get_or_create_collection(self, name: str, **kwargs: Any) -> Any:
"""
获取或创建一个集合 (Collection)。
Args:
name (str): 集合的名称。
**kwargs: 其他特定于实现的参数 (例如 metadata)。
Returns:
Any: 代表集合的对象。
"""
pass
@abstractmethod
def add(
self,
collection_name: str,
embeddings: List[List[float]],
documents: Optional[List[str]] = None,
metadatas: Optional[List[Dict[str, Any]]] = None,
ids: Optional[List[str]] = None,
) -> None:
"""
向指定集合中添加数据。
Args:
collection_name (str): 目标集合的名称。
embeddings (List[List[float]]): 向量列表。
documents (Optional[List[str]], optional): 文档列表。Defaults to None.
metadatas (Optional[List[Dict[str, Any]]], optional): 元数据列表。Defaults to None.
ids (Optional[List[str]], optional): ID 列表。Defaults to None.
"""
pass
@abstractmethod
def query(
self,
collection_name: str,
query_embeddings: List[List[float]],
n_results: int = 1,
where: Optional[Dict[str, Any]] = None,
**kwargs: Any,
) -> Dict[str, List[Any]]:
"""
在指定集合中查询相似向量。
Args:
collection_name (str): 目标集合的名称。
query_embeddings (List[List[float]]): 用于查询的向量列表。
n_results (int, optional): 返回结果的数量。Defaults to 1.
where (Optional[Dict[str, Any]], optional): 元数据过滤条件。Defaults to None.
**kwargs: 其他特定于实现的参数。
Returns:
Dict[str, List[Any]]: 查询结果,通常包含 ids, distances, metadatas, documents。
"""
pass
@abstractmethod
def delete(
self,
collection_name: str,
ids: Optional[List[str]] = None,
where: Optional[Dict[str, Any]] = None,
) -> None:
"""
从指定集合中删除数据。
Args:
collection_name (str): 目标集合的名称。
ids (Optional[List[str]], optional): 要删除的条目的 ID 列表。Defaults to None.
where (Optional[Dict[str, Any]], optional): 基于元数据的过滤条件。Defaults to None.
"""
pass
@abstractmethod
def get(
self,
collection_name: str,
ids: Optional[List[str]] = None,
where: Optional[Dict[str, Any]] = None,
limit: Optional[int] = None,
offset: Optional[int] = None,
where_document: Optional[Dict[str, Any]] = None,
include: Optional[List[str]] = None,
) -> Dict[str, Any]:
"""
根据条件从集合中获取数据。
Args:
collection_name (str): 目标集合的名称。
ids (Optional[List[str]], optional): 要获取的条目的 ID 列表。Defaults to None.
where (Optional[Dict[str, Any]], optional): 基于元数据的过滤条件。Defaults to None.
limit (Optional[int], optional): 返回结果的数量限制。Defaults to None.
offset (Optional[int], optional): 返回结果的偏移量。Defaults to None.
where_document (Optional[Dict[str, Any]], optional): 基于文档内容的过滤条件。Defaults to None.
include (Optional[List[str]], optional): 指定返回的数据字段 (e.g., ["metadatas", "documents"])。Defaults to None.
Returns:
Dict[str, Any]: 获取到的数据。
"""
pass
@abstractmethod
def count(self, collection_name: str) -> int:
"""
获取指定集合中的条目总数。
Args:
collection_name (str): 目标集合的名称。
Returns:
int: 条目总数。
"""
pass
@abstractmethod
def delete_collection(self, name: str) -> None:
"""
删除一个集合。
Args:
name (str): 要删除的集合的名称。
"""
pass