Merge branch 'debug' into fix/20250310-logger-optimize
This commit is contained in:
@@ -40,6 +40,10 @@
|
|||||||
**交流群**: 571780722 另一个群(开发和建议相关讨论)不一定有空回复,会优先写文档和代码
|
**交流群**: 571780722 另一个群(开发和建议相关讨论)不一定有空回复,会优先写文档和代码
|
||||||
**交流群**: 1035228475 另一个群(开发和建议相关讨论)不一定有空回复,会优先写文档和代码
|
**交流群**: 1035228475 另一个群(开发和建议相关讨论)不一定有空回复,会优先写文档和代码
|
||||||
|
|
||||||
|
**其他平台版本**
|
||||||
|
|
||||||
|
- (由 [CabLate](https://github.com/cablate) 贡献) [Telegram 与其他平台(未来可能会有)的版本](https://github.com/cablate/MaiMBot/tree/telegram) - [集中讨论串](https://github.com/SengokuCola/MaiMBot/discussions/149)
|
||||||
|
|
||||||
##
|
##
|
||||||
<div align="left">
|
<div align="left">
|
||||||
<h2>📚 文档 ⬇️ 快速开始使用麦麦 ⬇️</h2>
|
<h2>📚 文档 ⬇️ 快速开始使用麦麦 ⬇️</h2>
|
||||||
|
|||||||
2
run.py
2
run.py
@@ -98,7 +98,7 @@ def install_mongodb_compass():
|
|||||||
run_cmd(r"powershell mongodb\bin\Install-Compass.ps1")
|
run_cmd(r"powershell mongodb\bin\Install-Compass.ps1")
|
||||||
input("按任意键启动麦麦")
|
input("按任意键启动麦麦")
|
||||||
input("如不需要启动此窗口可直接关闭,无需等待 Compass 安装完成")
|
input("如不需要启动此窗口可直接关闭,无需等待 Compass 安装完成")
|
||||||
install_mongodb_compass()
|
run_maimbot()
|
||||||
|
|
||||||
|
|
||||||
def install_napcat():
|
def install_napcat():
|
||||||
|
|||||||
@@ -8,7 +8,18 @@ if errorlevel 1 (
|
|||||||
exit /b 1
|
exit /b 1
|
||||||
)
|
)
|
||||||
echo Conda 环境 "%CONDA_ENV%" 激活成功
|
echo Conda 环境 "%CONDA_ENV%" 激活成功
|
||||||
python src/plugins/memory_system/memory_manual_build.py
|
|
||||||
|
set /p OPTION="请选择运行选项 (1: 运行全部绘制, 2: 运行简单绘制): "
|
||||||
|
if "%OPTION%"=="1" (
|
||||||
|
python src/plugins/memory_system/memory_manual_build.py
|
||||||
|
) else if "%OPTION%"=="2" (
|
||||||
|
python src/plugins/memory_system/draw_memory.py
|
||||||
|
) else (
|
||||||
|
echo 无效的选项
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
if errorlevel 1 (
|
if errorlevel 1 (
|
||||||
echo 命令执行失败,错误代码 %errorlevel%
|
echo 命令执行失败,错误代码 %errorlevel%
|
||||||
pause
|
pause
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ class EmojiManager:
|
|||||||
self.llm_emotion_judge = LLM_request(model=global_config.llm_normal_minor, max_tokens=60,
|
self.llm_emotion_judge = LLM_request(model=global_config.llm_normal_minor, max_tokens=60,
|
||||||
temperature=0.8) # 更高的温度,更少的token(后续可以根据情绪来调整温度)
|
temperature=0.8) # 更高的温度,更少的token(后续可以根据情绪来调整温度)
|
||||||
|
|
||||||
|
|
||||||
def _ensure_emoji_dir(self):
|
def _ensure_emoji_dir(self):
|
||||||
"""确保表情存储目录存在"""
|
"""确保表情存储目录存在"""
|
||||||
os.makedirs(self.EMOJI_DIR, exist_ok=True)
|
os.makedirs(self.EMOJI_DIR, exist_ok=True)
|
||||||
@@ -331,3 +332,4 @@ class EmojiManager:
|
|||||||
|
|
||||||
# 创建全局单例
|
# 创建全局单例
|
||||||
emoji_manager = EmojiManager()
|
emoji_manager = EmojiManager()
|
||||||
|
|
||||||
|
|||||||
@@ -99,24 +99,27 @@ def calculate_information_content(text):
|
|||||||
|
|
||||||
|
|
||||||
def get_cloest_chat_from_db(db, length: int, timestamp: str):
|
def get_cloest_chat_from_db(db, length: int, timestamp: str):
|
||||||
"""从数据库中获取最接近指定时间戳的聊天记录,并记录读取次数"""
|
"""从数据库中获取最接近指定时间戳的聊天记录,并记录读取次数
|
||||||
chat_text = ''
|
|
||||||
|
Returns:
|
||||||
|
list: 消息记录字典列表,每个字典包含消息内容和时间信息
|
||||||
|
"""
|
||||||
|
chat_records = []
|
||||||
closest_record = db.db.messages.find_one({"time": {"$lte": timestamp}}, sort=[('time', -1)])
|
closest_record = db.db.messages.find_one({"time": {"$lte": timestamp}}, sort=[('time', -1)])
|
||||||
|
|
||||||
if closest_record and closest_record.get('memorized', 0) < 4:
|
if closest_record and closest_record.get('memorized', 0) < 4:
|
||||||
closest_time = closest_record['time']
|
closest_time = closest_record['time']
|
||||||
group_id = closest_record['group_id'] # 获取groupid
|
group_id = closest_record['group_id']
|
||||||
# 获取该时间戳之后的length条消息,且groupid相同
|
# 获取该时间戳之后的length条消息,且groupid相同
|
||||||
chat_records = list(db.db.messages.find(
|
records = list(db.db.messages.find(
|
||||||
{"time": {"$gt": closest_time}, "group_id": group_id}
|
{"time": {"$gt": closest_time}, "group_id": group_id}
|
||||||
).sort('time', 1).limit(length))
|
).sort('time', 1).limit(length))
|
||||||
|
|
||||||
# 更新每条消息的memorized属性
|
# 更新每条消息的memorized属性
|
||||||
for record in chat_records:
|
for record in records:
|
||||||
# 检查当前记录的memorized值
|
|
||||||
current_memorized = record.get('memorized', 0)
|
current_memorized = record.get('memorized', 0)
|
||||||
if current_memorized > 3:
|
if current_memorized > 3:
|
||||||
# print(f"消息已读取3次,跳过")
|
print("消息已读取3次,跳过")
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
# 更新memorized值
|
# 更新memorized值
|
||||||
@@ -125,11 +128,14 @@ def get_cloest_chat_from_db(db, length: int, timestamp: str):
|
|||||||
{"$set": {"memorized": current_memorized + 1}}
|
{"$set": {"memorized": current_memorized + 1}}
|
||||||
)
|
)
|
||||||
|
|
||||||
chat_text += record["detailed_plain_text"]
|
# 添加到记录列表中
|
||||||
|
chat_records.append({
|
||||||
|
'text': record["detailed_plain_text"],
|
||||||
|
'time': record["time"],
|
||||||
|
'group_id': record["group_id"]
|
||||||
|
})
|
||||||
|
|
||||||
return chat_text
|
return chat_records
|
||||||
# print(f"消息已读取3次,跳过")
|
|
||||||
return ''
|
|
||||||
|
|
||||||
|
|
||||||
async def get_recent_group_messages(db, group_id: int, limit: int = 12) -> list:
|
async def get_recent_group_messages(db, group_id: int, limit: int = 12) -> list:
|
||||||
|
|||||||
@@ -201,67 +201,6 @@ def topic_what(text, topic):
|
|||||||
prompt = f'这是一段文字:{text}。我想知道这记忆里有什么关于{topic}的话题,帮我总结成一句自然的话,可以包含时间和人物。只输出这句话就好'
|
prompt = f'这是一段文字:{text}。我想知道这记忆里有什么关于{topic}的话题,帮我总结成一句自然的话,可以包含时间和人物。只输出这句话就好'
|
||||||
return prompt
|
return prompt
|
||||||
|
|
||||||
def visualize_graph(memory_graph: Memory_graph, color_by_memory: bool = False):
|
|
||||||
# 设置中文字体
|
|
||||||
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
|
|
||||||
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
|
|
||||||
|
|
||||||
G = memory_graph.G
|
|
||||||
|
|
||||||
# 保存图到本地
|
|
||||||
nx.write_gml(G, "memory_graph.gml") # 保存为 GML 格式
|
|
||||||
|
|
||||||
# 根据连接条数或记忆数量设置节点颜色
|
|
||||||
node_colors = []
|
|
||||||
nodes = list(G.nodes()) # 获取图中实际的节点列表
|
|
||||||
|
|
||||||
if color_by_memory:
|
|
||||||
# 计算每个节点的记忆数量
|
|
||||||
memory_counts = []
|
|
||||||
for node in nodes:
|
|
||||||
memory_items = G.nodes[node].get('memory_items', [])
|
|
||||||
if isinstance(memory_items, list):
|
|
||||||
count = len(memory_items)
|
|
||||||
else:
|
|
||||||
count = 1 if memory_items else 0
|
|
||||||
memory_counts.append(count)
|
|
||||||
max_memories = max(memory_counts) if memory_counts else 1
|
|
||||||
|
|
||||||
for count in memory_counts:
|
|
||||||
# 使用不同的颜色方案:红色表示记忆多,蓝色表示记忆少
|
|
||||||
if max_memories > 0:
|
|
||||||
intensity = min(1.0, count / max_memories)
|
|
||||||
color = (intensity, 0, 1.0 - intensity) # 从蓝色渐变到红色
|
|
||||||
else:
|
|
||||||
color = (0, 0, 1) # 如果没有记忆,则为蓝色
|
|
||||||
node_colors.append(color)
|
|
||||||
else:
|
|
||||||
# 使用原来的连接数量着色方案
|
|
||||||
max_degree = max(G.degree(), key=lambda x: x[1])[1] if G.degree() else 1
|
|
||||||
for node in nodes:
|
|
||||||
degree = G.degree(node)
|
|
||||||
if max_degree > 0:
|
|
||||||
red = min(1.0, degree / max_degree)
|
|
||||||
blue = 1.0 - red
|
|
||||||
color = (red, 0, blue)
|
|
||||||
else:
|
|
||||||
color = (0, 0, 1)
|
|
||||||
node_colors.append(color)
|
|
||||||
|
|
||||||
# 绘制图形
|
|
||||||
plt.figure(figsize=(12, 8))
|
|
||||||
pos = nx.spring_layout(G, k=1, iterations=50)
|
|
||||||
nx.draw(G, pos,
|
|
||||||
with_labels=True,
|
|
||||||
node_color=node_colors,
|
|
||||||
node_size=200,
|
|
||||||
font_size=10,
|
|
||||||
font_family='SimHei',
|
|
||||||
font_weight='bold')
|
|
||||||
|
|
||||||
title = '记忆图谱可视化 - ' + ('按记忆数量着色' if color_by_memory else '按连接数量着色')
|
|
||||||
plt.title(title, fontsize=16, fontfamily='SimHei')
|
|
||||||
plt.show()
|
|
||||||
|
|
||||||
|
|
||||||
def visualize_graph_lite(memory_graph: Memory_graph, color_by_memory: bool = False):
|
def visualize_graph_lite(memory_graph: Memory_graph, color_by_memory: bool = False):
|
||||||
@@ -280,7 +219,7 @@ def visualize_graph_lite(memory_graph: Memory_graph, color_by_memory: bool = Fal
|
|||||||
memory_items = H.nodes[node].get('memory_items', [])
|
memory_items = H.nodes[node].get('memory_items', [])
|
||||||
memory_count = len(memory_items) if isinstance(memory_items, list) else (1 if memory_items else 0)
|
memory_count = len(memory_items) if isinstance(memory_items, list) else (1 if memory_items else 0)
|
||||||
degree = H.degree(node)
|
degree = H.degree(node)
|
||||||
if memory_count < 5 or degree < 2: # 改为小于2而不是小于等于2
|
if memory_count < 3 or degree < 2: # 改为小于2而不是小于等于2
|
||||||
nodes_to_remove.append(node)
|
nodes_to_remove.append(node)
|
||||||
|
|
||||||
H.remove_nodes_from(nodes_to_remove)
|
H.remove_nodes_from(nodes_to_remove)
|
||||||
@@ -291,7 +230,7 @@ def visualize_graph_lite(memory_graph: Memory_graph, color_by_memory: bool = Fal
|
|||||||
return
|
return
|
||||||
|
|
||||||
# 保存图到本地
|
# 保存图到本地
|
||||||
nx.write_gml(H, "memory_graph.gml") # 保存为 GML 格式
|
# nx.write_gml(H, "memory_graph.gml") # 保存为 GML 格式
|
||||||
|
|
||||||
# 计算节点大小和颜色
|
# 计算节点大小和颜色
|
||||||
node_colors = []
|
node_colors = []
|
||||||
@@ -315,21 +254,23 @@ def visualize_graph_lite(memory_graph: Memory_graph, color_by_memory: bool = Fal
|
|||||||
memory_count = len(memory_items) if isinstance(memory_items, list) else (1 if memory_items else 0)
|
memory_count = len(memory_items) if isinstance(memory_items, list) else (1 if memory_items else 0)
|
||||||
# 使用指数函数使变化更明显
|
# 使用指数函数使变化更明显
|
||||||
ratio = memory_count / max_memories
|
ratio = memory_count / max_memories
|
||||||
size = 500 + 5000 * (ratio ** 2) # 使用平方函数使差异更明显
|
size = 500 + 5000 * (ratio ) # 使用1.5次方函数使差异不那么明显
|
||||||
node_sizes.append(size)
|
node_sizes.append(size)
|
||||||
|
|
||||||
# 计算节点颜色(基于连接数)
|
# 计算节点颜色(基于连接数)
|
||||||
degree = H.degree(node)
|
degree = H.degree(node)
|
||||||
# 红色分量随着度数增加而增加
|
# 红色分量随着度数增加而增加
|
||||||
red = min(1.0, degree / max_degree)
|
r = (degree / max_degree) ** 0.3
|
||||||
|
red = min(1.0, r)
|
||||||
# 蓝色分量随着度数减少而增加
|
# 蓝色分量随着度数减少而增加
|
||||||
blue = 1.0 - red
|
blue = max(0.0, 1 - red)
|
||||||
color = (red, 0, blue)
|
# blue = 1
|
||||||
|
color = (red, 0.1, blue)
|
||||||
node_colors.append(color)
|
node_colors.append(color)
|
||||||
|
|
||||||
# 绘制图形
|
# 绘制图形
|
||||||
plt.figure(figsize=(12, 8))
|
plt.figure(figsize=(12, 8))
|
||||||
pos = nx.spring_layout(H, k=1.5, iterations=50) # 增加k值使节点分布更开
|
pos = nx.spring_layout(H, k=1, iterations=50) # 增加k值使节点分布更开
|
||||||
nx.draw(H, pos,
|
nx.draw(H, pos,
|
||||||
with_labels=True,
|
with_labels=True,
|
||||||
node_color=node_colors,
|
node_color=node_colors,
|
||||||
@@ -339,7 +280,7 @@ def visualize_graph_lite(memory_graph: Memory_graph, color_by_memory: bool = Fal
|
|||||||
font_weight='bold',
|
font_weight='bold',
|
||||||
edge_color='gray',
|
edge_color='gray',
|
||||||
width=0.5,
|
width=0.5,
|
||||||
alpha=0.7)
|
alpha=0.9)
|
||||||
|
|
||||||
title = '记忆图谱可视化 - 节点大小表示记忆数量,颜色表示连接数'
|
title = '记忆图谱可视化 - 节点大小表示记忆数量,颜色表示连接数'
|
||||||
plt.title(title, fontsize=16, fontfamily='SimHei')
|
plt.title(title, fontsize=16, fontfamily='SimHei')
|
||||||
|
|||||||
@@ -944,7 +944,7 @@ async def main():
|
|||||||
db = Database.get_instance()
|
db = Database.get_instance()
|
||||||
start_time = time.time()
|
start_time = time.time()
|
||||||
|
|
||||||
test_pare = {'do_build_memory':True,'do_forget_topic':False,'do_visualize_graph':True,'do_query':False,'do_merge_memory':False}
|
test_pare = {'do_build_memory':False,'do_forget_topic':False,'do_visualize_graph':True,'do_query':False,'do_merge_memory':False}
|
||||||
|
|
||||||
# 创建记忆图
|
# 创建记忆图
|
||||||
memory_graph = Memory_graph()
|
memory_graph = Memory_graph()
|
||||||
|
|||||||
Reference in New Issue
Block a user