From feb40cac70802dfb1fbb37d8ea18446c9a03e547 Mon Sep 17 00:00:00 2001 From: SengokuCola <1026294844@qq.com> Date: Thu, 2 Oct 2025 01:38:47 +0800 Subject: [PATCH] =?UTF-8?q?better=EF=BC=9A=E4=BC=98=E5=8C=96=E8=AE=B0?= =?UTF-8?q?=E5=BF=86=E7=9A=84=E5=90=88=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/memory_system/Memory_chest.py | 36 ++++++++++++++++----- src/memory_system/memory_management_task.py | 27 ++++++++-------- 2 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/memory_system/Memory_chest.py b/src/memory_system/Memory_chest.py index 06240cca..cecd0a63 100644 --- a/src/memory_system/Memory_chest.py +++ b/src/memory_system/Memory_chest.py @@ -429,14 +429,23 @@ class MemoryChest: try: all_titles = self.get_all_titles(exclude_locked=True) content = "" + display_index = 1 for title in all_titles: - content += f"{title}\n" + # 剔除掉输入的 memory_title 本身 + if title and title.strip() == (memory_title or "").strip(): + continue + content += f"{display_index}. {title}\n" + display_index += 1 prompt = f""" 所有记忆列表 {content} 请根据以上记忆列表,选择一个与"{memory_title}"相关的记忆,用json输出: +如果没有相关记忆,输出: +{{ + "selected_title": "" +}} 可以选择多个相关的记忆,但最多不超过5个 例如: {{ @@ -449,8 +458,12 @@ class MemoryChest: "selected_title": "选择的相关记忆标题" }} ... +注意:请返回原始标题本身作为 selected_title,不要包含前面的序号或多余字符。 请输出JSON格式,不要输出其他内容: """ + + logger.info(f"选择合并目标 prompt: {prompt}") + if global_config.debug.show_prompt: logger.info(f"选择合并目标 prompt: {prompt}") else: @@ -465,7 +478,7 @@ class MemoryChest: selected_contents = self._get_memories_by_titles(selected_titles) logger.info(f"选择合并目标结果: {len(selected_contents)} 条记忆:{selected_titles}") - return selected_contents + return selected_titles,selected_contents except Exception as e: logger.error(f"选择合并目标时出错: {e}") @@ -509,7 +522,7 @@ class MemoryChest: logger.error(f"查找标题 '{title}' 的记忆时出错: {e}") continue - logger.info(f"成功找到 {len(contents)} 条记忆内容") + # logger.info(f"成功找到 {len(contents)} 条记忆内容") return contents except Exception as e: @@ -556,8 +569,6 @@ class MemoryChest: part2_content = "" logger.info("part2内容为none,设置为空") - logger.info(f"解析合并记忆结果: part1={len(part1_content)}字符, part2={len(part2_content)}字符") - return part1_content, part2_content except Exception as e: @@ -586,11 +597,18 @@ class MemoryChest: titles = [] for item in parsed_data: if isinstance(item, dict) and "selected_title" in item: - titles.append(item["selected_title"]) + value = item.get("selected_title", "") + if isinstance(value, str) and value.strip(): + titles.append(value) return titles elif isinstance(parsed_data, dict) and "selected_title" in parsed_data: # 如果是单个对象 - return [parsed_data["selected_title"]] + value = parsed_data.get("selected_title", "") + if isinstance(value, str) and value.strip(): + return [value] + else: + # 空字符串表示没有相关记忆 + return [] except json.JSONDecodeError: pass @@ -604,7 +622,9 @@ class MemoryChest: try: obj = json.loads(match) if "selected_title" in obj: - titles.append(obj["selected_title"]) + value = obj.get("selected_title", "") + if isinstance(value, str) and value.strip(): + titles.append(value) except json.JSONDecodeError: continue diff --git a/src/memory_system/memory_management_task.py b/src/memory_system/memory_management_task.py index 0356e8b0..b906c712 100644 --- a/src/memory_system/memory_management_task.py +++ b/src/memory_system/memory_management_task.py @@ -103,24 +103,25 @@ class MemoryManagementTask(AsyncTask): logger.warning("[记忆管理] 无法获取随机记忆标题,跳过执行") return - # 执行choose_merge_target获取相关记忆内容 - related_contents_titles = await global_memory_chest.choose_merge_target(selected_title) - if not related_contents_titles: + # 执行choose_merge_target获取相关记忆(标题与内容) + related_titles, related_contents = await global_memory_chest.choose_merge_target(selected_title) + if not related_titles or not related_contents: logger.info("无合适合并内容,跳过本次合并") return - logger.info(f"为 [{selected_title}] 找到 {len(related_contents_titles)} 条相关记忆:related_contents_titles") + logger.info(f"为 [{selected_title}] 找到 {len(related_contents)} 条相关记忆:{related_titles}") # 执行merge_memory合并记忆 - merged_title, merged_content = await global_memory_chest.merge_memory(related_contents_titles) + merged_title, merged_content = await global_memory_chest.merge_memory(related_contents) if not merged_title or not merged_content: logger.warning("[记忆管理] 记忆合并失败,跳过删除") return logger.info(f"[记忆管理] 记忆合并成功,新标题: {merged_title}") - # 删除原始记忆(包括选中的标题和相关的记忆) - deleted_count = self._delete_original_memories(related_contents_titles) + # 删除原始记忆(包括选中的标题和相关的记忆标题) + titles_to_delete = [selected_title] + related_titles + deleted_count = self._delete_original_memories(titles_to_delete) logger.info(f"[记忆管理] 已删除 {deleted_count} 条原始记忆") logger.info("[记忆管理] 记忆管理任务完成") @@ -144,15 +145,15 @@ class MemoryManagementTask(AsyncTask): logger.error(f"[记忆管理] 获取随机记忆标题时发生错误: {e}") return "" - def _delete_original_memories(self, related_contents: List[str]) -> int: - """删除原始记忆""" + def _delete_original_memories(self, related_titles: List[str]) -> int: + """按标题删除原始记忆""" try: deleted_count = 0 - # 删除相关记忆(通过内容匹配) - for content in related_contents: + # 删除相关记忆(通过标题匹配) + for title in related_titles: try: - # 通过内容查找并删除对应的记忆 - memories_to_delete = MemoryChestModel.select().where(MemoryChestModel.content == content) + # 通过标题查找并删除对应的记忆 + memories_to_delete = MemoryChestModel.select().where(MemoryChestModel.title == title) for memory in memories_to_delete: MemoryChestModel.delete().where(MemoryChestModel.id == memory.id).execute() deleted_count += 1