跳转至

主动记忆如何工作

工作原理

flowchart LR
  U["User Message"] --> D["Deterministic Trigger Recall"]
  D -->|strong trusted match| I["Inject Bounded Hidden Context"]
  D -->|weak or empty| H["Check Recall Intent"]
  H -->|no| O["Inject Bounded Recall Outcome"]
  H -->|yes| R["Active Memory Deep Recall Sub-Agent"]
  R -->|NONE| M
  R -->|unavailable| O
  R -->|relevant summary| I
  O --> M["Main Reply"]
  I --> M

深度召回子代理只能调用已配置的记忆召回工具(见 记忆工具)。如果查询与可用记忆之间的关联较弱,它会返回 NONE,主回复将在没有额外上下文的情况下继续。主动跳过无意图的情况和不可用的召回只会添加一条固定的、有界的结果说明。

Active Memory 是一种对话增强功能,而非平台级推理功能:

场景 会运行 Active Memory 吗?
Control UI / Web 聊天持久会话 是,当任一激活路径定向到该代理时
同一持久聊天路径上的其他交互式频道会话 是,当任一激活路径允许该对话时
无头一次性运行 否
心跳/后台运行 否
通用内部 agent-command 路径 否
子代理/内部辅助执行 否

会话间消息和子完成投递不会运行 Active Memory,即使它们到达可见对话中也是如此。OpenClaw 会根据它们的类型化投递来源跳过召回。同一对话中随后的人类消息在通常的定向和会话规则下仍符合条件。

请在会话持久且面向用户、代理拥有有意义的长期记忆可供搜索,并且连续性与个性化比原始提示确定性更重要时使用:稳定的偏好、重复出现的习惯、应自然浮现的长期上下文。它不适合自动化、内部工作器、一次性 API 任务,或任何隐藏个性化会令人意外的场景。

运行时机

Active Memory 为深度召回通道提供两条定向路径:

  1. Remember across conversations 会自动定向启用有效 memory.search.rememberAcrossConversations 设置的代理,但仅限私密直接对话或持久的显式 UI 对话。
  2. Advanced Active Memory 定向 plugins.entries.active-memory.config.agents 中列出的代理 ID,并应用插件的聊天类型和聊天 ID 控制。

两条路径都要求插件已启用,并且是符合条件的交互式持久会话。会话级 /active-memory off 会暂停该会话的两条路径。如果任何条件不满足,则 Active Memory 不会在该回合运行,主回复不受影响。

config.mode 控制定向回合何时启动阻塞式子代理:

模式 行为
escalate 默认。仅在通道 1 没有强命中时,为召回意图运行。
always 保留之前的行为,在每个符合条件的定向回合都运行。
off 禁用深度召回,但不卸载插件。

确定性可信触发器通道在 off 模式下仍可用。 rememberAcrossConversations 保持不变:它仍然控制深度召回是否可以搜索其他私密对话。

会话类型

config.allowedChatTypes 控制哪些类型的会话可以运行 Advanced Active Memory 路径。它不能扩大 Remember across conversations 的范围:即使 Advanced Active Memory 被允许在群组或频道中使用,该产品设置仍保持仅私密。默认值:

allowedChatTypes: ["direct"]

有效值:direct、group、channel、explicit(使用不透明会话 ID 的 portal 式会话,例如 agent:main:explicit:portal-123)。直接消息会话默认运行;群组、频道和显式会话需要选择加入:

allowedChatTypes: ["direct", "group"]
allowedChatTypes: ["direct", "group", "channel"]

为了在允许的聊天类型内进行更小范围的发布,请添加 config.allowedChatIds 和 config.deniedChatIds:

  • allowedChatIds 是已解析会话 ID 的允许列表。当非空时,Active Memory 仅对会话 ID 位于列表中的会话运行——这会同时收窄所有允许的聊天类型,包括直接消息。若要在只收窄群组的同时保留所有直接消息,请将直接对端 ID 也添加到 allowedChatIds 中,或者将 allowedChatTypes 限制在你正在测试的群组/频道发布范围内。
  • deniedChatIds 是一个拒绝列表,始终优先于 allowedChatTypes 和 allowedChatIds。

ID 来自持久频道会话键(例如飞书 chat_id/open_id、Telegram 聊天 ID、Slack 频道 ID)。匹配不区分大小写。如果 allowedChatIds 非空且 OpenClaw 无法解析该会话的会话 ID,则 Active Memory 会跳过该回合,而不是猜测。

allowedChatTypes: ["direct", "group"],
allowedChatIds: ["ou_operator_open_id", "oc_small_ops_group"],
deniedChatIds: ["oc_large_public_group"]

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw