Files
Mofox-Core/src/heart_flow
..
2025-04-25 23:09:10 +08:00
2025-04-24 14:50:34 +08:00
2025-04-25 02:10:05 +08:00
2025-04-25 02:10:05 +08:00
2025-04-25 14:59:23 +00:00
2025-04-26 01:51:49 +08:00
2025-04-25 14:59:23 +00:00
2025-04-25 16:47:03 +00:00

心流系统 (Heart Flow System)

通俗易懂的工作流程介绍

心流系统就像一个智能聊天管家,它的工作方式可以这样理解:

心流系统由主控中心(Heartflow)作为大脑协调全局,它通过场景管家(SubHeartflowManager)管理各个聊天场景的"小管家"(SubHeartflow)。当收到消息时,系统会先进行过滤和基础分析(如屏蔽词检查和兴趣度计算),然后将处理好的消息分发给对应场景的小管家。每个小管家会根据当前状态决定回复方式:不参与(ABSENT)时完全不看不回,普通模式(CHAT)进行简单回复,专注模式(FOCUSED)则深入交流。系统会根据聊天活跃度和兴趣度自动调整各场景的参与程度,同时主控中心也能手动调整整体参与度(如在离线、轻度参与和专注聊天之间切换)。整个系统就像一个拥有多个聊天助手的智能管家,能够智能地动态调整参与聊天的深度和范围。

1. 系统架构 (System Architecture)

1.1. 主心流 (Heartflow)

  • 文件: heartflow.py
  • 职责:
    • 作为整个系统的主控制器。
    • 持有并管理 SubHeartflowManager,用于管理所有子心流。
    • 持有并管理自身状态 self.current_state: MaiStateInfo,该状态控制系统的整体行为模式。
    • 统筹管理系统后台任务(如消息存储、资源分配等)。
    • 注意: 主心流自身不进行周期性的全局思考更新。

1.2. 子心流 (SubHeartflow)

  • 文件: sub_heartflow.py
  • 职责:
    • 处理具体的交互场景,例如:群聊、私聊、与虚拟主播(vtb)互动、桌面宠物交互等。
    • 维护特定场景下的思维状态和聊天流状态 (ChatState)。
    • 通过关联的 Observation 实例接收和处理信息。
    • 拥有独立的思考 (SubMind) 和回复判断能力。
  • 观察者: 每个子心流可以拥有一个或多个 Observation 实例(目前每个子心流仅使用一个 ChattingObservation)。
  • 内部结构:
    • 聊天流状态 (ChatState): 标记当前子心流的参与模式 (ABSENT, CHAT, FOCUSED),决定是否观察、回复以及使用何种回复模式。
    • 聊天实例 (NormalChatInstance / HeartFlowChatInstance): 根据 ChatState 激活对应的实例来处理聊天逻辑。同一时间只有一个实例处于活动状态。

1.3. 观察系统 (Observation)

  • 文件: observation.py
  • 职责:
    • 定义信息输入的来源和格式。
    • 为子心流提供其所处环境的信息。
  • 当前实现:
    • 目前仅有 ChattingObservation 一种观察类型。
    • ChattingObservation 负责从数据库拉取指定聊天的最新消息,并将其格式化为可读内容,供 SubHeartflow 使用。

1.4. 子心流管理器 (SubHeartflowManager)

  • 文件: subheartflow_manager.py
  • 职责:
    • 作为 Heartflow 的成员变量存在。
    • 负责所有 SubHeartflow 实例的生命周期管理,包括:
      • 创建和获取 (create_or_get_subheartflow)。
      • 停止和清理 (stop_subheartflow, cleanup_inactive_subheartflows)。
      • 根据 Heartflow 的状态和限制条件,激活、停用或调整子心流的状态。

