feat:非常好的早期聊天记录压缩系统,麦麦现在有5倍上文记忆量(真的吗?

This commit is contained in:
SengokuCola
2025-04-14 21:33:27 +08:00
parent 7eba42f84a
commit 46347678b4
12 changed files with 314 additions and 446 deletions

View File

@@ -1,7 +1,8 @@
from src.do_tool.tool_can_use.base_tool import BaseTool, register_tool
from src.do_tool.tool_can_use.base_tool import BaseTool
from src.plugins.schedule.schedule_generator import bot_schedule
from src.common.logger import get_module_logger
from typing import Dict, Any
from datetime import datetime
logger = get_module_logger("get_current_task_tool")
@@ -9,19 +10,19 @@ logger = get_module_logger("get_current_task_tool")
class GetCurrentTaskTool(BaseTool):
"""获取当前正在做的事情/最近的任务工具"""
name = "get_current_task"
description = "获取当前正在做的事情/最近的任务"
name = "get_schedule"
description = "获取当前正在做的事情,或者某个时间点/时间段的日程信息"
parameters = {
"type": "object",
"properties": {
"num": {"type": "integer", "description": "要获取的任务数量"},
"time_info": {"type": "boolean", "description": "是否包含时间信息"},
"start_time": {"type": "string", "description": "开始时间,格式为'HH:MM'填写current则获取当前任务"},
"end_time": {"type": "string", "description": "结束时间,格式为'HH:MM'填写current则获取当前任务"},
},
"required": [],
"required": ["start_time", "end_time"],
}
async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
"""执行获取当前任务
"""执行获取当前任务或指定时间段的日程信息
Args:
function_args: 工具参数
@@ -30,25 +31,31 @@ class GetCurrentTaskTool(BaseTool):
Returns:
Dict: 工具执行结果
"""
try:
# 获取参数,如果没有提供则使用默认值
num = function_args.get("num", 1)
time_info = function_args.get("time_info", False)
start_time = function_args.get("start_time")
end_time = function_args.get("end_time")
# 调用日程系统获取当前任务
current_task = bot_schedule.get_current_num_task(num=num, time_info=time_info)
# 格式化返回结果
# 如果 start_time 或 end_time 为 "current",则获取当前任务
if start_time == "current" or end_time == "current":
current_task = bot_schedule.get_current_num_task(num=1, time_info=True)
current_time = datetime.now().strftime("%H:%M:%S")
current_date = datetime.now().strftime("%Y-%m-%d")
if current_task:
task_info = current_task
task_info = f"{current_date} {current_time},你在{current_task}"
else:
task_info = "当前没有正在进行的任务"
task_info = f"{current_time} {current_date},没在做任何事情"
# 如果提供了时间范围,则获取该时间段的日程信息
elif start_time and end_time:
tasks = await bot_schedule.get_task_from_time_to_time(start_time, end_time)
if tasks:
task_list = []
for task in tasks:
task_time = task[0].strftime("%H:%M")
task_content = task[1]
task_list.append(f"{task_time}时,{task_content}")
task_info = "\n".join(task_list)
else:
task_info = f"{start_time}{end_time} 之间没有找到日程信息"
return {"name": "get_current_task", "content": f"当前任务信息: {task_info}"}
except Exception as e:
logger.error(f"获取当前任务工具执行失败: {str(e)}")
return {"name": "get_current_task", "content": f"获取当前任务失败: {str(e)}"}
return {"name": "get_current_task", "content": f"日程信息: {task_info}"}
# 注册工具
# register_tool(GetCurrentTaskTool)

View File

@@ -3,13 +3,13 @@ from src.plugins.memory_system.Hippocampus import HippocampusManager
from src.common.logger import get_module_logger
from typing import Dict, Any
logger = get_module_logger("get_memory_tool")
logger = get_module_logger("mid_chat_mem_tool")
class GetMemoryTool(BaseTool):
"""从记忆系统中获取相关记忆的工具"""
name = "get_memory"
name = "mid_chat_mem"
description = "从记忆系统中获取相关记忆"
parameters = {
"type": "object",
@@ -49,10 +49,10 @@ class GetMemoryTool(BaseTool):
else:
content = f"你不太记得有关{text}的记忆,你对此不太了解"
return {"name": "get_memory", "content": content}
return {"name": "mid_chat_mem", "content": content}
except Exception as e:
logger.error(f"记忆获取工具执行失败: {str(e)}")
return {"name": "get_memory", "content": f"记忆获取失败: {str(e)}"}
return {"name": "mid_chat_mem", "content": f"记忆获取失败: {str(e)}"}
# 注册工具

View File

@@ -0,0 +1,39 @@
from src.do_tool.tool_can_use.base_tool import BaseTool
from src.common.logger import get_module_logger
from typing import Dict, Any
from datetime import datetime
logger = get_module_logger("get_time_date")
class GetCurrentDateTimeTool(BaseTool):
"""获取当前时间、日期、年份和星期的工具"""
name = "get_current_date_time"
description = "当有人询问或者涉及到具体时间或者日期的时候,必须使用这个工具"
parameters = {
"type": "object",
"properties": {},
"required": [],
}
async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
"""执行获取当前时间、日期、年份和星期
Args:
function_args: 工具参数(此工具不使用)
message_txt: 原始消息文本(此工具不使用)
Returns:
Dict: 工具执行结果
"""
current_time = datetime.now().strftime("%H:%M:%S")
current_date = datetime.now().strftime("%Y-%m-%d")
current_year = datetime.now().strftime("%Y")
current_weekday = datetime.now().strftime("%A")
return {
"name": "get_current_date_time",
"content": f"当前时间: {current_time}, 日期: {current_date}, 年份: {current_year}, 星期: {current_weekday}"
}

View File

@@ -0,0 +1,40 @@
from src.do_tool.tool_can_use.base_tool import BaseTool
from src.common.logger import get_module_logger
from typing import Dict, Any
logger = get_module_logger("get_mid_memory_tool")
class GetMidMemoryTool(BaseTool):
"""从记忆系统中获取相关记忆的工具"""
name = "mid_chat_mem"
description = "之前的聊天内容中获取具体信息,当最新消息提到,或者你需要回复的消息中提到,你可以使用这个工具"
parameters = {
"type": "object",
"properties": {
"id": {"type": "integer", "description": "要查询的聊天记录id"},
},
"required": ["id"],
}
async def execute(self, function_args: Dict[str, Any], message_txt: str = "") -> Dict[str, Any]:
"""执行记忆获取
Args:
function_args: 工具参数
message_txt: 原始消息文本
Returns:
Dict: 工具执行结果
"""
try:
id = function_args.get("id")
return {"name": "mid_chat_mem", "content": str(id)}
except Exception as e:
logger.error(f"聊天记录获取工具执行失败: {str(e)}")
return {"name": "mid_chat_mem", "content": f"聊天记录获取失败: {str(e)}"}
# 注册工具
# register_tool(GetMemoryTool)

View File

@@ -6,6 +6,7 @@ import time
import json
from src.common.logger import get_module_logger, TOOL_USE_STYLE_CONFIG, LogConfig
from src.do_tool.tool_can_use import get_all_tool_definitions, get_tool_instance
from src.heart_flow.sub_heartflow import SubHeartflow
tool_use_config = LogConfig(
# 使用消息发送专用样式
@@ -21,7 +22,7 @@ class ToolUser:
model=global_config.llm_heartflow, temperature=0.2, max_tokens=1000, request_type="tool_use"
)
async def _build_tool_prompt(self, message_txt: str, sender_name: str, chat_stream: ChatStream, reply_message:str = ""):
async def _build_tool_prompt(self, message_txt: str, sender_name: str, chat_stream: ChatStream, subheartflow: SubHeartflow = None):
"""构建工具使用的提示词
Args:
@@ -32,6 +33,12 @@ class ToolUser:
Returns:
str: 构建好的提示词
"""
if subheartflow:
mid_memory_info = subheartflow.observations[0].mid_memory_info
# print(f"intol111111111111111111111111111111111222222222222mid_memory_info{mid_memory_info}")
else:
mid_memory_info = ""
new_messages = list(
db.messages.find({"chat_id": chat_stream.stream_id, "time": {"$gt": time.time()}}).sort("time", 1).limit(15)
)
@@ -43,13 +50,12 @@ class ToolUser:
# 这些信息应该从调用者传入而不是从self获取
bot_name = global_config.BOT_NICKNAME
prompt = ""
prompt += mid_memory_info
prompt += "你正在思考如何回复群里的消息。\n"
prompt += f"你注意到{sender_name}刚刚说:{message_txt}\n"
if reply_message:
prompt += f"你刚刚回复的内容是:{reply_message}\n"
prompt += f"注意你就是{bot_name}{bot_name}指的就是你。"
prompt += "你现在需要对群里的聊天内容进行回复,现在选择工具来对消息和你的回复进行处理,你是否需要额外的信息,或者进行一些动作,比如回忆或者搜寻已有的知识,改变关系和情感,或者了解你现在正在做什么,请输出你需要的工具,或者你需要的额外信息"
prompt += "你现在需要对群里的聊天内容进行回复,现在选择工具来对消息和你的回复进行处理,你是否需要额外的信息,比如回忆或者搜寻已有的知识,改变关系和情感,或者了解你现在正在做什么。"
return prompt
def _define_tools(self):
@@ -83,20 +89,8 @@ class ToolUser:
# 执行工具
result = await tool_instance.execute(function_args, message_txt)
if result:
# 根据工具名称确定类型标签
tool_type = ""
if "memory" in function_name.lower():
tool_type = "memory"
elif "schedule" in function_name.lower() or "task" in function_name.lower():
tool_type = "schedule"
elif "knowledge" in function_name.lower():
tool_type = "knowledge"
elif "change_relationship" in function_name.lower():
tool_type = "change_relationship"
elif "change_mood" in function_name.lower():
tool_type = "change_mood"
else:
tool_type = "other"
# 直接使用 function_name 作为 tool_type
tool_type = function_name
return {
"tool_call_id": tool_call["id"],
@@ -110,7 +104,7 @@ class ToolUser:
logger.error(f"执行工具调用时发生错误: {str(e)}")
return None
async def use_tool(self, message_txt: str, sender_name: str, chat_stream: ChatStream):
async def use_tool(self, message_txt: str, sender_name: str, chat_stream: ChatStream, subheartflow: SubHeartflow = None):
"""使用工具辅助思考,判断是否需要额外信息
Args:
@@ -123,7 +117,12 @@ class ToolUser:
"""
try:
# 构建提示词
prompt = await self._build_tool_prompt(message_txt, sender_name, chat_stream)
prompt = await self._build_tool_prompt(
message_txt,
sender_name,
chat_stream,
subheartflow
)
# 定义可用工具
tools = self._define_tools()
@@ -158,30 +157,26 @@ class ToolUser:
tool_calls_str = ""
for tool_call in tool_calls:
tool_calls_str += f"{tool_call['function']['name']}\n"
logger.info(f"模型请求调用{len(tool_calls)}个工具: {tool_calls_str}")
logger.info(f"根据:\n{prompt}\n模型请求调用{len(tool_calls)}个工具: {tool_calls_str}")
tool_results = []
structured_info = {
"memory": [],
"schedule": [],
"knowledge": [],
"change_relationship": [],
"change_mood": [],
"other": []
}
structured_info = {} # 动态生成键
# 执行所有工具调用
for tool_call in tool_calls:
result = await self._execute_tool_call(tool_call, message_txt)
if result:
tool_results.append(result)
# 将工具结果添加到对应类型的列表中
structured_info[result["type"]].append({
# 使用工具名称作为键
tool_name = result["name"]
if tool_name not in structured_info:
structured_info[tool_name] = []
structured_info[tool_name].append({
"name": result["name"],
"content": result["content"]
})
# 如果有工具结果,返回结构化的信息
if any(structured_info.values()):
if structured_info:
logger.info(f"工具调用收集到结构化信息: {json.dumps(structured_info, ensure_ascii=False)}")
return {
"used_tools": True,