diff --git a/config/demo_config.yaml b/config/demo_config_cn.yaml similarity index 91% rename from config/demo_config.yaml rename to config/demo_config_cn.yaml index 61480e64..6fe04368 100644 --- a/config/demo_config.yaml +++ b/config/demo_config_cn.yaml @@ -30,7 +30,12 @@ memory_service: delete_memory: class: memory.operation.frontend_operation - workflow: set_query,retrieve_all_memory,delete_memory + workflow: set_query,retrieve_all_memory,delete_query + description: "delete a single long-term memory" + + delete_all: + class: memory.operation.frontend_operation + workflow: set_query,retrieve_all_memory,delete_all description: "delete all long-term memory" add_memory: @@ -92,16 +97,14 @@ worker: retrieve_obs_top_k: 10000 retrieve_ins_top_k: 10000 retrieve_expired_top_k: 10000 - delete_memory: - class: memory.worker.frontend.update_memory_worker - method: modify_action_status - expired_action: delete - valid_action_dict: - obs_customized: delete - insight: delete - observation: delete + delete_query: + class: memory.worker.write.update_memory_worker + method: delete_query + delete_all: + class: memory.worker.write.update_memory_worker + method: delete_all add_memory: - class: memory.worker.frontend.update_memory_worker + class: memory.worker.write.update_memory_worker method: from_query info_filter: class: memory.worker.write.info_filter_worker diff --git a/memory_scope/memory/worker/frontend/print_memory_worker.py b/memory_scope/memory/worker/frontend/print_memory_worker.py index d53e01ac..71fab1ec 100644 --- a/memory_scope/memory/worker/frontend/print_memory_worker.py +++ b/memory_scope/memory/worker/frontend/print_memory_worker.py @@ -35,7 +35,7 @@ class PrintMemoryWorker(MemoryBaseWorker): elif MemoryTypeEnum(node.memory_type) in [MemoryTypeEnum.OBSERVATION, MemoryTypeEnum.OBS_CUSTOMIZED]: j += 1 - obs_content_list.append(f" {j} {line}") + obs_content_list.append(f" {j} {line} status={node.obs_reflected},{node.obs_updated}") elif MemoryTypeEnum(node.memory_type) is MemoryTypeEnum.INSIGHT: k += 1 diff --git a/memory_scope/memory/worker/frontend/retrieve_memory_worker.py b/memory_scope/memory/worker/frontend/retrieve_memory_worker.py index 47107275..41265600 100644 --- a/memory_scope/memory/worker/frontend/retrieve_memory_worker.py +++ b/memory_scope/memory/worker/frontend/retrieve_memory_worker.py @@ -123,7 +123,7 @@ class RetrieveMemoryWorker(MemoryBaseWorker): memory_node_list = sorted(memory_node_list, key=lambda x: x.score_similar, reverse=True) for node in memory_node_list: - node.action_status = ActionStatusEnum.NONE + node.action_status = ActionStatusEnum.NONE.value self.logger.info(f"recall_stage: content={node.content} score={node.score_similar} type={node.memory_type} " f"store_status={node.store_status} action_status={node.action_status}") diff --git a/memory_scope/memory/worker/summary/get_reflection_subject_worker.py b/memory_scope/memory/worker/summary/get_reflection_subject_worker.py index 59ec9cee..8bd95673 100644 --- a/memory_scope/memory/worker/summary/get_reflection_subject_worker.py +++ b/memory_scope/memory/worker/summary/get_reflection_subject_worker.py @@ -63,8 +63,8 @@ class GetReflectionSubjectWorker(MemoryBaseWorker): # Count unaudited nodes not_reflected_count = len(not_reflected_nodes) - if not_reflected_count <= self.reflect_obs_cnt_threshold: - self.logger.info(f"not_reflected_count={not_reflected_count} is not enough, skip.") + if not_reflected_count < self.reflect_obs_cnt_threshold: + self.logger.info(f"not_reflected_count({not_reflected_count}) < is not enough, skip.") self.continue_run = False return @@ -102,4 +102,5 @@ class GetReflectionSubjectWorker(MemoryBaseWorker): # Mark unaudited nodes as reflected for node in not_reflected_nodes: - node.obs_reflected = True + node.obs_reflected = 1 + node.action_status = ActionStatusEnum.MODIFIED diff --git a/memory_scope/memory/worker/summary/update_insight_worker.py b/memory_scope/memory/worker/summary/update_insight_worker.py index 6c758582..57df7bab 100644 --- a/memory_scope/memory/worker/summary/update_insight_worker.py +++ b/memory_scope/memory/worker/summary/update_insight_worker.py @@ -193,7 +193,10 @@ class UpdateInsightWorker(MemoryBaseWorker): self.gather_thread_result() for node in not_updated_nodes: - node.obs_updated = True + node.obs_updated = 1 + node.action_status = ActionStatusEnum.MODIFIED for node in not_reflected_nodes: - node.obs_updated = True + node.obs_updated = 1 + node.action_status = ActionStatusEnum.MODIFIED + diff --git a/memory_scope/memory/worker/write/load_memory_worker.py b/memory_scope/memory/worker/write/load_memory_worker.py index 14796396..5acd4191 100644 --- a/memory_scope/memory/worker/write/load_memory_worker.py +++ b/memory_scope/memory/worker/write/load_memory_worker.py @@ -26,7 +26,7 @@ class LoadMemoryWorker(MemoryBaseWorker): "target_name": self.target_name, "store_status": StoreStatusEnum.VALID.value, "memory_type": [MemoryTypeEnum.OBSERVATION.value, MemoryTypeEnum.OBS_CUSTOMIZED.value], - "obs_reflected": False, + "obs_reflected": 0, } nodes: List[MemoryNode] = self.memory_store.retrieve_memories(query=query, top_k=self.retrieve_not_reflected_top_k, @@ -43,7 +43,7 @@ class LoadMemoryWorker(MemoryBaseWorker): "target_name": self.target_name, "store_status": StoreStatusEnum.VALID.value, "memory_type": [MemoryTypeEnum.OBSERVATION.value, MemoryTypeEnum.OBS_CUSTOMIZED.value], - "obs_updated": False, + "obs_updated": 0, } nodes: List[MemoryNode] = self.memory_store.retrieve_memories(query=query, top_k=self.retrieve_not_updated_top_k, diff --git a/memory_scope/memory/worker/write/update_memory_worker.py b/memory_scope/memory/worker/write/update_memory_worker.py index a4ae6e0b..601abf6f 100644 --- a/memory_scope/memory/worker/write/update_memory_worker.py +++ b/memory_scope/memory/worker/write/update_memory_worker.py @@ -1,8 +1,7 @@ -from typing import Dict, List +from typing import List from memory_scope.enumeration.action_status_enum import ActionStatusEnum from memory_scope.enumeration.memory_type_enum import MemoryTypeEnum -from memory_scope.enumeration.store_status_enum import StoreStatusEnum from memory_scope.memory.worker.memory_base_worker import MemoryBaseWorker from memory_scope.scheme.memory_node import MemoryNode from memory_scope.utils.datetime_handler import DatetimeHandler @@ -13,8 +12,6 @@ class UpdateMemoryWorker(MemoryBaseWorker): def _parse_params(self, **kwargs): self.method: str = kwargs.get("method", "") self.memory_key: str = kwargs.get("memory_key", "") - self.expired_action: str = kwargs.get("expired_action", "") - self.valid_action_dict: Dict[str, str] = kwargs.get("expired_action", {}) def from_query(self): if "query" not in self.chat_kwargs: @@ -39,17 +36,28 @@ class UpdateMemoryWorker(MemoryBaseWorker): return self.memory_handler.get_memories(keys=self.memory_key) - def modify_action_status(self): + def delete_all(self): nodes: List[MemoryNode] = self.memory_handler.get_memories(keys="all") for node in nodes: - if self.expired_action and node.store_status == StoreStatusEnum.EXPIRED.value: - node.action_status = self.expired_action + node.action_status = ActionStatusEnum.DELETE.value + self.logger.info(f"delete_all.size={len(nodes)}") + return nodes - elif node.memory_type in self.valid_action_dict: - action_status = self.valid_action_dict[node.memory_type] - if action_status: - node.action_status = action_status + def delete_query(self): + if "query" not in self.chat_kwargs: + return + query = self.chat_kwargs["query"].strip() + if not query: + return + + i = 0 + nodes: List[MemoryNode] = self.memory_handler.get_memories(keys="all") + for node in nodes: + if node.content == query: + i += 1 + node.action_status = ActionStatusEnum.DELETE.value + self.logger.info(f"delete_query.size={len(nodes)}") return nodes def _run(self): diff --git a/memory_scope/scheme/memory_node.py b/memory_scope/scheme/memory_node.py index 8303b7a7..0edd0248 100644 --- a/memory_scope/scheme/memory_node.py +++ b/memory_scope/scheme/memory_node.py @@ -44,9 +44,9 @@ class MemoryNode(BaseModel): dt: str = Field("", description="dt of the memory node") - obs_reflected: bool = Field(False, description="if the observation is reflected") + obs_reflected: int = Field(0, description="if the observation is reflected: 0/1") - obs_updated: bool = Field(False, description="if the observation has updated user profile or insight") + obs_updated: int = Field(0, description="if the observation has updated user profile or insight: 0/1") def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/memory_scope/utils/memory_handler.py b/memory_scope/utils/memory_handler.py index 223f017b..7bbe25e8 100644 --- a/memory_scope/utils/memory_handler.py +++ b/memory_scope/utils/memory_handler.py @@ -46,8 +46,8 @@ class MemoryHandler(object): for node in nodes: if node.memory_id in self._id_memory_dict: if log_repeat: - self.logger.warning(f"repeated_id memory id={node.memory_id} content={node.content} " - f"store_status={node.store_status} action_status={node.action_status}") + self.logger.debug(f"repeated_id memory id={node.memory_id} content={node.content} " + f"store_status={node.store_status} action_status={node.action_status}") continue self._id_memory_dict[node.memory_id] = node