OpenClaw学习

proanimer 发布于 8 小时前 5 次阅读



最近OpenClaw(原moltbot)实在是大火了一把,有如当时DeepSeek的国内热潮。但是DeepSeek模型的训练、微调包括前端的数据集收集和清理等都不是一般人能负担的,而OpenClaw不仅代码开源,在Agent开发的工程技术上也提供了一些实践,由此引入了一波"养虾潮"。

早期Langchain,llamaIndex以及AutoGen等都封装了一系列工具调用、记忆机制、分块策略以及结构化输出等。

目前langchain团队有Deep Agents,LangGraph,LangSmith以及LangChain等开源框架,都与AI应用开发与部署相关。

但这些框架都是用于开发AI产品的,实际的AI应用又往往依附具体平台。OpenClaw在我看来的一个优势就是开源,使得其与多个IM系统通信(当然,前提是这些IM公司也愿意支持),更加实用。下面具体介绍其重要组件。

网关

Gateway 是一个常驻后台的消息路由服务。它负责接收各个客户端的消息,例如QQ,微信,发送给Agent,然后再分发响应。核心思想是“单网关、多端接入”。它不像传统的单一程序,而是一个分布式设计的通信枢纽。具体来说,通过websocket并约定消息格式与clients通信。

唯一性:一台主机上只能运行一个 Gateway 进程。

职责:它统一管理所有的通信插件(WhatsApp, Telegram, Slack, Discord, Signal 等)。它是唯一一个直接维护这些第三方平台 Session 的地方。

通信:通过 WebSocket(默认端口 18789)与外界沟通。

image-20260324145811017

虽然都连接到 Gateway,但身份不同:

  • Clients (客户端):如 Mac 应用、CLI 命令行工具或 Web 界面。它们发送命令(如“发消息”),并接收事件(如“助手正在回复”)。
  • Nodes (节点):这是 OpenClaw 的特色。你可以把你的手机(iOS/Android)或另一台电脑作为“Node”接入。它们提供硬件能力,比如调用摄像头 (camera.*)、获取位置 (location.get) 或屏幕录制。
  • WebChat:一个简单的网页端聊天界面,直接通过 WebSocket 接口与网关通信

运行时

Agent 运行必须有一个工作区目录(默认在 agents.defaults.workspace)。

  • 唯一性:这是 Agent 唯一的“工作目录 (CWD)”。
  • 作用:所有的工具操作、文件读取、上下文注入都发生在这里。

当一个Agent启动时,它会干哪些事情?

首先,OpenClaw包含一系列配置文件,工作区文件~/.openclaw/openclaw.json配置启动端口和模式等。另外工作区目录还包含一系列md文件用于设置Agent个性、工作流程和使用的工具等。

  • AGENTS.md:核心运行指令和“长期记忆”。
  • SOUL.md:定义 Agent 的性格、语气和行为边界(灵魂)。
  • IDENTITY.md:Agent 的名字、图标和基本人设。
  • USER.md:你的个人信息,方便 Agent 称呼你。
  • BOOTSTRAP.md:初次运行时的引导流程(完成后会被自动删除)。

注入逻辑: 在每个会话的第一轮,OpenClaw 会把这些文件的内容直接塞进模型的 Context 里。空文件会被跳过。大文件会被截断并加上标记,以便提示信息保持简洁.如果文件缺失,OpenClaw 会注入一条“缺失文件”标记行.

会话记录以 JSONL 格式存储在:~/.openclaw/agents/<agentId>/sessions/<SessionId>.jsonl

工具 (Tools) 与 技能 (Skills)

  • 内置工具:如 read(读)、write(写)、exec(执行命令)等。这些是 Agent 与系统交互的基础。
  • 技能 (Skills):这是更高级的功能模块,可以从三个地方加载:
  1. 软件自带。
  2. 用户本地路径 (~/.openclaw/skills)。
  3. 工作区内部路径。

OpenClaw 的 Agent 运行时是建立在 Pi agent core 之上的,它负责:

  • 会话管理:对话历史存放在 ~/.openclaw/agents/<agentId>/sessions/ 下,以 .jsonl 格式存储。
  • 流式转向 (Steering while streaming):这是个高级功能。当 Agent 正在说话或执行工具时,如果你发送新消息,OpenClaw 可以配置如何“插嘴”或“引导”它。

Agent Loop

Agent Loop(智能体循环) 是将静态的 AI 模型转化为动态“智能体”的核心机制。它不只是简单的一问一答,而是一个自动化的、闭环的执行过程

Agent Loop 是 Agent 运行的“真实”生命周期:从接收消息到执行动作,再到最终回复。 在 OpenClaw 中,这通常是一个序列化(Serialized)的过程,确保每个会话(Session)在同一时间只有一个逻辑在运行,防止工具调用产生冲突或竞态条件。

一次完整的循环包含以下五个关键步骤:

  1. 输入与归一化 (Intake)
  • 接收来自 WhatsApp、Telegram 等渠道的消息。
  • 将语音、图片等非结构化数据转化为模型可理解的文本和附件。
  1. 上下文组装 (Context Assembly)
  • 动态加载 AGENTS.mdSOUL.md 和会话历史。
  • 注入当前可用的 Tools(工具)Skills(技能) 列表。
  1. 模型推理 (Model Inference)
  • 将组装好的上下文发送给大模型(如 GPT-4o 或 Claude)。
  • 模型决定:是直接回复用户,还是需要调用工具
  1. 工具执行 (Tool Execution)
  • 如果模型请求调用工具(如 exec 运行代码或 read 读取文件),OpenClaw 的后端会代为执行。
  • 结果回填:将工具执行的输出(Output)作为新的上下文反馈给模型。
  1. 持续迭代与持久化 (Loop & Persistence)
  • 模型看到工具结果后,可能决定发起下一次工具调用,或者结束循环。
  • 所有的交互过程(包括隐藏的工具调用)都会存入 .jsonl 会话文件

为了保证稳定性,OpenClaw 引入了 Lane Queue(车道队列) 系统:

  • 顺序执行:默认情况下,同一会话的任务是按顺序排队的。这防止了 Agent 在还没读完文件 A 的时候就开始修改文件 A。
  • 三种模式
  • collect:收集一段时间内的消息,一次性处理。
  • steer:在 Agent 运行过程中注入新指令(转向)。
  • followup:当前任务结束后立刻开始下一个任务。

OpenClaw 的 Loop 支持 Partial Replies(部分回复)

  • 当模型在“思考”或调用长耗时工具时,它会向客户端流式推送事件。
  • Block Streaming:可以将回复拆分成段落,每完成一段就发送一次,提升用户感知的响应速度。

系统提示词

系统提示词 是 OpenClaw 每次运行智能体时自动构建的“操作指令集”。它不像普通的聊天机器人那样只有一段固定的文字,而是由多个动态模块拼装而成的。

OpenClaw 的系统提示词是权属归网关(Gateway)所有的,意味着它会根据你当前的运行环境(时间、工作区文件、已安装的技能)实时生成。其核心目标是在有限的上下文窗口内,为模型提供最精准的“行动指南”

一个标准的 OpenClaw 系统提示词通常按顺序包含以下板块:

  • Tooling (工具集):当前可用工具的列表及其简短描述。这是 Agent 能“干活”的前提。
  • Safety (安全守则):防止模型产生越权行为或试图绕过监管的简短提醒。
  • Skills (技能索引):告诉模型目前有哪些技能可用,以及如何通过 SKILL.md 按需加载详细指令。
  • Workspace (工作区):明确告知模型当前的运行目录(agents.defaults.workspace)。
  • Project Context (项目上下文):自动注入工作区中的引导文件(如 AGENTS.mdSOUL.mdUSER.md)。
  • Runtime Metadata (运行时元数据):包含当前时间(本地/UTC)、主机操作系统、所用模型名称、当前的“思考深度”等级。

上下文注入逻辑,OpenClaw 会扫描工作区,并将特定的 Markdown 文件内容注入提示词:

  • 如果文件存在:内容会被读入,如果文件太大(超过 20,000 字符),系统会自动截断并加上 [TRUNCATED] 标记。
  • 如果文件缺失:系统会注入一行“Missing file”标记,提示模型该部分信息缺失。

上下文

简单来说,Context 就是 OpenClaw 在单次运行中发送给 AI 模型的所有信息总和

Context 受到模型“上下文窗口”(Token 限制)的约束。它不同于“Memory(存储在磁盘上的长期记忆)”,Context 仅指当前模型窗口内可见的内容

它主要由三部分组成:

  • 系统提示词 (System Prompt):由 OpenClaw 自动构建,包含规则、工具列表、技能列表、当前时间、运行状态以及注入的工作区文件。
  • 对话历史 (Conversation History):当前会话中你与助手的往返消息。
  • 工具调用与附件:命令的输出结果、读取的文件内容、图片/音频等

每次运行都会重新构建系统提示词,其中最特别的是 项目上下文 (Project Context)。它会自动注入工作区中的特定文件(如果存在):

  • AGENTS.md / SOUL.md(定义性格/灵魂)
  • TOOLS.md / IDENTITY.md(定义工具和身份)
  • USER.md(用户信息)
  • BOOTSTRAP.md(首次运行引导)

注意: 为了防止撑爆上下文,大文件会被自动截断(默认每个文件 20,000 字符)。

注意skills和tools的差别,两者对上下文窗口的占用:

  • 技能 (Skills):系统提示词只包含技能的名称和简短描述。模型只有在需要时才会去按需读取具体的 SKILL.md 指令,这样可以节省空间。
  • 工具 (Tools):工具的开销是双重的。一是系统提示词里的文字描述,二是 JSON Schema(工具定义)。即使你在对话中看不见这些 JSON 代码,它们依然会占用大量的 Token。

可以通过斜杠命令实时监控和优化上下文:

  • /status:快速查看当前窗口有多满。
  • /context list:列出当前注入的文件及其大小,查看是否被截断。
  • /context detail:深入分析哪些工具或技能占用了最多的空间。
  • /compact压缩指令。将旧的对话历史总结为一个精简的条目,从而释放窗口空间。

上下文引擎

Context Engine 是一个可插拔的模块,它的唯一任务是:把散落在各处的数据(对话历史、文件、工具结果)按照优先级和 Token 限制,拼成最终发给模型的那个长字符串。

当模型准备运行(Run)时,上下文引擎会执行以下操作:

  • 分层堆叠:它按照预定义的顺序堆叠内容:系统提示词 -> 项目上下文文件 -> 被裁剪的历史记录 -> 最新的用户消息
  • Token 预算分配:它会计算每个部分占用了多少 Token。如果超标,它负责决定先扔掉谁
  • 通常策略: 优先保留系统指令和最近的几轮对话,裁剪掉中间陈旧的工具执行结果

压缩 (Compaction)

这是解决“记不住事”和“Token 太贵”的核心技术。

  • 触发时机:当对话历史接近模型上限(比如 32k 的 80%)时。
  • 执行方式:引擎会调用一个后台模型,把旧的 10 轮对话总结成一段话,然后替换掉原来的 10 轮细节。
  • 持久化:压缩后的总结会存入 .jsonl 会话文件中,确保下次加载时依然有效。

Agent Workspace

Agent Workspace(智能体工作区) 是智能体赖以生存的“物理世界”。如果把智能体比作一个程序员,那么 Workspace 就是他的这台电脑和当前打开的项目目录。它是所有工具操作、文件读写和上下文注入的唯一基准点

在 OpenClaw 启动时,它会指定一个目录作为 agents.defaults.workspace

  • 封闭性:智能体的所有相对路径操作(如 read("file.txt"))都相对于这个目录。
  • 权限限制:出于安全考虑,智能体通常被禁止跳出这个目录去修改系统文件

一个健康的工作区通常包含以下几个关键部分:

文件/目录作用
AGENTS.md长期指令、任务清单和重要记忆。
SOUL.md核心性格、语气准则和行为边界。
USER.md关于你的信息(偏好、姓名、习惯)。
TOOLS.md你对工具使用的特殊要求(例如:“用 curl 时必须加 -L”)。
skills/存放所有 SKILL.md 的文件夹。
scratchpad/智能体存放临时文件、代码片段或中间数据的地方