1.5. 消息处理与回复流程 (Message Processing vs. Replying Flow)

  • 关注点分离: 系统严格区分了接收和处理传入消息的流程与决定和生成回复的流程。
    • 消息处理 (Processing):
      • 由一个独立的处理器(例如 HeartFCProcessor)负责接收原始消息数据。
      • 职责包括:消息解析 (MessageRecv)、过滤(屏蔽词、正则表达式)、基于记忆系统的初步兴趣计算 (HippocampusManager)、消息存储 (MessageStorage) 以及用户关系更新 (RelationshipManager)。
      • 处理后的消息信息(如计算出的兴趣度)会传递给对应的 SubHeartflow
    • 回复决策与生成 (Replying):
      • SubHeartflow 及其当前激活的聊天实例 (NormalChatInstanceHeartFlowChatInstance) 负责。
      • 基于其内部状态 (ChatStateSubMind 的思考结果)、观察到的信息 (Observation 提供的内容) 以及 InterestChatting 的状态来决定是否回复、何时回复以及如何回复。
  • 消息缓冲 (Message Caching):
    • message_buffer 模块会对某些传入消息进行临时缓存,尤其是在处理连续的多部分消息(如多张图片)时。
    • 这个缓冲机制发生在 HeartFCProcessor 处理流程中,确保消息的完整性,然后才进行后续的存储和兴趣计算。
    • 缓存的消息最终仍会流向对应的 ChatStream(与 SubHeartflow 关联),但核心的消息处理与回复决策仍然是分离的步骤。

2. 核心控制与状态管理 (Core Control and State Management)

2.1. Heart Flow 整体控制

  • 控制者: 主心流 (Heartflow)
  • 核心职责:
    • 通过其成员 SubHeartflowManager 创建和管理子心流。
    • 通过其成员 self.current_state: MaiStateInfo 控制整体行为模式。
    • 管理系统级后台任务。

2.2. Heart Flow 状态 (MaiStateInfo)

  • 定义与管理: Heartflow 持有 MaiStateInfo 的实例 (self.current_state) 来管理其状态。状态的枚举定义在 my_state_manager.py 中的 MaiState
  • 状态及含义:
    • MaiState.OFFLINE (不在线): 不观察任何群消息,不进行主动交互,仅存储消息。
    • MaiState.PEEKING (看一眼手机): 有限度地参与聊天(由 MaiStateInfo 定义具体的普通/专注群数量限制)。
    • MaiState.NORMAL_CHAT (正常看手机): 正常参与聊天,允许 SubHeartflow 进入 CHATFOCUSED 状态(数量受限)。
    • MaiState.FOCUSED_CHAT (专心看手机): 更积极地参与聊天,通常允许更多或更高优先级的 FOCUSED 状态子心流。
  • 作用: Heartflow 的状态直接影响 SubHeartflowManager 如何管理子心流(如激活数量、允许的状态等)。

2.3. 聊天流状态 (ChatState) 与转换

  • 管理对象: 每个 SubHeartflow 实例内部维护其 ChatStateInfo,包含当前的 ChatState
  • 状态及含义:
    • ChatState.ABSENT (不参与/没在看): 初始或停用状态。子心流不观察新信息,不进行思考,也不回复。
    • ChatState.CHAT (随便看看/水群): 普通聊天模式。激活 NormalChatInstance
    • ChatState.FOCUSED (专注/激情水群): 专注聊天模式。激活 HeartFlowChatInstance
  • 选择: 子心流可以根据外部指令(来自 SubHeartflowManager)或内部逻辑(未来的扩展)选择进入 ABSENT 状态(不回复不观察),或进入 CHAT / FOCUSED 中的一种回复模式。
  • 状态转换机制 (由 SubHeartflowManager 驱动):
    • 激活 CHAT: 当 Heartflow 状态从 OFFLINE 变为允许聊天的状态时,SubHeartflowManager 会根据限制,选择部分 ABSENT 状态的子心流,调用其 set_chat_state 方法将其转换为 CHAT
    • 激活 FOCUSED: SubHeartflowManager 会定期评估处于 CHAT 状态的子心流的兴趣度 (InterestChatting.start_hfc_probability),若满足条件且未达上限,则调用 set_chat_state 将其提升为 FOCUSED
    • 停用/回退: SubHeartflowManager 可能因 Heartflow 状态变化、达到数量限制、长时间不活跃或随机概率等原因,调用 set_chat_state 将子心流状态设置为 ABSENT 或从 FOCUSED 回退到 CHAT

3. 聊天实例详解 (Chat Instances Explained)

3.1. NormalChatInstance

  • 激活条件: 对应 SubHeartflowChatStateCHAT
  • 工作流程:
    • 按照系统设定的普通聊天规则处理群消息。
    • 定期检查新消息。
    • 对简单询问、闲聊等进行及时回复。
  • 行为特点:
    • 回复相对常规、简单。
    • 不投入过多计算资源。
    • 侧重于维持基本的交流氛围。
    • 示例:对问候语、日常分享等进行简单回应。

