Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

14.7 借鉴点:从消费品 Agent 学到的工程经验

🦞 "当用户键从 CLI 变成聊天框,Agent 的每一处设计都要重新考虑。"


一、OpenClaw 给 Agent 工程师的 5 个核心启示

读到这里你可能觉得 OpenClaw 和前面章节的 LangChain / LangGraph / Claude Code 都差不多——确实如此,因为它们背后是同一个最小 Agent 模型。但 OpenClaw 有一条独特的"产品维度":用户键在聊天 App 里

这件事看似简单,实际对 Agent 系统的每个子模块都产生了可观察的影响。本节梳理 5 个最重要的"产品级"工程启示。


二、启示 1:上下文压力变了

2.1 CLI 用户 vs 聊天用户

用户形态一条"指令"的字数多步任务倾向
CLI平均 8–20 词一次一组完整任务("修这个 bug 然后跑测试")
聊天平均 3–12 词短消息 + 多轮迭代("看下这个""再多说两句""取消")

2.2 工程影响

Agent Loop 的"上下文压力"在聊天场景下完全不一样:

  1. 每条消息都自带"上下文破缺"——"嗯""好的""继续"这些词必须建立在强记忆基础上;
  2. 多轮节奏快——一个会话 50 条消息是常态(CLI 场景下罕见);
  3. 群聊杂讯多——别人的无关消息也进同一个 channel。

2.3 OpenClaw 的解法

  • 每条消息压缩:用 LLM 把上一段对话压成 30–80 字的"事件流摘要",作为新消息前的上下文;
  • 显式 mention 触发:群里只在 @bot 时响应(避免响应群里别人的对话);
  • session 内"话题切片":当检测到话题切换时(例如 30 分钟无后续、或语言突变),触发一次显式 summary。

📌 借到自己的系统:如果你做一个面向聊天 App 的 Agent,先把"上下文压缩 + 消息边界识别"做到 Agent Loop 里——这比"用更大的上下文窗口"重要得多。


三、启示 2:可观测性要从"工具级"升到"渠道级"

3.1 CLI 工具下的可观测性

LangChain / LangGraph 里的可观测性通常停在"工具被调用了几次 / 哪一步错了"——足够应付开发者 debug。

3.2 聊天 App 下还要再加一层

OpenClaw 的可观测性需要额外回答这些问题:

  • 哪个渠道在什么时候发了什么消息?
  • 哪个用户最常使用 Agent?哪些指令失败了?
  • 哪个 Skill 在哪个渠道下从来没被调用过?
  • 消息延迟、压缩率、自动分块次数?

OpenClaw 实现的可观测性矩阵(在 ~/.openclaw/metrics/ 下):

# ~/.openclaw/metrics.yaml —— 自动滚动
channels:
  telegram:
    inbound_count: 412
    outbound_count: 678
    avg_response_time_ms: 830
    auto_chunks: 34
agent:
  total_steps: 4218
  tool_calls: 1922
  permission_denied: 38
skills:
  gmail-summary:
    invocations: 89
    success: 87
    failure: 2
  shell-safe:
    invocations: 421
    success: 421
    failure: 0

3.3 借到自己的系统

如果你打算让 Agent 跑在"非开发场景"(消费者 / 客服 / 内部),至少加三个面板

  1. 消息级:每条入站 + 出站消息留痕(带 channel/from/timestamp);
  2. 会话级:每个 session 的步数、工具调用、错误码;
  3. Skill 级:每个 Skill 的调用次数、成功率、平均延迟。

这些不复杂(一两百行),但几乎所有"Agent 上线后半夜被告警"的痛苦都源自没有这些数据。


四、启示 3:把"权限模型"做到渠道级

4.1 单一渠道的权限 vs 多渠道的权限

维度CLI 场景多渠道场景
谁能触发默认只有本机用户多个平台、多账号、群聊、陌生人
能跑什么命令本机用户拥有完整权限有人触碰你的 Agent = 几乎就是触碰你的机器
谁可信自己自己 + 朋友 + 群友 + 陌生人

4.2 OpenClaw 的渠道级权限分层

