feat:后置工具处理器,优化generatro

This commit is contained in:
SengokuCola
2025-06-23 21:32:52 +08:00
parent e0c1bb71be
commit 4de19f8dde
5 changed files with 38 additions and 70 deletions

View File

@@ -32,6 +32,7 @@ from src.chat.focus_chat.hfc_performance_logger import HFCPerformanceLogger
from src.chat.focus_chat.hfc_version_manager import get_hfc_version
from src.chat.focus_chat.info.relation_info import RelationInfo
from src.chat.focus_chat.info.expression_selection_info import ExpressionSelectionInfo
from src.chat.focus_chat.info.structured_info import StructuredInfo
install(extra_lines=3)
@@ -51,12 +52,12 @@ OBSERVATION_CLASSES = {
# 定义处理器映射:键是处理器名称,值是 (处理器类, 可选的配置键名)
PROCESSOR_CLASSES = {
"ChattingInfoProcessor": (ChattingInfoProcessor, None),
"ToolProcessor": (ToolProcessor, "tool_use_processor"),
"WorkingMemoryProcessor": (WorkingMemoryProcessor, "working_memory_processor"),
}
# 定义后期处理器映射:在规划后、动作执行前运行的处理器
POST_PLANNING_PROCESSOR_CLASSES = {
"ToolProcessor": (ToolProcessor, "tool_use_processor"),
"PersonImpressionpProcessor": (PersonImpressionpProcessor, "person_impression_processor"),
"ExpressionSelectorProcessor": (ExpressionSelectorProcessor, "expression_selector_processor"),
}
@@ -212,7 +213,6 @@ class HeartFChatting:
processor_actual_class = processor_info[0] # 获取实际的类定义
# 根据处理器类名判断是否需要 subheartflow_id
if name in [
"ToolProcessor",
"WorkingMemoryProcessor",
]:
self.processors.append(processor_actual_class(subheartflow_id=self.stream_id))
@@ -249,6 +249,7 @@ class HeartFChatting:
processor_actual_class = processor_info[0] # 获取实际的类定义
# 根据处理器类名判断是否需要 subheartflow_id
if name in [
"ToolProcessor",
"PersonImpressionpProcessor",
"ExpressionSelectorProcessor",
]:
@@ -715,32 +716,33 @@ class HeartFChatting:
relation_info = ""
selected_expressions = []
structured_info = ""
for info in all_post_plan_info:
if isinstance(info, RelationInfo):
relation_info = info.get_processed_info()
elif isinstance(info, ExpressionSelectionInfo):
selected_expressions = info.get_expressions_for_action_data()
elif isinstance(info, StructuredInfo):
structured_info = info.get_processed_info()
if relation_info:
updated_action_data["relation_info_block"] = relation_info
# 将选中的表达方式传递给action_data
if selected_expressions:
updated_action_data["selected_expressions"] = selected_expressions
logger.info(f"{self.log_prefix} 传递{len(selected_expressions)}个选中的表达方式到action_data")
# 将记忆信息也添加到action_data中
if running_memorys:
updated_action_data["running_memories"] = running_memorys
updated_action_data["selected_expressions"] = selected_expressions
# 生成兼容的memory_block格式
if structured_info:
updated_action_data["structured_info"] = structured_info
#特殊处理running_memorys
if running_memorys:
memory_str = "以下是当前在聊天中,你回忆起的记忆:\n"
for running_memory in running_memorys:
memory_str += f"{running_memory['content']}\n"
updated_action_data["memory_block"] = memory_str
logger.info(f"{self.log_prefix} 添加了 {len(running_memorys)} 个激活的记忆到action_data")
if all_post_plan_info or running_memorys:
logger.info(f"{self.log_prefix} 后期处理完成,产生了 {len(all_post_plan_info)} 个信息项和 {len(running_memorys)} 个记忆")

View File

@@ -67,7 +67,7 @@ class ToolProcessor(BaseProcessor):
if isinstance(observation, ChattingObservation):
result, used_tools, prompt = await self.execute_tools(observation)
logger.debug(f"工具调用结果: {result}")
logger.info(f"工具调用结果: {result}")
# 更新WorkingObservation中的结构化信息
for observation in observations:
if isinstance(observation, StructureObservation):

View File

@@ -9,7 +9,6 @@ from src.chat.focus_chat.info.obs_info import ObsInfo
from src.chat.focus_chat.info.action_info import ActionInfo
from src.chat.focus_chat.info.structured_info import StructuredInfo
from src.chat.focus_chat.info.relation_info import RelationInfo
from src.chat.focus_chat.info.expression_selection_info import ExpressionSelectionInfo
from src.common.logger import get_logger
from src.chat.utils.prompt_builder import Prompt, global_prompt_manager
from src.chat.focus_chat.planners.action_manager import ActionManager
@@ -48,7 +47,6 @@ def init_prompt():
你现在需要根据聊天内容选择的合适的action来参与聊天。
{chat_context_description},以下是具体的聊天内容:
{chat_content_block}
{relation_info_block}
{moderation_prompt}
现在请你选择合适的action:
@@ -114,14 +112,11 @@ class ActionPlanner(BasePlanner):
# 获取观察信息
extra_info: list[str] = []
structured_info = ""
extra_info = []
observed_messages = []
observed_messages_str = ""
chat_type = "group"
is_group_chat = True
relation_info = ""
selected_expressions = []
chat_id = None # 添加chat_id变量
for info in all_plan_info:
@@ -132,14 +127,6 @@ class ActionPlanner(BasePlanner):
is_group_chat = chat_type == "group"
# 从ObsInfo中获取chat_id
chat_id = info.get_chat_id()
# elif isinstance(info, CycleInfo):
# cycle_info = info.get_observe_info()
elif isinstance(info, RelationInfo):
relation_info = info.get_processed_info()
elif isinstance(info, StructuredInfo):
structured_info = info.get_processed_info()
elif isinstance(info, ExpressionSelectionInfo):
selected_expressions = info.get_expressions_for_action_data()
else:
extra_info.append(info.get_processed_info())
@@ -191,15 +178,10 @@ class ActionPlanner(BasePlanner):
# --- 构建提示词 (调用修改后的 PromptBuilder 方法) ---
prompt = await self.build_planner_prompt(
relation_info_block=relation_info,
is_group_chat=is_group_chat, # <-- Pass HFC state
chat_target_info=chat_target_info, # <-- 传递获取到的聊天目标信息
observed_messages_str=observed_messages_str, # <-- Pass local variable
structured_info=structured_info, # <-- Pass SubMind info
current_available_actions=current_available_actions, # <-- Pass determined actions
# cycle_info=cycle_info, # <-- Pass cycle info
extra_info=extra_info,
running_memorys=running_memorys,
)
# --- 调用 LLM (普通文本生成) ---
@@ -254,22 +236,6 @@ class ActionPlanner(BasePlanner):
if key not in ["action", "reasoning"]:
action_data[key] = value
extra_info_block = "\n".join(extra_info)
extra_info_block += f"\n{structured_info}"
if extra_info or structured_info:
extra_info_block = f"以下是一些额外的信息,现在请你阅读以下内容,进行决策\n{extra_info_block}\n以上是一些额外的信息,现在请你阅读以下内容,进行决策"
else:
extra_info_block = ""
action_data["extra_info_block"] = extra_info_block
if relation_info:
action_data["relation_info_block"] = relation_info
# 将选中的表达方式传递给action_data
if selected_expressions:
action_data["selected_expressions"] = selected_expressions
logger.debug(f"{self.log_prefix} 传递{len(selected_expressions)}个选中的表达方式到action_data")
action_data["loop_start_time"] = loop_start_time
@@ -324,23 +290,13 @@ class ActionPlanner(BasePlanner):
async def build_planner_prompt(
self,
relation_info_block: str,
is_group_chat: bool, # Now passed as argument
chat_target_info: Optional[dict], # Now passed as argument
observed_messages_str: str,
structured_info: Optional[str],
current_available_actions: Dict[str, ActionInfo],
# cycle_info: Optional[str],
extra_info: list[str],
running_memorys: List[Dict[str, Any]],
) -> str:
"""构建 Planner LLM 的提示词 (获取模板并填充数据)"""
try:
if relation_info_block:
relation_info_block = f"以下内容是你对发言对象之前的了解:\n{relation_info_block}\n这是你对他们先前的印象,不要和他们现在的聊天内容混淆。"
else:
relation_info_block = ""
chat_context_description = "你现在正在一个群聊中"
chat_target_name = None # Only relevant for private
if not is_group_chat and chat_target_info:
@@ -394,13 +350,6 @@ class ActionPlanner(BasePlanner):
action_options_block += using_action_prompt
extra_info_block = "\n".join(extra_info)
extra_info_block += f"\n{structured_info}"
if extra_info or structured_info:
extra_info_block = f"以下是一些额外的信息,现在请你阅读以下内容,进行决策\n{extra_info_block}\n以上是一些额外的信息,现在请你阅读以下内容,进行决策"
else:
extra_info_block = ""
# moderation_prompt_block = "请不要输出违法违规内容,不要输出色情,暴力,政治相关内容,如有敏感内容,请规避。"
moderation_prompt_block = ""
@@ -419,7 +368,6 @@ class ActionPlanner(BasePlanner):
template_name = "simple_planner_prompt_private" if not is_group_chat else "simple_planner_prompt"
planner_prompt_template = await global_prompt_manager.get_prompt_async(template_name)
prompt = planner_prompt_template.format(
relation_info_block=relation_info_block,
time_block=time_block,
chat_context_description=chat_context_description,
chat_content_block=chat_content_block,

View File

@@ -29,9 +29,10 @@ def init_prompt():
Prompt(
"""
{expression_habits_block}
{extra_info_block}
{structured_info_block}
{memory_block}
{relation_info_block}
{extra_info_block}
{time_block}
{chat_target}
{chat_info}
@@ -51,8 +52,10 @@ def init_prompt():
Prompt(
"""
{expression_habits_block}
{extra_info_block}
{structured_info_block}
{memory_block}
{relation_info_block}
{extra_info_block}
{time_block}
{chat_target}
{chat_info}
@@ -278,10 +281,13 @@ class DefaultReplyer:
is_group_chat = bool(chat_stream.group_info)
self_info_block = reply_data.get("self_info_block", "")
extra_info_block = reply_data.get("extra_info_block", "")
structured_info = reply_data.get("structured_info", "")
relation_info_block = reply_data.get("relation_info_block", "")
reply_to = reply_data.get("reply_to", "none")
memory_block = reply_data.get("memory_block", "")
# 优先使用 extra_info_block没有则用 extra_info
extra_info_block = reply_data.get("extra_info_block", "") or reply_data.get("extra_info", "")
sender = ""
target = ""
@@ -338,6 +344,16 @@ class DefaultReplyer:
if grammar_habbits_str.strip():
expression_habits_block += f"请你根据情景使用以下句法:\n{grammar_habbits_str}\n"
if structured_info:
structured_info_block = f"以下是一些额外的信息,现在请你阅读以下内容,进行决策\n{structured_info}\n以上是一些额外的信息,现在请你阅读以下内容,进行决策"
else:
structured_info_block = ""
if extra_info_block:
extra_info_block = f"以下是你在回复时需要参考的信息,现在请你阅读以下内容,进行决策\n{extra_info_block}\n以上是你在回复时需要参考的信息,现在请你阅读以下内容,进行决策"
else:
extra_info_block = ""
# 关键词检测与反应
keywords_reaction_prompt = ""
try:
@@ -396,6 +412,7 @@ class DefaultReplyer:
chat_target=chat_target_1,
chat_info=chat_talking_prompt,
memory_block=memory_block,
structured_info_block=structured_info_block,
extra_info_block=extra_info_block,
relation_info_block=relation_info_block,
self_info_block=self_info_block,
@@ -422,6 +439,7 @@ class DefaultReplyer:
chat_target=chat_target_1,
chat_info=chat_talking_prompt,
memory_block=memory_block,
structured_info_block=structured_info_block,
extra_info_block=extra_info_block,
time_block=time_block,
keywords_reaction_prompt=keywords_reaction_prompt,

View File

@@ -74,9 +74,9 @@ class ChattingObservation(Observation):
self.oldest_messages = []
self.oldest_messages_str = ""
self.last_observe_time = datetime.now().timestamp() - 1
print(f"last_observe_time: {self.last_observe_time}")
self.last_observe_time = datetime.now().timestamp()
initial_messages = get_raw_msg_before_timestamp_with_chat(self.chat_id, self.last_observe_time, 10)
print(f"initial_messages: {initial_messages}")
self.last_observe_time = initial_messages[-1]["time"] if initial_messages else self.last_observe_time
self.talking_message = initial_messages
self.talking_message_str = build_readable_messages(self.talking_message, show_actions=True)