From d83551c2cf0b96b87030beda53132ec7b1e5f8b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E5=BA=94?= Date: Tue, 3 Feb 2026 14:31:04 +0800 Subject: [PATCH 1/4] =?UTF-8?q?feat(benchmark):=20=E6=9B=B4=E6=96=B0ReMe?= =?UTF-8?q?=E8=AF=84=E4=BC=B0=E9=85=8D=E7=BD=AE=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将最大并发数从2调整为1,批量大小从20调整为40 - 算法版本从halumem更新为v1 - 添加了新的reme_model_name参数用于模型名称配置 - 在MemoryProcessor中使用reme_model_name替代eval_model_name - 主函数中添加batch_size参数传递 - 命令行解析器中添加batch_size参数选项 - 在ReMe中将ReadHistory替换为ReadHistoryV2并配置新参数 --- benchmark/halumem/eval_reme.py | 29 +++++++++++++++++++++-------- reme/reme.py | 19 +++++++++++++++---- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/benchmark/halumem/eval_reme.py b/benchmark/halumem/eval_reme.py index b4fc42de..4e37f2ed 100644 --- a/benchmark/halumem/eval_reme.py +++ b/benchmark/halumem/eval_reme.py @@ -38,12 +38,12 @@ class EvalConfig: data_path: str top_k: int = 20 user_num: int = 1 - max_concurrency: int = 2 - batch_size: int = 20 + max_concurrency: int = 1 + batch_size: int = 40 output_dir: str = "bench_results/reme" reme_model_name: str = "qwen-flash" eval_model_name: str = "qwen3-max" - algo_version: str = "halumem" + algo_version: str = "v1" enable_thinking_params: bool = False @@ -220,7 +220,7 @@ async def answer_question_with_memories( result = await reme.llm.simple_request_for_json( prompt=prompt, - model_name="qwen-flash" + model_name=model_name ) return result @@ -272,8 +272,9 @@ async def evaluation_for_question( class MemoryProcessor: """Handles ReMe memory operations.""" - def __init__(self, reme: ReMe, eval_model_name: str = "qwen3-max", algo_version: str = "halumem", enable_thinking_params: bool = False): + def __init__(self, reme: ReMe, reme_model_name:str="qwen3-max",eval_model_name: str = "qwen3-max", algo_version: str = "halumem", enable_thinking_params: bool = False): self.reme = reme + self.reme_model_name = reme_model_name self.eval_model_name = eval_model_name self.algo_version = algo_version self.enable_thinking_params = enable_thinking_params @@ -353,7 +354,7 @@ class MemoryProcessor: question=query, memories=memories, user_id=user_id, - model_name=self.eval_model_name + model_name=self.reme_model_name, ) # Add original memories to the result @@ -552,6 +553,7 @@ class HaluMemEvaluator: self.file_manager = FileManager(config.output_dir) self.memory_processor = MemoryProcessor( self.reme, + config.reme_model_name, config.eval_model_name, config.algo_version, config.enable_thinking_params @@ -866,6 +868,7 @@ class HaluMemEvaluator: async def main_async( data_path: str, top_k: int, + batch_size: int, user_num: int, max_concurrency: int, reme_model_name: str= "qwen-flash", @@ -877,6 +880,7 @@ async def main_async( config = EvalConfig( data_path=data_path, top_k=top_k, + batch_size=batch_size, user_num=user_num, max_concurrency=max_concurrency, reme_model_name=reme_model_name, @@ -893,6 +897,7 @@ async def main_async( def main( data_path: str, top_k: int, + batch_size: int, user_num: int, max_concurrency: int, reme_model_name: str= "qwen-flash", @@ -904,6 +909,7 @@ def main( asyncio.run(main_async( data_path=data_path, top_k=top_k, + batch_size=batch_size, user_num=user_num, max_concurrency=max_concurrency, reme_model_name=reme_model_name, @@ -944,6 +950,12 @@ if __name__ == "__main__": default=1, help="Maximum concurrent user processing (default: 100)" ) + parser.add_argument( + "--batch_size", + type=int, + default=40, + help="Batch size for memory summary processing of each conversation (default: 40)" + ) parser.add_argument( "--reme_model_name", type=str, @@ -959,8 +971,8 @@ if __name__ == "__main__": parser.add_argument( "--algo_version", type=str, - default="halumem", - help="Algorithm version for summary and retrieval (default: halumem)" + default="v1", + help="Algorithm version for summary and retrieval (default: v1)" ) parser.add_argument( "--enable_thinking_params", @@ -975,6 +987,7 @@ if __name__ == "__main__": main( data_path=args.data_path, top_k=args.top_k, + batch_size=args.batch_size, user_num=args.user_num, max_concurrency=args.max_concurrency, reme_model_name=args.reme_model_name, diff --git a/reme/reme.py b/reme/reme.py index 86f87de4..0de992a9 100644 --- a/reme/reme.py +++ b/reme/reme.py @@ -26,6 +26,7 @@ from .tool.memory import ( RetrieveMemory, DelegateTask, ReadHistory, + ReadHistoryV2, ProfileHandler, MemoryHandler, AddAndRetrieveSimilarMemory, @@ -390,9 +391,13 @@ class ReMe(Application): enable_time_filter=enable_time_filter, enable_multiple=True, ), - ReadHistory( - enable_thinking_params=enable_thinking_params, - enable_multiple=True, + # ReadHistory( + # enable_thinking_params=enable_thinking_params, + # enable_multiple=True, + # ), + ReadHistoryV2( + message_block_size=4, + vector_top_k=3, ), ], ) @@ -408,7 +413,13 @@ class ReMe(Application): top_k=retrieve_top_k, enable_time_filter=enable_time_filter, ), - ReadHistory(enable_thinking_params=enable_thinking_params), + # ReadHistory( + # enable_thinking_params=enable_thinking_params + # ), + ReadHistoryV2( + message_block_size=4, + vector_top_k=3, + ), ], ) else: From 5ffb85a10e25801eeb05a2ff7cc0d19c5457081f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E5=BA=94?= Date: Tue, 3 Feb 2026 14:39:08 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix(halumem):=20=E4=BF=AE=E5=A4=8D=E8=AF=84?= =?UTF-8?q?=E4=BC=B0=E6=A8=A1=E5=9E=8B=E5=90=8D=E7=A7=B0=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将reme_model_name更正为eval_model_name以匹配正确的模型配置 --- benchmark/halumem/eval_reme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmark/halumem/eval_reme.py b/benchmark/halumem/eval_reme.py index 4e37f2ed..cf5b0816 100644 --- a/benchmark/halumem/eval_reme.py +++ b/benchmark/halumem/eval_reme.py @@ -354,7 +354,7 @@ class MemoryProcessor: question=query, memories=memories, user_id=user_id, - model_name=self.reme_model_name, + model_name=self.eval_model_name, ) # Add original memories to the result From 6e26006c9f3efd40e285db19cda8a92e36cf70b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=B9=E5=BA=94?= Date: Tue, 3 Feb 2026 14:55:26 +0800 Subject: [PATCH 3/4] =?UTF-8?q?feat(core):=20=E6=B7=BB=E5=8A=A0=20v2=20?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E7=9A=84=E4=B8=AA=E4=BA=BA=E6=80=BB=E7=BB=93?= =?UTF-8?q?=E5=99=A8=E5=92=8C=E6=A3=80=E7=B4=A2=E5=99=A8=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在版本控制逻辑中加入 v2 版本的支持判断 - 激活了之前被注释掉的 ReadHistory 工具并整合到检索器中 - 调整了 ReMeSummarizer 和 ReMeRetriever 的版本兼容性检查 --- reme/reme.py | 83 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 57 insertions(+), 26 deletions(-) diff --git a/reme/reme.py b/reme/reme.py index 0de992a9..d96aa0fb 100644 --- a/reme/reme.py +++ b/reme/reme.py @@ -239,6 +239,34 @@ class ReMe(Application): ), ], ) + elif version == "v2": + personal_summarizer = PersonalV1Summarizer( + tools=[ + AddDraftAndRetrieveSimilarMemory( + enable_thinking_params=enable_thinking_params, + enable_memory_target=False, + enable_when_to_use=False, + enable_multiple=True, + ), + UpdateMemoryV1( + enable_thinking_params=enable_thinking_params, + enable_memory_target=False, + enable_when_to_use=False, + enable_multiple=True, + ), + ReadAllProfiles( + enable_thinking_params=enable_thinking_params, + enable_memory_target=False, + profile_dir=self.profile_dir, + ), + UpdateProfilesV1( + enable_thinking_params=enable_thinking_params, + enable_memory_target=False, + enable_multiple=True, + profile_dir=self.profile_dir, + ), + ], + ) elif version == "halumem": personal_summarizer = PersonalHalumemSummarizer( tools=[ @@ -249,11 +277,6 @@ class ReMe(Application): UpdateMemoryV2( enable_thinking_params=enable_thinking_params, ), - # RetrieveMemory( - # enable_thinking_params=enable_thinking_params, - # top_k=retrieve_top_k, - # enable_time_filter=enable_time_filter, - # ), # 处理userprofile ReadAllProfiles( enable_thinking_params=enable_thinking_params, @@ -263,27 +286,19 @@ class ReMe(Application): enable_thinking_params=enable_thinking_params, profile_dir=self.profile_dir, ), - # AddProfile( - # enable_thinking_params=enable_thinking_params, - # profile_dir=self.profile_dir, - # ), - # DeleteProfile( - # enable_thinking_params=enable_thinking_params, - # profile_dir=self.profile_dir, - # ), ], ) else: raise NotImplementedError procedural_summarizer: BaseMemoryAgent - if version in ["default", "v1", "halumem"]: + if version in ["default", "v1", "v2", "halumem"]: procedural_summarizer = ProceduralSummarizer(tools=[]) else: raise NotImplementedError tool_summarizer: BaseMemoryAgent - if version in ["default", "v1", "halumem"]: + if version in ["default", "v1", "v2", "halumem"]: tool_summarizer = ToolSummarizer(tools=[]) else: raise NotImplementedError @@ -325,7 +340,7 @@ class ReMe(Application): memory_agents = [personal_summarizer, procedural_summarizer, tool_summarizer] reme_summarizer: BaseMemoryAgent - if version in ["default", "v1", "halumem"]: + if version in ["default", "v1", "v2", "halumem"]: reme_summarizer = ReMeSummarizer(tools=[AddHistory(), DelegateTask(memory_agents=memory_agents)]) else: raise NotImplementedError @@ -391,13 +406,32 @@ class ReMe(Application): enable_time_filter=enable_time_filter, enable_multiple=True, ), - # ReadHistory( - # enable_thinking_params=enable_thinking_params, - # enable_multiple=True, - # ), + ReadHistory( + enable_thinking_params=enable_thinking_params, + enable_multiple=True, + ), + ], + ) + elif version == "v2": + personal_retriever = PersonalV1Retriever( + return_memory_nodes=False, + tools=[ + ReadAllProfiles( + enable_thinking_params=enable_thinking_params, + enable_memory_target=False, + profile_dir=self.profile_dir, + ), + RetrieveMemory( + top_k=retrieve_top_k, + enable_thinking_params=enable_thinking_params, + enable_time_filter=enable_time_filter, + enable_multiple=True, + ), ReadHistoryV2( message_block_size=4, vector_top_k=3, + enable_multiple=True, + enable_thinking_params=enable_thinking_params, ), ], ) @@ -413,9 +447,6 @@ class ReMe(Application): top_k=retrieve_top_k, enable_time_filter=enable_time_filter, ), - # ReadHistory( - # enable_thinking_params=enable_thinking_params - # ), ReadHistoryV2( message_block_size=4, vector_top_k=3, @@ -426,13 +457,13 @@ class ReMe(Application): raise NotImplementedError procedural_retriever: BaseMemoryAgent - if version in ["default", "v1", "halumem"]: + if version in ["default", "v1", "v2", "halumem"]: procedural_retriever = ProceduralRetriever(tools=[]) else: raise NotImplementedError tool_retriever: BaseMemoryAgent - if version in ["default", "v1", "halumem"]: + if version in ["default", "v1", "v2", "halumem"]: tool_retriever = ToolRetriever(tools=[]) else: raise NotImplementedError @@ -472,7 +503,7 @@ class ReMe(Application): memory_agents = [personal_retriever, procedural_retriever, tool_retriever] reme_retriever: BaseMemoryAgent - if version in ["default", "v1", "halumem"]: + if version in ["default", "v1", "v2", "halumem"]: reme_retriever = ReMeRetriever(tools=[DelegateTask(memory_agents=memory_agents)]) else: raise NotImplementedError From 8c05f96fb66496420b1a88841444ce7db13be9e7 Mon Sep 17 00:00:00 2001 From: "jinli.yl" Date: Wed, 4 Feb 2026 17:51:28 +0800 Subject: [PATCH 4/4] feat(agent): implement memory targets filtering in base memory agent - Add memory_targets parameter to filter memory target type mapping - Modify memory_target_type_mapping property to use filtered targets when available - Update REME class to collect memory targets from user, task, and tool names - Pass collected memory targets to agent initialization - Support both string and list inputs for user, task, and tool names - Maintain --- reme/agent/memory/base_memory_agent.py | 7 ++++++- reme/reme.py | 16 ++++++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/reme/agent/memory/base_memory_agent.py b/reme/agent/memory/base_memory_agent.py index 6b97a1c2..fa6cd33e 100644 --- a/reme/agent/memory/base_memory_agent.py +++ b/reme/agent/memory/base_memory_agent.py @@ -53,7 +53,12 @@ class BaseMemoryAgent(BaseReact, metaclass=ABCMeta): @property def memory_target_type_mapping(self) -> dict[str, MemoryType]: """Get the memory target type mapping from context.""" - return self.context.service_context.memory_target_type_mapping + memory_targets = self.context.memory_targets + memory_target_type_mapping = self.context.service_context.memory_target_type_mapping.copy() + if memory_targets: + return {memory_target: memory_target_type_mapping[memory_target] for memory_target in memory_targets} + else: + return memory_target_type_mapping @property def meta_memory_info(self) -> str: diff --git a/reme/reme.py b/reme/reme.py index d96aa0fb..8dfc4b51 100644 --- a/reme/reme.py +++ b/reme/reme.py @@ -304,14 +304,17 @@ class ReMe(Application): raise NotImplementedError memory_agents = [] + memory_targets = [] if user_name: if isinstance(user_name, str): for message in format_messages: message.name = user_name self._add_meta_memory(MemoryType.PERSONAL, user_name) + memory_targets.append(user_name) elif isinstance(user_name, list): for name in user_name: self._add_meta_memory(MemoryType.PERSONAL, name) + memory_targets.append(name) else: raise RuntimeError("user_name must be str or list[str]") memory_agents.append(personal_summarizer) @@ -319,9 +322,11 @@ class ReMe(Application): if task_name: if isinstance(task_name, str): self._add_meta_memory(MemoryType.PROCEDURAL, task_name) + memory_targets.append(task_name) elif isinstance(task_name, list): for name in task_name: self._add_meta_memory(MemoryType.PROCEDURAL, name) + memory_targets.append(name) else: raise RuntimeError("task_name must be str or list[str]") memory_agents.append(procedural_summarizer) @@ -329,9 +334,11 @@ class ReMe(Application): if tool_name: if isinstance(tool_name, str): self._add_meta_memory(MemoryType.TOOL, tool_name) + memory_targets.append(tool_name) elif isinstance(tool_name, list): for name in tool_name: self._add_meta_memory(MemoryType.TOOL, name) + memory_targets.append(name) else: raise RuntimeError("tool_name must be str or list[str]") memory_agents.append(tool_summarizer) @@ -349,6 +356,7 @@ class ReMe(Application): messages=format_messages, description=description, service_context=self.service_context, + memory_targets=memory_targets, **kwargs, ) @@ -469,12 +477,15 @@ class ReMe(Application): raise NotImplementedError memory_agents = [] + memory_targets = [] if user_name: if isinstance(user_name, str): self._add_meta_memory(MemoryType.PERSONAL, user_name) + memory_targets.append(user_name) elif isinstance(user_name, list): for name in user_name: self._add_meta_memory(MemoryType.PERSONAL, name) + memory_targets.append(name) else: raise RuntimeError("user_name must be str or list[str]") memory_agents.append(personal_retriever) @@ -482,9 +493,11 @@ class ReMe(Application): if task_name: if isinstance(task_name, str): self._add_meta_memory(MemoryType.PROCEDURAL, task_name) + memory_targets.append(task_name) elif isinstance(task_name, list): for name in task_name: self._add_meta_memory(MemoryType.PROCEDURAL, name) + memory_targets.append(name) else: raise RuntimeError("task_name must be str or list[str]") memory_agents.append(procedural_retriever) @@ -492,9 +505,11 @@ class ReMe(Application): if tool_name: if isinstance(tool_name, str): self._add_meta_memory(MemoryType.TOOL, tool_name) + memory_targets.append(tool_name) elif isinstance(tool_name, list): for name in tool_name: self._add_meta_memory(MemoryType.TOOL, name) + memory_targets.append(name) else: raise RuntimeError("tool_name must be str or list[str]") memory_agents.append(tool_retriever) @@ -513,6 +528,7 @@ class ReMe(Application): messages=messages, description=description, service_context=self.service_context, + memory_targets=memory_targets, **kwargs, )