动态注入逻辑

在 OpenClaw 的架构中,并没有一个持久不变的“大脑状态”。每一轮你发消息给 Agent,Context Engine(上下文引擎) 都会执行一次“组装”动作:

  • 第一轮对话(开启新会话)
  • 读取 AGENTS.md, SOUL.md, USER.md 等全部内容。
  • 如果是新工作区,还会读取并执行 BOOTSTRAP.md
  • 结果:Agent 处于最清醒、最完整的人设状态。
  • 连续的后续对话(第 2, 3… N 轮)
  • 依然会读取 SOUL.mdAGENTS.md(确保人设不走样)。
  • 叠加 之前的对话历史(Transcript)。
  • 按需读取 之前提到过的 SKILL.md(如果还没被裁剪掉)。 System Prompt 的来源:
  • 启动扫描:每次对话开始前,OpenClaw 会扫描工作区。
  • 自动读取:它会自动读取上述 .md 文件并拼装进提示词。
  • 截断机制:如果文件太大(默认超过 20,000 字符),OpenClaw 会执行“安全截断”,防止 Token 溢出。

OpenClaw 引入了 Sandbox 概念来保护你的工作区:

  • Main Workspace:主会话使用的默认目录。
  • Session Workspace:如果开启了沙箱模式,每个新会话可以拥有自己独立的子目录(在 workspaceRoot 下)。这防止了不同任务之间互相“污染”代码或配置。

启动

当你第一次启动 Agent 时,OpenClaw 会在你的工作区(默认 ~/.openclaw/workspace)执行以下动作:

  1. 投放种子文件:自动生成 AGENTS.mdIDENTITY.mdUSER.md 和关键的 BOOTSTRAP.md
  2. 开启 Q&A 仪式:Agent 会主动问你一系列问题(一次一个),比如“你希望我怎么称呼你?”、“我的主要任务是什么?”。
  3. 写入“记忆”:它会把你的回答实时写入到 IDENTITY.md(它的名字/人设)、USER.md(你的偏好)和 SOUL.md(它的语气/边界)中。
  4. 焚毁指令:一旦仪式完成,BOOTSTRAP.md 会被自动删除,确保这个过程不会在下次启动时重复运行

会话与记忆机制

Session(会话) 是系统管理对话状态、隔离上下文和持久化记忆的核心单位。

OpenClaw 对 Session 的持久化分为两个层面,确保了即使程序重启,对话和状态也不会丢失:

  • Session Store (sessions.json)
  • 存储所有会话的元数据(如 Session ID、最后活跃时间、使用的模型、当前的 Token 计数等)。
  • 这是网关(Gateway)快速索引会话的“账本”。
  • Transcript (<sessionId>.jsonl)
  • 存储真实的对话记录
  • 采用 JSONL(每行一个 JSON 对象) 格式,包含用户消息、助手回复以及隐藏的工具调用过程。
  • 这是一个“树状结构”,每一条记录都有 ID 和父级 ID,支持复杂的追溯。

会话隔离与路由 (Routing)

OpenClaw 通过 sessionKey 来决定一条新消息应该进入哪个会话:

  • 私聊 (Direct Messages):通常合并为一个主会话(main),由 session.dmScope 参数控制。
  • 群组/频道 (Groups/Channels):每个群组或频道通常会获得独立的 sessionKey,确保不同群组之间的对话上下文不会互相污染。
  • 线程 (Threads):在 Slack 或 Discord 等支持线程的平台上,每个 Thread 也会被视为独立的 Session。

Session 并不是永恒不变的,它有明确的刷新机制

  • 手动重置:通过 /new/reset 命令强制开启一个全新的 Session ID。
  • 每日自动重置:默认在当地时间 凌晨 4:00 进行。如果最后一次活动早于这个时间,下一条消息将自动触发新会话。
  • 闲置重置:可以配置 idleMinutes,如果在设定的时间内没有互动,会话将过期。

