心流系统 (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及其当前激活的聊天实例 (NormalChatInstance或HeartFlowChatInstance) 负责。 - 基于其内部状态 (
ChatState、SubMind的思考结果)、观察到的信息 (Observation提供的内容) 以及InterestChatting的状态来决定是否回复、何时回复以及如何回复。
- 由
- 消息处理 (Processing):
- 消息缓冲 (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进入CHAT或FOCUSED状态(数量受限)。
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
- 激活条件: 对应
SubHeartflow的ChatState为CHAT。 - 工作流程:
- 按照系统设定的普通聊天规则处理群消息。
- 定期检查新消息。
- 对简单询问、闲聊等进行及时回复。
- 行为特点:
- 回复相对常规、简单。
- 不投入过多计算资源。
- 侧重于维持基本的交流氛围。
- 示例:对问候语、日常分享等进行简单回应。
3.2. HeartFlowChatInstance (继承自原 PFC 逻辑)
- 激活条件: 对应
SubHeartflow的ChatState为FOCUSED。 - 工作流程:
- 基于更复杂的规则(原 PFC 模式)进行深度处理。
- 对群内话题进行深入分析。
- 可能主动发起相关话题或引导交流。
- 行为特点:
- 回复更积极、深入。
- 投入更多资源参与聊天。
- 回复内容可能更详细、有针对性。
- 对话题参与度高,能带动交流。
- 示例:对复杂或有争议话题阐述观点,并与人互动。
4. 工作流程示例 (Example Workflow)
- 启动:
Heartflow启动,初始化MaiStateInfo(例如OFFLINE) 和SubHeartflowManager。 - 状态变化: 用户操作或内部逻辑使
Heartflow的current_state变为NORMAL_CHAT。 - 管理器响应:
SubHeartflowManager检测到状态变化,根据NORMAL_CHAT的限制,调用create_or_get_subheartflow获取或创建子心流,并通过set_chat_state将部分子心流状态从ABSENT激活为CHAT。 - 子心流激活: 被激活的
SubHeartflow启动其NormalChatInstance。 - 信息接收: 该
SubHeartflow的ChattingObservation开始从数据库拉取新消息。 - 普通回复:
NormalChatInstance处理观察到的信息,执行普通回复逻辑。 - 兴趣评估:
SubHeartflowManager定期评估该子心流的InterestChatting状态。 - 提升状态: 若兴趣度达标且
Heartflow状态允许,SubHeartflowManager调用该子心流的set_chat_state将其状态提升为FOCUSED。 - 子心流切换:
SubHeartflow内部停止NormalChatInstance,启动HeartFlowChatInstance。 - 专注回复:
HeartFlowChatInstance开始根据其逻辑进行更深入的交互。 - 状态回落/停用: 若
Heartflow状态变为OFFLINE,SubHeartflowManager会调用所有子心流的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) - (内部)添加观察者 (由
SubHeartflowManager或SubHeartflow内部调用):# 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内的限制: 定义了不同主状态下CHAT和FOCUSED子心流的数量上限。
6. 注意事项 (Important Notes)
- 自动清理:
SubHeartflowManager会定期检查并清理长时间不活跃的子心流。 - 性能平衡: 主心流执行管理操作的频率(如检查状态、清理、评估兴趣)需要合理配置,以平衡系统性能和响应速度。
- 信息过载: 单个
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类型(如私聊、系统事件等)。 - 子心流内部状态转换: 探索允许子心流根据自身思考结果主动请求状态转换的可能性。
- 资源管理: 优化子心流的资源占用和清理策略。