身份权限
陌生人不响应(dm_policy: closed
通讯录好友仅响应 + 只读类工具(mail read / calendar read)
全功能(含 shell / 文件写)

每个渠道、每个用户身份、每个工具的权限矩阵,都是显式声明的:

# ~/.openclaw/config.yaml
permissions:
  - user: "+1-555-0123"   # 你的号码
    tools: ["*"]
    shell: ["*"]

  - user: "+1-555-8888"   # 你太太的号码
    tools: ["read_file", "write_file", "gmail.list_today_emails"]
    shell: []             # 不能跑 shell

  - user: "+1-555-9999"   # 快递员(陌生人)
    action: "deny"

4.3 借到自己的系统

如果你做"接外部用户输入"的 Agent(无论是客服还是 Coding Bot),用户身份和权限是绑定的——绝不能"信任底层 LLM 来判断"。

更系统的做法是用"政策代码"(policy-as-code):

const policy = {
  alice: { files: ['/workspace/alice/*'], network: 'allow' },
  bob:   { files: ['/workspace/bob/*'],   network: 'deny' },
  guest: { files: [],                      network: 'deny' },
};

function canDo(user: string, action: Action) {
  return checkPolicy(policy[user], action);
}

五、启示 4:Skills 是"公共契约",不是"个人脚本"

5.1 OpenClaw Skills 与公司内部脚本的差异

很多公司在内部 Agent 系统里写一堆"内部脚本"——这些脚本没有公开文档、没有版本号、没有权限声明。OpenClaw 反其道:每个 Skill 必须以 SKILL.md 为入口,且强制 frontmatter 字段。

这带来三个好处:

  1. 可发现:LLM 看到 description 就能判断该不该用;
  2. 可审查permissions 段写出明确权能;
  3. 可共享:任何 Skill 都可以复制粘贴到另一个 OpenClaw 实例。

5.2 OpenClaw 的隐式契约

SKILL.md 不只是一个文件——它是一个公共契约

# 这是契约的"机器可读"部分
name: send-email
description: "通过 Gmail 发送邮件"
tools: [...]
version: 0.1.0
author: someone

它做了这些事:

  • 让 LLM 能"找到"这个 Skill;
  • 让 Agent Loop 能"调用"这个 Skill 的工具;
  • 让 ClawHub 能"列出"这个 Skill;
  • 让任何第三方能"拷贝"这个 Skill 到自己的实例;
  • 让 Agent 更新时能"判断兼容性"(看 version)。

5.3 借到自己的系统

把你的"内部 Agent 工具集"也写成"带 frontmatter 的 Markdown 包装":

/agent-skills/
├── send-email/
│   ├── SKILL.md     ← 强制
│   ├── send.py
│   └── tests/
└── ...

这会强迫你的团队把"工具"升级为"契约"——这是一种看似微小的格式升级,但效果与单元测试 / 类型注解接近:让团队的工程纪律从"口头约定"升级到"机器可读"


六、启示 5:把 Agent 当成"长跑服务"来设计

6.1 OpenClaw 不只是一次脚本

CLI 场景下,Agent 通常是"用户开启 → 执行 → 关闭"的短流程。聊天 App 场景下,Agent 必须长跑:每天 24 小时、每周 7 天、持续数月甚至数年。

这意味着传统软件工程的所有"长跑服务"约束都要落地:

维度短流程 Agent长跑 Agent
状态持久化在内存里即可必须落盘(SQLite / 文件)
崩溃恢复失败即终止启动后接管之前 session
升级策略整体替换灰度、热加载、回滚
依赖管理简单 freeze显式版本管理(pnpm.lock)+ 灰度发布
观测简单日志指标 + 日志 + 追踪
安全文件权限即可频繁更新的凭证、Keyring、权限审计
备份无所谓周期备份:记忆 / Skill / 配置

6.2 OpenClaw 长跑服务的"组件"

组件实现
进程守护Docker + restart=unless-stopped
健康检查openclaw doctor 自检命令
崩溃后接管session 落盘 + watchdog
热加载 Skillopenclaw skills install 无需重启
更新策略三频道 stable/beta/dev
配置迁移openclaw config migrate
密钥管理系统 Keyring
备份~/.openclaw/ 全目录

6.3 借到自己的系统

如果你打算让自己的 Agent 真的用 30 天以上,从第一天就考虑这些事:

  • 强制 session 落盘——不能只放内存;
  • 保证崩溃后能接上——把心跳 / 恢复写进主循环;
  • 给升级留余地——避免大版本直接 breaking,让破坏性变更走 beta;
  • 给可观测性投资时间——上线第一周不出问题靠运气,上线第一个月不出问题靠观测。

七、一个观察:OpenClaw 的"开源生态引爆点"现象

回到第 1 节的命名史和第 6 节的多语言 fork。OpenClaw 是 2025–2026 年开源史上一个值得研究的现象:一个周末项目在极短时间内成为 GitHub 上增长最快的开源项目之一,并催生了 6 种语言的改写版、大量社区 PR 提交到 ClawHub(具体规模以仓库主页为准,动态数字不做引用)。

为什么?

可能的原因:

  1. 定位准确——"行动型 Agent"恰好是 2025–2026 年的强需求;
  2. 门槛低——npx @openclaw/cli 就能跑;
  3. 抽象稳——核心架构能被 6 种语言重写;
  4. 生态协议开放——SKILL.md 是公开约定的、人人都能贡献;
  5. 创始人影响力——Peter Steinberger 在开发者圈里有大量背书(感谢他在 PSPDFKit 等项目积累的口碑);
  6. 错过窗口后的焦虑——当一个项目速度如此快时,"再不参与就晚了"成为社交压力。

但这些都是放大器,真正的根因还是**(1)+(2)+(3)**:需求、门槛、抽象。

7.1 给"想参与开源 / 想做自己开源项目的人"的启示

如果你正在做 / 想做一款开源 Agent / AI 工具,下面这些观察值得记住:

  1. 找到真需求——别追热度,找到一个愿意付费 / 愿意花时间的人群的具体痛点;
  2. 降低门槛——"npx xxx 一键跑"比"需要 conda 还得装 xxx 系统库"重要 10 倍;
  3. 找到不变量——你的架构核心是否稳定到"换个语言能重写"?这是抽象质量的硬指标;
  4. 建立公共契约——让外部贡献者能 PR,能验证,能发布版本;
  5. 避免早期商业化焦虑——开源的成功需要 12–24 个月才能显现。

八、本节小结

主题关键要点
启示 1聊天场景上下文压力大;要做"消息压缩 + 话题切片"
启示 2可观测性要从工具级升到"渠道 + 会话 + Skill"三级面板
启示 3多渠道下的"用户 × 渠道 × 工具"权限矩阵必须显式
启示 4SKILL.md 不只是文档,它是公共契约
启示 5长跑服务:持久化、崩溃恢复、灰度升级、可观测性、备份

九、第三部分小结(OpenClaw 视角)

我们用了 7 节讲完 OpenClaw:

  1. 定位:跨平台开源个人 AI 助理,住在你所有聊天 App;
  2. 起源:Clawdbot → Moltbot → OpenClaw;
  3. 部署:4 种方式(npx / 安装脚本 / 源码 / Docker);
  4. 架构:4 层(Channel / Gateway / Agent Loop / Toolbox);
  5. 多渠道:5 大平台,群聊 + 私聊策略,跨渠道人格一致;
  6. Skills 生态SKILL.md 契约、ClawHub 市场、6 种语言 fork;
  7. 实战:从 0 到 24/7 个人助理的完整 5 步;
  8. 借鉴:5 条工程启示 — 上下文压力、观测、权限、契约、长跑。

你读完后应该能:

  • ✅ 在自己机器上 30 分钟内启动 OpenClaw;
  • ✅ 把任何"我想让 Agent 帮我做的重复任务"封装成一个 Skill;
  • ✅ 把 OpenClaw 的设计哲学搬回自己的 Agent 系统;
  • ✅ 看清任何"多渠道 / 消费级 Agent"的本质。

下一章:第15章 Hermes Agent:自我进化的 Agent