|
| 1 | +# 修正后的动作激活架构 |
| 2 | + |
| 3 | +## 架构原则 |
| 4 | + |
| 5 | +### 正确的职责分工 |
| 6 | +- **主循环 (`modify_actions`)**: 负责完整的动作管理,包括传统观察处理和新的激活类型判定 |
| 7 | +- **规划器 (`Planner`)**: 专注于从最终确定的动作集中进行决策,不再处理动作筛选 |
| 8 | + |
| 9 | +### 关注点分离 |
| 10 | +- **动作管理** → 主循环处理 |
| 11 | +- **决策制定** → 规划器处理 |
| 12 | +- **配置解析** → ActionManager处理 |
| 13 | + |
| 14 | +## 修正后的调用流程 |
| 15 | + |
| 16 | +### 1. 主循环阶段 (heartFC_chat.py) |
| 17 | + |
| 18 | +```python |
| 19 | +# 在主循环中调用完整的动作管理流程 |
| 20 | +async def modify_actions_task(): |
| 21 | + # 提取聊天上下文信息 |
| 22 | + observed_messages_str = "" |
| 23 | + chat_context = "" |
| 24 | + |
| 25 | + for obs in self.observations: |
| 26 | + if hasattr(obs, 'get_talking_message_str_truncate'): |
| 27 | + observed_messages_str = obs.get_talking_message_str_truncate() |
| 28 | + elif hasattr(obs, 'get_chat_type'): |
| 29 | + chat_context = f"聊天类型: {obs.get_chat_type()}" |
| 30 | + |
| 31 | + # 调用完整的动作修改流程 |
| 32 | + await self.action_modifier.modify_actions( |
| 33 | + observations=self.observations, |
| 34 | + observed_messages_str=observed_messages_str, |
| 35 | + chat_context=chat_context, |
| 36 | + extra_context=extra_context |
| 37 | + ) |
| 38 | +``` |
| 39 | + |
| 40 | +**处理内容:** |
| 41 | +- 传统观察处理(循环历史分析、类型匹配等) |
| 42 | +- 激活类型判定(ALWAYS, RANDOM, LLM_JUDGE, KEYWORD) |
| 43 | +- 并行LLM判定 |
| 44 | +- 智能缓存 |
| 45 | +- 动态关键词收集 |
| 46 | + |
| 47 | +### 2. 规划器阶段 (planner_simple.py) |
| 48 | + |
| 49 | +```python |
| 50 | +# 规划器直接获取最终的动作集 |
| 51 | +current_available_actions_dict = self.action_manager.get_using_actions() |
| 52 | + |
| 53 | +# 获取完整的动作信息 |
| 54 | +all_registered_actions = self.action_manager.get_registered_actions() |
| 55 | +current_available_actions = {} |
| 56 | +for action_name in current_available_actions_dict.keys(): |
| 57 | + if action_name in all_registered_actions: |
| 58 | + current_available_actions[action_name] = all_registered_actions[action_name] |
| 59 | +``` |
| 60 | + |
| 61 | +**处理内容:** |
| 62 | +- 仅获取经过完整处理的最终动作集 |
| 63 | +- 专注于从可用动作中进行决策 |
| 64 | +- 不再处理动作筛选逻辑 |
| 65 | + |
| 66 | +## 核心优化功能 |
| 67 | + |
| 68 | +### 1. 并行LLM判定 |
| 69 | +```python |
| 70 | +# 同时判定多个LLM_JUDGE类型的动作 |
| 71 | +task_results = await asyncio.gather(*tasks, return_exceptions=True) |
| 72 | +``` |
| 73 | + |
| 74 | +### 2. 智能缓存系统 |
| 75 | +```python |
| 76 | +# 基于上下文哈希的缓存机制 |
| 77 | +cache_key = f"{action_name}_{context_hash}" |
| 78 | +if cache_key in self._llm_judge_cache: |
| 79 | + return cached_result |
| 80 | +``` |
| 81 | + |
| 82 | +### 3. 直接LLM判定 |
| 83 | +```python |
| 84 | +# 直接对所有LLM_JUDGE类型的动作进行并行判定 |
| 85 | +llm_results = await self._process_llm_judge_actions_parallel(llm_judge_actions, ...) |
| 86 | +``` |
| 87 | + |
| 88 | +### 4. 动态关键词收集 |
| 89 | +```python |
| 90 | +# 从动作配置中动态收集关键词,避免硬编码 |
| 91 | +for action_name, action_info in llm_judge_actions.items(): |
| 92 | + keywords = action_info.get("activation_keywords", []) |
| 93 | + if keywords: |
| 94 | + # 检查消息中的关键词匹配 |
| 95 | +``` |
| 96 | + |
| 97 | +## 四种激活类型 |
| 98 | + |
| 99 | +### 1. ALWAYS - 始终激活 |
| 100 | +```python |
| 101 | +activation_type = ActionActivationType.ALWAYS |
| 102 | +# 基础动作,如 reply, no_reply |
| 103 | +``` |
| 104 | + |
| 105 | +### 2. RANDOM - 随机激活 |
| 106 | +```python |
| 107 | +activation_type = ActionActivationType.RANDOM |
| 108 | +random_probability = 0.3 # 激活概率 |
| 109 | +# 用于增加惊喜元素,如随机表情 |
| 110 | +``` |
| 111 | + |
| 112 | +### 3. LLM_JUDGE - 智能判定 |
| 113 | +```python |
| 114 | +activation_type = ActionActivationType.LLM_JUDGE |
| 115 | +llm_judge_prompt = "自定义判定提示词" |
| 116 | +# 需要理解上下文的复杂动作,如情感表达 |
| 117 | +``` |
| 118 | + |
| 119 | +### 4. KEYWORD - 关键词触发 |
| 120 | +```python |
| 121 | +activation_type = ActionActivationType.KEYWORD |
| 122 | +activation_keywords = ["画", "图片", "生成"] |
| 123 | +# 明确指令触发的动作,如图片生成 |
| 124 | +``` |
| 125 | + |
| 126 | +## 性能提升 |
| 127 | + |
| 128 | +### 理论性能改进 |
| 129 | +- **并行LLM判定**: 1.5-2x 提升 |
| 130 | +- **智能缓存**: 20-30% 额外提升 |
| 131 | +- **整体预期**: 2-3x 性能提升 |
| 132 | + |
| 133 | +### 缓存策略 |
| 134 | +- **缓存键**: `{action_name}_{context_hash}` |
| 135 | +- **过期时间**: 30秒 |
| 136 | +- **哈希算法**: MD5 (消息内容+上下文) |
| 137 | + |
| 138 | +## 向后兼容性 |
| 139 | + |
| 140 | +### 废弃方法处理 |
| 141 | +```python |
| 142 | +async def process_actions_for_planner(...): |
| 143 | + """[已废弃] 此方法现在已被整合到 modify_actions() 中""" |
| 144 | + logger.warning("process_actions_for_planner() 已废弃") |
| 145 | + # 仍然返回结果以保持兼容性 |
| 146 | + return current_using_actions |
| 147 | +``` |
| 148 | + |
| 149 | +### 迁移指南 |
| 150 | +1. **主循环**: 使用 `modify_actions(observations, messages, context, extra)` |
| 151 | +2. **规划器**: 直接使用 `ActionManager.get_using_actions()` |
| 152 | +3. **移除**: 规划器中对 `process_actions_for_planner()` 的调用 |
| 153 | + |
| 154 | +## 测试验证 |
| 155 | + |
| 156 | +### 运行测试 |
| 157 | +```bash |
| 158 | +python test_corrected_architecture.py |
| 159 | +``` |
| 160 | + |
| 161 | +### 测试内容 |
| 162 | +- 架构正确性验证 |
| 163 | +- 数据一致性检查 |
| 164 | +- 职责分离确认 |
| 165 | +- 性能测试 |
| 166 | +- 向后兼容性验证 |
| 167 | + |
| 168 | +## 优势总结 |
| 169 | + |
| 170 | +### 1. 清晰的架构 |
| 171 | +- **单一职责**: 每个组件专注于自己的核心功能 |
| 172 | +- **关注点分离**: 动作管理与决策制定分离 |
| 173 | +- **可维护性**: 逻辑清晰,易于理解和修改 |
| 174 | + |
| 175 | +### 2. 高性能 |
| 176 | +- **并行处理**: 多个LLM判定同时进行 |
| 177 | +- **智能缓存**: 避免重复计算 |
| 178 | + |
| 179 | +### 3. 智能化 |
| 180 | +- **动态配置**: 从动作配置中收集关键词 |
| 181 | +- **上下文感知**: 基于聊天内容智能激活 |
| 182 | +- **冲突避免**: 防止重复激活 |
| 183 | + |
| 184 | +### 4. 可扩展性 |
| 185 | +- **插件式**: 新的激活类型易于添加 |
| 186 | +- **配置驱动**: 通过配置控制行为 |
| 187 | +- **模块化**: 各组件独立可测试 |
| 188 | + |
| 189 | +这个修正后的架构实现了正确的职责分工,确保了主循环负责动作管理,规划器专注于决策,同时集成了并行判定和智能缓存等优化功能。 |
0 commit comments