mirror of https://github.com/Mai-with-u/MaiBot.git
better:优化记忆的合并
parent
92e90a0bee
commit
feb40cac70
|
|
@ -429,14 +429,23 @@ class MemoryChest:
|
||||||
try:
|
try:
|
||||||
all_titles = self.get_all_titles(exclude_locked=True)
|
all_titles = self.get_all_titles(exclude_locked=True)
|
||||||
content = ""
|
content = ""
|
||||||
|
display_index = 1
|
||||||
for title in all_titles:
|
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"""
|
prompt = f"""
|
||||||
所有记忆列表
|
所有记忆列表
|
||||||
{content}
|
{content}
|
||||||
|
|
||||||
请根据以上记忆列表,选择一个与"{memory_title}"相关的记忆,用json输出:
|
请根据以上记忆列表,选择一个与"{memory_title}"相关的记忆,用json输出:
|
||||||
|
如果没有相关记忆,输出:
|
||||||
|
{{
|
||||||
|
"selected_title": ""
|
||||||
|
}}
|
||||||
可以选择多个相关的记忆,但最多不超过5个
|
可以选择多个相关的记忆,但最多不超过5个
|
||||||
例如:
|
例如:
|
||||||
{{
|
{{
|
||||||
|
|
@ -449,8 +458,12 @@ class MemoryChest:
|
||||||
"selected_title": "选择的相关记忆标题"
|
"selected_title": "选择的相关记忆标题"
|
||||||
}}
|
}}
|
||||||
...
|
...
|
||||||
|
注意:请返回原始标题本身作为 selected_title,不要包含前面的序号或多余字符。
|
||||||
请输出JSON格式,不要输出其他内容:
|
请输出JSON格式,不要输出其他内容:
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
logger.info(f"选择合并目标 prompt: {prompt}")
|
||||||
|
|
||||||
if global_config.debug.show_prompt:
|
if global_config.debug.show_prompt:
|
||||||
logger.info(f"选择合并目标 prompt: {prompt}")
|
logger.info(f"选择合并目标 prompt: {prompt}")
|
||||||
else:
|
else:
|
||||||
|
|
@ -465,7 +478,7 @@ class MemoryChest:
|
||||||
selected_contents = self._get_memories_by_titles(selected_titles)
|
selected_contents = self._get_memories_by_titles(selected_titles)
|
||||||
|
|
||||||
logger.info(f"选择合并目标结果: {len(selected_contents)} 条记忆:{selected_titles}")
|
logger.info(f"选择合并目标结果: {len(selected_contents)} 条记忆:{selected_titles}")
|
||||||
return selected_contents
|
return selected_titles,selected_contents
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"选择合并目标时出错: {e}")
|
logger.error(f"选择合并目标时出错: {e}")
|
||||||
|
|
@ -509,7 +522,7 @@ class MemoryChest:
|
||||||
logger.error(f"查找标题 '{title}' 的记忆时出错: {e}")
|
logger.error(f"查找标题 '{title}' 的记忆时出错: {e}")
|
||||||
continue
|
continue
|
||||||
|
|
||||||
logger.info(f"成功找到 {len(contents)} 条记忆内容")
|
# logger.info(f"成功找到 {len(contents)} 条记忆内容")
|
||||||
return contents
|
return contents
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
@ -556,8 +569,6 @@ class MemoryChest:
|
||||||
part2_content = ""
|
part2_content = ""
|
||||||
logger.info("part2内容为none,设置为空")
|
logger.info("part2内容为none,设置为空")
|
||||||
|
|
||||||
logger.info(f"解析合并记忆结果: part1={len(part1_content)}字符, part2={len(part2_content)}字符")
|
|
||||||
|
|
||||||
return part1_content, part2_content
|
return part1_content, part2_content
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
|
@ -586,11 +597,18 @@ class MemoryChest:
|
||||||
titles = []
|
titles = []
|
||||||
for item in parsed_data:
|
for item in parsed_data:
|
||||||
if isinstance(item, dict) and "selected_title" in item:
|
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
|
return titles
|
||||||
elif isinstance(parsed_data, dict) and "selected_title" in parsed_data:
|
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:
|
except json.JSONDecodeError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
@ -604,7 +622,9 @@ class MemoryChest:
|
||||||
try:
|
try:
|
||||||
obj = json.loads(match)
|
obj = json.loads(match)
|
||||||
if "selected_title" in obj:
|
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:
|
except json.JSONDecodeError:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -103,24 +103,25 @@ class MemoryManagementTask(AsyncTask):
|
||||||
logger.warning("[记忆管理] 无法获取随机记忆标题,跳过执行")
|
logger.warning("[记忆管理] 无法获取随机记忆标题,跳过执行")
|
||||||
return
|
return
|
||||||
|
|
||||||
# 执行choose_merge_target获取相关记忆内容
|
# 执行choose_merge_target获取相关记忆(标题与内容)
|
||||||
related_contents_titles = await global_memory_chest.choose_merge_target(selected_title)
|
related_titles, related_contents = await global_memory_chest.choose_merge_target(selected_title)
|
||||||
if not related_contents_titles:
|
if not related_titles or not related_contents:
|
||||||
logger.info("无合适合并内容,跳过本次合并")
|
logger.info("无合适合并内容,跳过本次合并")
|
||||||
return
|
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合并记忆
|
# 执行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:
|
if not merged_title or not merged_content:
|
||||||
logger.warning("[记忆管理] 记忆合并失败,跳过删除")
|
logger.warning("[记忆管理] 记忆合并失败,跳过删除")
|
||||||
return
|
return
|
||||||
|
|
||||||
logger.info(f"[记忆管理] 记忆合并成功,新标题: {merged_title}")
|
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(f"[记忆管理] 已删除 {deleted_count} 条原始记忆")
|
||||||
|
|
||||||
logger.info("[记忆管理] 记忆管理任务完成")
|
logger.info("[记忆管理] 记忆管理任务完成")
|
||||||
|
|
@ -144,15 +145,15 @@ class MemoryManagementTask(AsyncTask):
|
||||||
logger.error(f"[记忆管理] 获取随机记忆标题时发生错误: {e}")
|
logger.error(f"[记忆管理] 获取随机记忆标题时发生错误: {e}")
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
def _delete_original_memories(self, related_contents: List[str]) -> int:
|
def _delete_original_memories(self, related_titles: List[str]) -> int:
|
||||||
"""删除原始记忆"""
|
"""按标题删除原始记忆"""
|
||||||
try:
|
try:
|
||||||
deleted_count = 0
|
deleted_count = 0
|
||||||
# 删除相关记忆(通过内容匹配)
|
# 删除相关记忆(通过标题匹配)
|
||||||
for content in related_contents:
|
for title in related_titles:
|
||||||
try:
|
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:
|
for memory in memories_to_delete:
|
||||||
MemoryChestModel.delete().where(MemoryChestModel.id == memory.id).execute()
|
MemoryChestModel.delete().where(MemoryChestModel.id == memory.id).execute()
|
||||||
deleted_count += 1
|
deleted_count += 1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue