深度学习笔记 | 创建于 2026-03-07 | 难度:⭐⭐⭐ 入门

本文是一份从零开始学 OpenClaw 的深度指南。如果你想理解 OpenClaw 的架构设计,而不仅仅是用它,这篇文章就是为你写的。


前言:为什么先学核心概念

OpenClaw 看起来复杂,但其实有一套清晰的设计哲学。要真正理解它,我们需要从根本上认识它的四个"心脏":

  1. Gateway 架构 - 它如何管理所有消息
  2. Session 管理 - 它如何维护对话状态
  3. Memory 系统 - 它如何让 Agent 记忆
  4. Multi-Agent 路由 - 它如何支持多个 Agent 独立工作

这些概念像四根柱子,撑起整个 OpenClaw 的天空。


一、Gateway 架构:消息流的中心枢纽

问题:为什么需要 Gateway?

想象你同时在用 WhatsApp、Telegram、Discord、Feishu 等多个平台。每个平台的 API 都不一样。如果 AI Agent 要回复所有消息,是不是得:

  • 学会每个平台的 API
  • 维护每个平台的连接
  • 处理每个平台的消息格式
  • 管理多个登录状态…

这太复杂了!

方案:一个 Gateway 统一管理

OpenClaw 的设计很聪明——用一个 Gateway 充当中间人:

多个信道连接              Agent 在这里
  ↓                         ↓
WhatsApp ─\
Discord   ├─→ Gateway ──→ Agent Logic ──→ 工具执行
Telegram─/                   ↑
Feishu  ─\                   │
         / User Interface    │
         (macOS App)        └─ 回复消息
Web UI ─┤
CLI    ─┘

Gateway 的三个角色

  • 消息集线器:汇聚所有信道的消息
  • API 翻译器:把不同平台的消息转成统一格式给 Agent
  • 连接管理器:一个 Gateway 维护所有信道、一个 Baileys 会话

关键设计:单 Gateway 原则

一个主机 = 一个 Gateway 实例

好处:
- 状态集中管理,不用同步
- 一个 WhatsApp 会话(Baileys 只支持一个)
- 所有 Agent 共享一个网关

限制:
- 一台机器上只能跑一个 Gateway
- 要多个 Gateway,用多台主机

为什么用 WebSocket 而不是 HTTP?

  • ✅ 双向通信(Gateway 可以推送事件)
  • ✅ 长连接(实时性好)
  • ✅ 低开销(比 HTTP 轮询高效)

Wire Protocol(协议详解)

第一帧必须是 connect(握手)

→ 客户端:
{
  "type": "connect",
  "params": {
    "deviceId": "my-mac",
    "auth": { "token": "optional" },
    "challenge": "nonce-value"
  }
}

← Gateway:
{
  "type": "res",
  "ok": true,
  "payload": {
    "status": "hello-ok",
    "health": { ... },
    "snapshot": { ... }
  }
}

握手后,标准请求-响应流程:

→ 请求:
{ "type": "req", "id": "id1", "method": "agent", "params": { ... } }

← 响应(可能多帧):
{ "type": "event", "event": "agent", "payload": { ... } }
{ "type": "event", "event": "agent", "payload": { ... } }
{ "type": "res", "id": "id1", "ok": true, "payload": { ... } }

二、Session 管理:对话连续性的魔法

问题:如何维护对话上下文?

你在 WhatsApp 问 AI 一个问题,第二天在 Telegram 问相关的问题。AI 应该记得昨天的内容吗?

OpenClaw 的答案:取决于你的配置。

Session 的四个隔离级别

dmScope 配置项决定了 DM 的隔离方式:

级别 说明 Session Key
main 所有 DM 共享 agent:main:main
per-peer 按发送者隔离 agent:main:dm:alice
per-channel-peer 按信道+发送者隔离 agent:main:whatsapp:dm:alice
per-account-channel-peer 按账户+信道+发送者隔离 agent:main:whatsapp:default:dm:alice

⭐ 推荐:多人环境使用 per-channel-peer(完全隔离,安全性最高)

多人 DM 的安全陷阱

不安全的配置(dmScope: "main"):

Alice:  "我下周要辞职,这是秘密"
        ↓
        共享 Session

Bob:    "我们最近讨论了什么?"
        ↓
        Model 可能用 Alice 的内容回答!🚨

解决方案:使用 per-channel-peer 隔离。

Session 生命周期:三种重置策略

1. Daily Reset(按天重置):每天凌晨 4 点清空历史,隐私好

2. Idle Reset(按空闲重置):2 小时没消息就重置