为了防止 Session 文件无限增长导致性能下降,OpenClaw 会执行:

  • 自动压缩 (Auto-Compaction):当会话接近模型的上下文窗口限制时,引擎会运行一个“静默轮次”,总结重要信息并清理冗余的工具调用细节。
  • 持久化笔记:在丢弃细节前,Agent 会被提醒将关键事实写入 AGENTS.mdUSER.md,实现从“短期会话”到“长期记忆”的转化。

会话裁剪

Session Pruning(会话裁剪) 是一种为了节省 Token 成本、优化缓存效率而设计的“内存即时清理”机制。它和你之前看到的 Compaction(压缩) 有本质区别:压缩是永久性的总结,而裁剪是临时性的剔除

即时清理,不改存档

  • 不改硬盘:裁剪只发生在发送给 AI 模型的那一瞬间。它不会修改你硬盘里的 .jsonl 会话文件。
  • 目标对象:它专门针对旧的 Tool Results(工具执行结果)。用户和助手的对话文字永远不会被裁剪。

为什么需要裁剪?(主要针对 Anthropic 模型)

这个功能主要是为 Anthropic(如 Claude 系列)的 Prompt Caching(提示词缓存) 优化的:

  • 节省写缓存成本:如果一个会话闲置了一段时间,缓存会失效。下次请求时,如果不裁剪掉那些冗余的旧工具输出(比如之前执行过的一大段代码运行结果),你就得为这些旧数据的重新写入付全额的钱。
  • TTL 机制:默认情况下,如果距离上次调用超过 5 分钟(ttl: "5m"),裁剪就会触发,清理掉不再需要的旧数据,只保留最近几轮的上下文。

裁剪的两种手段

  • Soft-trim(软裁剪):针对超大的工具输出,只保留开头和结尾,中间用 ... 代替。
  • Hard-clear(硬清理):直接把整个工具输出替换为 [Old tool result content cleared]

裁剪的保护规则(哪些不删)

OpenClaw 非常谨慎,以下内容会被保护:

  • 最近的消息:默认保留最后 3 轮助手的对话(keepLastAssistants: 3),确保模型不会因为丢失最近的工具结果而变傻。
  • 多媒体内容:包含图片的工具结果永远不会被裁剪。
  • 对话文字:你和 Agent 说的话永远是完整的。
维度Session Pruning (裁剪)Compaction (压缩)
持久性暂时的(仅限本次请求)永久的(写入历史文件)
内容变化只是删除旧的工具输出将旧对话总结成一小段话
主要目的降低缓存写入成本、保持窗口整洁彻底释放 Token 空间,解决长时记忆问题

会话工具

Session Tools(会话工具) 是一组专门为 AI Agent 设计的功能,允许 AI 能够“感知”并“操作”不同的对话上下文。简单来说,这套工具让 AI 不再局限于当前的这一段对话,而是可以查看其他历史记录、列出活跃会话,甚至主动给另一个会话发送消息。

核心工具集

AI 可以调用以下四个具体的函数:

  • sessions_list:列出当前的会话。AI 可以通过它看到有哪些活跃的群聊、私聊或任务(Cron)。
  • sessions_history:获取指定会话的历史记录(Transcript)。这对于 AI 回溯之前的决策或获取跨会话的信息至关重要。
  • sessions_send:向另一个会话发送消息。这实现了 “Agent 间通信”,例如一个负责调度的 AI 让另一个负责执行的 AI 去干活。
  • sessions_spawn:产生一个隔离的子会话。AI 可以创建一个“分身”去处理特定的子任务,处理完后再把结果汇报回来,而不会污染主会话的上下文

为了准确操作,OpenClaw 为不同类型的会话定义了唯一的 Key:

  • main:指代当前 Agent 的主对话。
  • agent:<id>:<channel>:group:<id>:群组对话的标识。
  • cron:<id>:定时任务产生的会话。
  • node-<id>:特定节点(如硬件设备)的会话。

记忆机制

Memory(记忆) 机制并不是指 AI 模型本身的参数,也不是简单的数据库存储,而是一套基于文件系统的持久化长短期记忆系统