3.2. HeartFlowChatInstance (继承自原 PFC 逻辑)

  • 激活条件: 对应 SubHeartflowChatStateFOCUSED
  • 工作流程:
    • 基于更复杂的规则(原 PFC 模式)进行深度处理。
    • 对群内话题进行深入分析。
    • 可能主动发起相关话题或引导交流。
  • 行为特点:
    • 回复更积极、深入。
    • 投入更多资源参与聊天。
    • 回复内容可能更详细、有针对性。
    • 对话题参与度高,能带动交流。
    • 示例:对复杂或有争议话题阐述观点,并与人互动。

4. 工作流程示例 (Example Workflow)

  1. 启动: Heartflow 启动,初始化 MaiStateInfo (例如 OFFLINE) 和 SubHeartflowManager
  2. 状态变化: 用户操作或内部逻辑使 Heartflowcurrent_state 变为 NORMAL_CHAT
  3. 管理器响应: SubHeartflowManager 检测到状态变化,根据 NORMAL_CHAT 的限制,调用 create_or_get_subheartflow 获取或创建子心流,并通过 set_chat_state 将部分子心流状态从 ABSENT 激活为 CHAT
  4. 子心流激活: 被激活的 SubHeartflow 启动其 NormalChatInstance
  5. 信息接收: 该 SubHeartflowChattingObservation 开始从数据库拉取新消息。
  6. 普通回复: NormalChatInstance 处理观察到的信息,执行普通回复逻辑。
  7. 兴趣评估: SubHeartflowManager 定期评估该子心流的 InterestChatting 状态。
  8. 提升状态: 若兴趣度达标且 Heartflow 状态允许,SubHeartflowManager 调用该子心流的 set_chat_state 将其状态提升为 FOCUSED
  9. 子心流切换: SubHeartflow 内部停止 NormalChatInstance,启动 HeartFlowChatInstance
  10. 专注回复: HeartFlowChatInstance 开始根据其逻辑进行更深入的交互。
  11. 状态回落/停用: 若 Heartflow 状态变为 OFFLINESubHeartflowManager 会调用所有子心流的 set_chat_state(ChatState.ABSENT),使其停止活动。

5. 使用与配置 (Usage and Configuration)

5.1. 使用说明 (Code Examples)

  • (内部)创建/获取子心流 (由 SubHeartflowManager 调用):
    # subheartflow_manager.py
    new_subflow = SubHeartflow(subheartflow_id, mai_states)
    await new_subflow.initialize()
    observation = ChattingObservation(chat_id=subheartflow_id)
    new_subflow.add_observation(observation)
    
  • (内部)添加观察者 (由 SubHeartflowManagerSubHeartflow 内部调用):
    # sub_heartflow.py
    self.observations.append(observation)
    

5.2. 配置参数 (Key Parameters)

  • sub_heart_flow_stop_time: 子心流停止(标记为可清理)的不活跃时间阈值 (似乎由 SubHeartflowManager.cleanup_inactive_subheartflows 的参数 inactive_threshold_seconds 控制)。
  • sub_heart_flow_freeze_time: 子心流冻结时间 (当前文档未明确体现,可能需要审阅代码确认)。
  • heart_flow_update_interval: 主心流更新其状态或执行管理操作的频率 (需要审阅 Heartflow 代码确认)。
  • MaiStateInfo 内的限制: 定义了不同主状态下 CHATFOCUSED 子心流的数量上限。

6. 注意事项 (Important Notes)

  1. 自动清理: SubHeartflowManager 会定期检查并清理长时间不活跃的子心流。
  2. 性能平衡: 主心流执行管理操作的频率(如检查状态、清理、评估兴趣)需要合理配置,以平衡系统性能和响应速度。
  3. 信息过载: 单个 ChattingObservation 会限制一次性从数据库拉取的消息数量 (max_now_obs_len)。

7. 待办与未来方向 (TODOs and Future Directions)

  • 更新 "与其他模块的交互" 部分: 详细说明 SubHeartflowManager, SubHeartflow, NormalChatInstance, HeartFlowChatInstance 之间以及与 MessageManager, ResponseGenerator, InterestManager 等外部模块的具体交互。
  • 明确 sub_heart_flow_freeze_time: 确认该配置项的实际作用和实现位置。
  • 明确 heart_flow_update_interval: 确认主心流管理循环的实际间隔。
  • 扩展观察类型: 实现更多 Observation 类型(如私聊、系统事件等)。
  • 子心流内部状态转换: 探索允许子心流根据自身思考结果主动请求状态转换的可能性。
  • 资源管理: 优化子心流的资源占用和清理策略。