3. Per-Type Override:不同类型的聊天用不同策略

Session 维护策略

{
  "session": {
    "maintenance": {
      "mode": "enforce",
      "pruneAfter": "30d",
      "maxEntries": 500,
      "maxDiskBytes": "1gb",
      "highWaterBytes": "800mb"
    }
  }
}

工作流程:

写入 Session
  ↓
检查大小是否超限
  ↓
触发维护:
  1. 删除 30 天前的旧 Session
  2. 如果超过 500 个,删除最旧的
  3. 如果超过 1GB,按优先级删除
  4. 归档已删除的转录文件

三、Memory 系统:让 Agent 能记住东西

问题:Context Window 是有限的

一个 Model 的 Context Window 有上限。比如 Claude 的 context 是 200K tokens。如果对话已经 100K tokens 了,新对话会挤掉旧的。

怎么办?Agent 需要"长期记忆"。

Memory = Markdown 文件

OpenClaw 的记忆系统很简单:就是纯文本 Markdown 文件

~/.openclaw/workspace/
├── MEMORY.md
└── memory/
    ├── 2026-03-07.md
    ├── 2026-03-06.md
    └── projects.md

分层设计

层级 文件 作用
长期 MEMORY.md 核心记忆
短期 memory/YYYY-MM-DD.md 日志
参考 memory/*.md 笔记

Memory Search:语义搜索

不只是关键词搜索,而是语义搜索

Agent 问:"我家网络怎么配置的?"
Markdown 里:"Omada 路由器,192.168.1.1,VLAN 10"

搜索能找到,因为语义相似!

背后原理

  • 把文本分段(~400 tokens)
  • 转成向量(embedding)
  • 用向量相似度搜索

混合搜索(Hybrid Search)

Vector 分数:0.8(语义相似度)
BM25 分数:0.95(关键词匹配)
最终分数:0.7×0.8 + 0.3×0.95 = 0.845

优势:既能捕捉语义,又能精确匹配硬数字。

高级特性

MMR(多样性排序):保证搜索结果的多样性,不会重复

时间衰减(Temporal Decay):最近的记忆权重更高

半生期 30 天的衰减:
- 今天:100%
- 7 天前:84%
- 30 天前:50%
- 90 天前:12.5%

自动内存刷新

检测到 Context 快满
  ↓
触发无声 memory flush 回合
  ↓
提醒 Model:写下重要的东西到 MEMORY.md
  ↓
Model 写入记忆
  ↓
压缩旧对话

用户通常看不到这个过程(返回 NO_REPLY

Memory 的使用原则

何时写 MEMORY.md(长期记忆)

  • 决策
  • 偏好
  • 持久的事实

何时写 memory/YYYY-MM-DD.md(日志)

  • 日常活动
  • 一次性任务
  • 学习笔记

四、Multi-Agent 路由:多个 Agent 的协奏

问题:一个 Agent 够用吗?

不一定。你可能需要:

- 一个快速的 Agent 处理日常聊天
- 一个深度思考的 Agent 处理复杂问题
- 一个安全受限的 Agent 处理家庭群组
- 一个工作 Agent 处理公司事务

方案:Multi-Agent 架构

一个 Gateway 内多个独立的 Agent:

Inbound Message
    ↓
  Gateway
    ↓
  Routing
  ↓ ↓ ↓ ↓
Agent  Agent  Agent  Agent
(家)   (工)   (编码) (安全)

Agent 的完整定义

Agent = Workspace + AuthDir + SessionStore + Personality

{
  "id": "work",
  "workspace": "~/.openclaw/workspace-work",
  "model": "anthropic/claude-opus-4-6"
}

每个 Agent 有

  • 独立的 AGENTS.md、SOUL.md(人格)
  • 独立的 auth-profiles.json(认证)
  • 独立的 sessions/(对话历史)
  • 独立选择的模型

Routing 规则(最具体优先)

优先级从高到低:

  1. Peer match(最具体)
  2. ParentPeer match(线程继承)
  3. GuildId + Roles(Discord)
  4. GuildId(Discord)
  5. TeamId(Slack)
  6. AccountId match
  7. Channel-wide fallback
  8. Default agent

规则:第一个匹配就用,后面的被忽略。

配置示例 1:快速 vs 深度

{
  "agents": {
    "list": [
      {
        "id": "chat",
        "model": "anthropic/claude-sonnet-4-5"
      },
      {
        "id": "opus",
        "model": "anthropic/claude-opus-4-6"
      }
    ]
  },
  "bindings": [
    {
      "agentId": "opus",
      "match": { "channel": "whatsapp" }
    },
    {
      "agentId": "chat",
      "match": { "channel": "telegram" }
    }
  ]
}

配置示例 2:多个 WhatsApp 账户

{
  "agents": {
    "list": [
      { "id": "home", "workspace": "~/.openclaw/workspace-home" },
      { "id": "work", "workspace": "~/.openclaw/workspace-work" }
    ]
  },
  "bindings": [
    {
      "agentId": "home",
      "match": { "channel": "whatsapp", "accountId": "personal" }
    },
    {
      "agentId": "work",
      "match": { "channel": "whatsapp", "accountId": "biz" }
    }
  ]
}

Per-Agent 工具和沙箱

{
  "agents": {
    "list": [
      {
        "id": "personal",
        "sandbox": { "mode": "off" }
      },
      {
        "id": "family",
        "sandbox": { "mode": "all", "scope": "agent" },
        "tools": {
          "allow": ["read"],
          "deny": ["exec", "write", "edit"]
        }
      }
    ]
  }
}

五、身份链接(Identity Links)

问题:同一个人多个账户

Alice 在 Telegram 上是 123456789,在 WhatsApp 上是 +1234567890

怎么知道是同一个人?

方案:Identity Links

{
  "session": {
    "identityLinks": {
      "alice": [
        "telegram:123456789",
        "whatsapp:+1234567890",
        "discord:987654321012345678"
      ]
    }
  }
}

效果:Alice 在不同平台的 DM 都用 session key agent:main:telegram:dm:alice,对话有连续性!


💭 学习心得

我的理解过程

一开始看文档,我被 Session、Memory、Routing 搞糊涂了。但当我把它们想象成一个饭馆的管理系统时,一切都清楚了:

  • Gateway = 前台(接收所有订单)
  • Session = 餐桌(每个客人一个,保持对话连续)
  • Memory = 笔记本(记住常客的偏好)
  • Multi-Agent = 多个厨师(不同厨师做不同菜系)

关键洞察

  1. Session 隔离是安全的基石 - 多人环境下必须用 per-channel-peer
  2. Memory 是补充,不是替代 - Context Window 有限,定期刷新很重要
  3. Routing 是灵活性的源头 - 通过 Binding 实现复杂工作流
  4. Gateway 的单一原则 - 一个主机一个网关,限制了水平扩展,但提高了稳定性

常见误区

❌ “我把所有人的 DM 放在 ‘main’ Session,这样很连续”
✅ 对于单用户是对的,但多人会信息泄露

❌ “我用 Local Embedding,这样可以离线搜索”
✅ 对的,但首次加载 GGUF 模型可能很慢

❌ “我把一个 Session 跑了 3 天,为什么 Agent 开始说傻话”
✅ 可能是 Context 满了,需要压缩或重置


📋 学习总结

关键概念速查表

概念 核心 实战用处
Gateway 一个主机一个,管理所有信道 理解部署限制
Session 每个对话一个,隔离是安全基础 配置 dmScope 保护隐私
Memory 向量搜索 + 文本搜索,层级记忆 让 Agent 记住重要东西
Multi-Agent 独立 Workspace + Routing 多角色、多模型协作
Identity Link 同一个人跨平台 保持连续性

关键配置速查

安全的多人 DM

{ "session": { "dmScope": "per-channel-peer" } }

快速 + 深度双 Agent

{
  "agents": {
    "list": [
      { "id": "chat", "model": "claude-sonnet-4-5" },
      { "id": "opus", "model": "claude-opus-4-6" }
    ]
  }
}

向量记忆搜索

{
  "memorySearch": {
    "provider": "openai",
    "query": {
      "hybrid": { "enabled": true },
      "mmr": { "enabled": true },
      "temporalDecay": { "enabled": true, "halfLifeDays": 30 }
    }
  }
}

📚 下一步学习路径

  • 第二篇:OpenClaw 的自动化系统(Hooks、Webhooks、Cron Jobs)
  • 第三篇:多信道集成(WhatsApp、Telegram、Discord、Feishu)
  • 第四篇:生产部署和故障排查

标签(精选 7 个):

  1. OpenClaw
  2. AI Agent
  3. 多渠道架构
  4. Session 管理
  5. 向量记忆
  6. 系统设计
  7. 实战指南
Logo

小龙虾开发者社区是 CSDN 旗下专注 OpenClaw 生态的官方阵地,聚焦技能开发、插件实践与部署教程,为开发者提供可直接落地的方案、工具与交流平台,助力高效构建与落地 AI 应用

更多推荐