OpenClaw 将记忆存储在配置的工作空间(如 /root/.picoclaw/workspace)中,采用人类可读的 Markdown 格式:

  • 短期/日常记忆 (memory/YYYY-MM-DD.md)
  • 这是一个“追加模式”的日志。
  • 每天会自动生成一个文件,记录当天的重要事件、对话摘要或运行笔记。
  • 系统在每次会话开始时,默认会读取“今天”和“昨天”的日志。
  • 长期/核心记忆 (MEMORY.md)
  • 存放经过整理的、长期有效的客观事实、用户偏好或关键决策。
  • AI 会在需要时检索此文件。

AI 并不是“被动”拥有记忆,而是通过以下两个工具主动管理:

  • memory_search:语义搜索。即使 AI 问的问题和记录的文字不完全一样,系统也会通过向量索引(Vector Index)找到最相关的片段。
  • memory_get:精准读取。AI 可以指定读取某个 Markdown 文件的特定行。

自动冲刷机制

这是 OpenClaw 的一个精妙设计。由于 AI 的对话上下文(Context Window)有限,当对话太长需要进行“压缩(Compaction)”时,系统会执行以下操作:

  1. 静默触发:在正式丢弃旧对话之前,系统会给 AI 发送一个隐藏指令。
  2. 整理笔记:AI 会把即将被遗忘的对话中“值得记住”的部分提取出来,写入 memory/YYYY-MM-DD.md
  3. 清空缓存:确认写入磁盘后,系统才安全地清理内存中的对话历史。
  • 注:这由 agents.defaults.compaction.memoryFlush 控制。

为了让记忆搜索更聪明,OpenClaw 支持为这些 Markdown 文件建立向量索引:

  • 支持多种后端:你可以使用 OpenAI, Gemini, Ollama 或本地 GGUF 模型来生成嵌入(Embeddings)。
  • 混合搜索:结合了关键词匹配(BM25)和语义匹配,确保 AI 能快速找回信息。
特性会话 (Session)记忆 (Memory)
物理形态sessions/<id>.json (全量原始数据)workspace/memory/*.md (Markdown 文本)
生命周期随对话增长。过长时会被“压缩”或“修剪”。永久存储。除非你手动删除文件。
AI 的感知每一轮对话都在“重读”历史记录。AI 需要通过“搜索”或“回溯”才能想起。
存储内容所有的废话、工具报错、原始 JSON。只有事实、结论、偏好和重要摘要。
Token 消耗。历史越长,每一泡对话越贵。。只在需要时检索相关的片段注入。

Compaction(压缩/精简) 是解决“对话太长导致 AI 变傻或 Token 爆表”的核心技术。

当对话轮数过多,超出了大模型(LLM)的上下文窗口(Context Window)限制时,OpenClaw 会启动这个流程,将旧的对话“脱水”成精华摘要,从而为新对话腾出空间。

自动化与手动触发

  • 自动压缩 (Auto-compaction)
  • 触发条件:当会话消耗的 Token 接近模型的上限(Context Window)时自动触发。
  • 表现:在 Verbose 模式下你会看到 🧹 Auto-compaction complete
  • 手动压缩
  • 你可以直接在聊天框输入 /compact
  • 进阶用法:/compact 重点保留关于 Docker 部署的决策。这会指导 AI 在压缩时重点关注你指定的信息。

openclaw.json (或 config.toml) 中,可以通过 agents.defaults.compaction 进行精细控制:

  • model:你可以指定一个专门用于压缩的模型。例如,平时用本地的 Ollama 聊天,但压缩时调用 Claude 3.5 Sonnet 以获得更高质量的摘要。
  • identifierPolicy
  • strict(默认):强制要求 AI 在摘要中保留所有的 ID(如 Session ID、File ID),防止压缩后 AI 找不到文件。
  • memoryFlush
  • 在压缩发生前的瞬间,系统会触发一次“记忆冲刷”,提醒 AI 将重要事实写入 memory/YYYY-MM-DD.mdMEMORY.md
特性Compaction (压缩)Pruning (修剪)
操作对象所有的对话文本主要是工具执行结果 (Tool Results)
处理方式总结、概括直接截断、丢弃冗余部分
持久化写入磁盘 JSONL 文件往往只在内存中处理,不一定持久化
目的维持长期的上下文理解防止单个巨大的工具输出(如读取 1MB 文件)撑爆上下文

多智能体

在 OpenClaw 中,一个 Agent 被视为一个独立的“大脑”

  • 完全隔离:每个 Agent 拥有自己独立的配置目录(agentDir)、系统提示词(System Prompt)、工作空间、会话记录和授权信息。
  • 多身份运行:一个运行中的 Gateway(网关)可以同时挂载多个 Agent,它们可以并排运行,互不干扰。

单智能体在复杂场景下的局限性:

  • 防止“提示词意大利面”:当任务太复杂时,单智能体的提示词会变得臃肿且难以维护。多智能体允许你将逻辑拆分成更短、更聚焦的模块。
  • 分布式记忆:每个子 Agent 只维护自己负责领域的上下文,降低了长文本带来的成本和幻觉。
  • 并行处理:多个 Agent 可以同时执行不相关的子任务,提高效率。

OpenClaw 提供了三种典型的协作架构,开发者可以通过 YAML 文件进行声明式配置:

  • 编排模式 (Orchestrator Pattern): 有一个“主智能体”作为入口,它接收用户请求,分析任务,然后分派给下属的“子智能体”去执行,最后汇总结果返回。
  • 点对点模式 (Peer-to-Peer Pattern): Agent 之间是平等的,它们可以根据任务需要互相通信和移交任务,没有中心化的控制者。
  • 层级模式 (Hierarchical Pattern): 类似于公司架构,有多个层级的管理。例如:总监 Agent 下面有组长 Agent,组长再带执行 Agent。

Gateway 如何处理输入:

  • 路由绑定:可以将不同的通讯渠道(比如两个不同的 WhatsApp 号码或 Telegram 机器人)绑定到不同的 Agent 上。
  • 身份隔离:即使用同一个网关,不同的用户可以通过不同的身份标识访问不同的 Agent 实例,确保隐私和数据不混淆。

重试策略

OpenClaw 的重试逻辑遵循三个原则:

  • 粒度适中:重试针对单个 HTTP 请求(如发一条消息),而不是整个复杂的任务流。
  • 保证顺序:只重试当前失败的步骤,确保消息队列的顺序不乱。
  • 避免副作用:尽量避免在重试时重复执行可能导致双重扣费或重复发帖的非幂等操作

OpenClaw 通常执行以下默认行为:

  • 尝试次数:默认 3 次。
  • 最大延迟上限:30,000 毫秒(30秒)。
  • 抖动 (Jitter):0.1 (10%)。通过加入随机随机延迟,防止多个 Agent 同时重试导致“惊群效应”打垮服务器。

当模型由于“上下文窗口溢出”(Context Overflow)而报错时,OpenClaw 会:

  1. 自动触发 Compaction(压缩) 总结之前的对话。
  2. 清理空间后,自动重新提交 原始请求,而无需用户手动重试。

Claw实战

由于OpenClaw需求内存还是大一些,这里使用zeroclaw,使用Rust编写,更轻量。

使用docker安装

git clone https://github.com/zeroclaw-labs/zeroclaw.git
cd zeroclaw

修改docker-compose.yaml文件,修改

services:
  zeroclaw:
    # 将这行:
    # image: ghcr.io/zeroclaw-labs/zeroclaw:latest
    # 更改为:
    image: ghcr.io/zeroclaw-labs/zeroclaw:debian

同时增加环境变量启动IP地址

ZEROCLAW_GATEWAY_HOST=0.0.0.0

然后启动,并通过docker execdocker attach执行命令。

docker compose up -d

可以考虑创建QQ和飞书通道。

参考资料

  1. OpenClaw - OpenClaw
  2. LangChain overview - Docs by LangChain
  3. Docker Deployment · zeroclaw-labs/zeroclaw Wiki
  4. 科技爱好者周刊(第 387 期):你是领先的 - 阮一峰的网络日志
此作者没有提供个人介绍。
最后更新于 2026-03-25