工业多Agent架构-借鉴OpenCraw架构

可以从 OpenClaw 里抽出几条和「工业里有很多 agent」直接相关的设计思路,再按工业场景做一次映射和借鉴。


一、OpenClaw 里值得借鉴的几点

设计点 OpenClaw 做法 对「多 agent」的启示
统一控制面 一个 Gateway:会话、路由、鉴权、下发 工业里也适合「一个控制平面」,多 agent、多设备都通过它协调
能力声明 + 发现 Node 连上时声明 caps/commands,Gateway 只做路由与校验 设备/子系统不写死在代码里,而是「上线即声明能力」,便于扩展和替换
身份与执行分离 Device = 身份,Node = 当前连接;invoke 带 nodeId 工业里:谁在执行、在哪执行可问责、可审计
通道与执行分离 Channel(Telegram/Feishu)= 人机入口;Node = 执行端 工业里:HMI/看板/工单系统 = 通道;PLC/机器人/MES = 执行端
LLM 在环路内 不「query 直接路由到某 node」,而是 LLM 选工具 → 工具再 node.invoke 多 agent 时:由「协调 agent」或各自 agent 通过工具调设备/其他 agent,而不是硬编码路由
Skill 式扩展 新能力以 skill 形式加进来,不破坏核心 工业里:新工艺、新质检规则、新报表 = 可插拔能力包

二、工业多 Agent 场景下怎么借鉴

1. 把「很多 agent」拆成两类东西

  • 做决策的 agent(类似 OpenClaw 的 Agent):
    质检 agent、排产 agent、设备健康 agent、工艺优化 agent 等,每个都是「LLM + 工具」。
  • 被调用的执行端(类似 OpenClaw 的 Node):
    PLC、机械手、相机、MES、WMS、老系统接口等,每个有固定「能力」和「命令」。

借鉴方式:
不要让「很多 agent」彼此直接乱调,而是:

  • 所有「决策」都经过一个工业 Gateway(或按厂/车间拆成多个 Gateway);
  • 所有「执行」都抽象成 Node:连上 Gateway 时声明 caps/commands,由 agent 通过工具invoke(nodeId, command, params)

这样:

  • 大模型算不算 device?不算,大模型是「用这些 Node 的 agent」;
  • Feishu/Node 那种混淆也不会出现:Feishu 只是 channel,工业里的「看板 / 工单系统 / 移动端」也只是 channel,不是 Node。

2. 架构草图(借鉴 OpenClaw)

                    ┌─────────────────────────────────────────┐
                    │         工业 Gateway(控制面)            │
                    │  会话/路由/鉴权/节点注册/下发              │
                    └─────────────────────────────────────────┘
                      │              │                │
         ┌────────────┼──────────────┼────────────────┼────────────┐
         │            │              │                │            │
         ▼            ▼              ▼                ▼            ▼
    ┌─────────┐ ┌─────────┐   ┌──────────┐    ┌──────────┐  ┌─────────┐
    │ Channel │ │ Channel │   │ Agent A  │    │ Agent B  │  │ Agent C │
    │ (HMI/   │ │ (飞书/  │   │ (质检)   │    │ (排产)   │  │ (设备   │
    │ 看板)   │ │ 工单)   │   │          │    │          │  │  健康)  │
    └─────────┘ └─────────┘   └────┬─────┘    └────┬─────┘  └────┬────┘
         │            │             │               │             │
         │            │             └───────┬───────┴──────┬───────┘
         │            │                     │ 工具调用     │
         │            │                     ▼             ▼
         │            │              node.invoke(deviceId, command, params)
         │            │                     │             │
         │            │         ┌───────────┴─────────────┴───────────┐
         │            │         │            Node 层(执行端)          │
         │            │         │  PLC / 机械手 / 相机 / MES / 老系统   │
         │            │         │  连上时声明 caps + commands          │
         │            │         └─────────────────────────────────────┘
         │            │
         └────────────┴── 用户/系统从不同「通道」进来,都到 Gateway,再进对应 Agent

要点:

  • 多个 Agent:每个是一个「LLM + 工具集」,工具里统一通过 Gateway 的「类 node.invoke」调设备。
  • 大模型:只在 Agent 内部做推理,不当作 Device;Feishu/Node 那种混用在这里就是:Feishu 只当 channel,工业 Node 只当执行端。

3. 具体映射(工业 → OpenClaw 概念)

工业概念 借鉴成 OpenClaw 里的
多个业务 agent(质检/排产/运维) 多个 Agent(多会话或多 agent 类型),共享同一 Gateway、同一批 Node
PLC / 机械手 / 相机 / MES Node:每类一种或每台一个 nodeId,连上时声明 caps(如 "plc", "robot", "camera", "mes")和 commands(如 "plc.read", "robot.move", "camera.capture")
设备身份、工控安全 Device:每台设备或每个子系统一个 identity(可简化成证书/密钥),配对后才允许被 invoke
人机界面、飞书/企微、工单系统 Channel:只负责「谁在跟哪个 Agent 对话」,不参与执行;不把「Node Feishu」当 Node
新产线、新工艺、新规则 Skill 式能力包:描述 + 工具/脚本,由 Agent 按需调用,不写死到 Gateway

4. 落地时可以怎么做

  • 先做「单 Gateway + 多 Node」
    所有设备/系统抽象成 Node,连上时注册 caps/commands;所有「智能」先由一个总 Agent 通过工具调这些 Node,不急着拆很多 agent。
  • 再拆多 Agent
    按业务拆成质检 Agent、排产 Agent 等,每个 agent 只带自己需要的工具;工具内部统一走 Gateway 的 invoke(nodeId, command, params),不直接连设备。
  • 能力描述与选 Node
    OpenClaw 里 caps 没有自然语言描述,工业里可以给每个 Node/cap 加简短描述,要么写进 Agent 的 system prompt(类似 skills),要么做轻量检索(关键词/向量)辅助「选哪台设备」,再交给 LLM 决定最终 nodeId。
  • 安全与审计
    沿用 Device 身份 + 每次 invoke 带 nodeId:谁(哪个 agent/用户)、在哪个设备上、执行了什么命令,可全量审计。

三、直接回答你的两个点

  • 「OpenClaw Node Feishu」:Feishu 是 channel,不是 Node;工业里类似地,飞书/企微只当入口,不当作「被 invoke 的设备」。
  • 大模型:算「Agent 的推理引擎」,不算 device;Device 只指「可配对、可被 invoke 的执行端」。

这样借鉴 OpenClaw 的架构,在工业多 Agent 场景下就是:一个 Gateway + 多 Agent(多模型/多角色)+ 多 Node(设备/系统)+ 多 Channel(人机入口),用「能力声明 + 工具里 invoke」把大模型和具体设备解耦,便于扩展和运维。

Agent之间通讯

可以更精确一点说:


结论(先说)

  • 不直接通讯:agent 之间不要彼此直接连、直接调(没有 P2P)。
  • 可以间接协作:通过 Gateway(或 Gateway 提供的工具/会话) 来“通讯”,这样仍然算「经过一个控制面」。

所以:agent 之间不是“完全不会通讯”,而是“不直接通讯,若需要协作就经 Gateway 间接通讯”。


两种做法对比

方式 含义 问题
直接通讯 A 直接调 B 的 API/队列,或 A、B 互相持有引用 耦合紧、难管控、难审计、拓扑乱
经 Gateway 间接协作 A 通过「工具」调 Gateway,Gateway 再触发 B 的会话/任务;或 A 发消息到 B 的 session 路由、鉴权、审计都在控制面,拓扑清晰

你前面说的「所有决策都经过一个工业 Gateway」对应的就是:agent 之间不直接调,要协作就经 Gateway


OpenClaw 里其实有「agent 间协作」

OpenClaw 里 agent(会话)之间是可以协作的,但都是经 Gateway/工具完成的,不是 P2P:

  • sessions_send:当前 agent 通过工具给另一个 session 发消息,那个 session 的 agent 会在下一轮处理这条消息。
  • subagent:当前 agent 通过工具再起一个 agent 运行(本质是经 Gateway 再跑一轮 agent)。
  • agent.run / agent.wait:通过 Gateway 的 agent 接口触发某会话的一次运行并等结果。

所以:agent 之间会“通讯”,但都是“经 Gateway 的会话/接口”来做的,没有“A 直连 B”这种直接通讯。


对应到工业架构

  • 不直接通讯
    质检 agent 不直接调排产 agent 的 HTTP 接口;排产 agent 也不直接调设备健康 agent 的队列。
    → 这样就不会出现「很多 agent 彼此直接乱调」。

  • 需要协作时,经 Gateway

    • 方式一:工具里调 Gateway
      例如「排产 agent」调工具 invoke_agent(sessionKey="quality", message="请对订单 X 做质检"),由 Gateway 把这条消息投到质检 agent 的会话,质检 agent 在下一轮看到并执行。
    • 方式二:共享 Node/系统
      排产 agent 写 MES,质检 agent 读 MES;两者都只和 Gateway + Node 打交道,不互相直连。

所以:agent 之间不会“直接通讯”,但可以通过“经 Gateway 的会话/工具”间接通讯和协作。 这样既满足「所有决策都经过一个工业 Gateway」,又能在需要时让多个 agent 配合工作。

分层架构

借鉴 OpenClaw 的思路,工业多 Agent 可以按「入口 → 路由 → 资源与执行 → 设备」分成下面几层。


1. 分层总览(借鉴 OpenClaw)

┌─────────────────────────────────────────────────────────────────────────────┐
│  Layer 1: 入口层 (Channel / Ingress)                                         │
│  工单、MES 界面、大屏、API、飞书/企微、移动端 … 只负责「谁在请求」              │
└─────────────────────────────────────────────────────────────────────────────┘
                                        │
                                        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│  Layer 2: 控制面 (Gateway)                                                   │
│  鉴权、限流、路由(意图 or 来源)、会话/会话键、审计;不执行业务逻辑            │
└─────────────────────────────────────────────────────────────────────────────┘
                                        │
                    ┌───────────────────┼───────────────────┐
                    ▼                   ▼                   ▼
┌───────────────────────┐  ┌───────────────────────┐  ┌───────────────────────┐
│  Layer 3a: 路由解析   │  │  Layer 3b: 资源解析   │  │  Layer 3c: 执行调度   │
│  意图识别 / Binding   │  │  Agent + Session      │  │  选 Agent 资源并       │
│  → 得到 target        │  │  按 (agentId,         │  │  触发一次 Run         │
│  (agentId / sessionKey)│  │  sessionKey) 定位    │  │  (ReAct + 工具)       │
└───────────────────────┘  └───────────────────────┘  └───────────────────────┘
                    │                   │                   │
                    └───────────────────┼───────────────────┘
                                        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│  Layer 4: Agent 资源层 (Agent as Resource)                                   │
│  质检 / 排产 / 设备健康 / 工艺优化 … 每个 Agent = 一份配置 + 会话 + 能力       │
│  运行时按 (agentId, sessionKey) 挂载,跑 ReAct;复杂任务可 spawn 子 Agent     │
└─────────────────────────────────────────────────────────────────────────────┘
                                        │
                                        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│  Layer 5: 能力层 (Tools + Skills + Node 调用)                               │
│  • 内置/插件工具(含描述)                                                    │
│  • 工业 Skills(工艺包、报表规则、质检规则 …)                                 │
│  • 对 Node 的 invoke(nodeId, command, params)                               │
└─────────────────────────────────────────────────────────────────────────────┘
                                        │
                                        ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│  Layer 6: 执行端层 (Node / 设备与系统)                                        │
│  PLC、机械手、相机、MES、WMS、老系统接口 … 连上 Gateway 注册 caps/commands   │
└─────────────────────────────────────────────────────────────────────────────┘

2. 各层职责(简要)

名称 职责 借鉴 OpenClaw
L1 入口层 接收请求(工单、界面、API、IM),只做接入与身份/来源信息,不解析意图 Channel:只负责「从哪来」
L2 控制面 鉴权、限流、审计、会话归属;把请求交给「路由 + 资源」逻辑 Gateway 统一控制面
L3 路由与资源 意图识别(或按来源 binding)→ 得到 target;再解析成 (agentId, sessionKey),决定在哪个 Agent 的哪条 Session 上跑 Binding/路由 → Agent + Session 资源
L4 Agent 资源层 Agent = 资源(配置 + 会话);按 (agentId, sessionKey) 挂载,跑 ReAct,可选子 Agent Agent as Resource,Session 子资源
L5 能力层 工具(含描述)、Skills、以及对 Node 的 invoke;Agent 在本层选工具/技能/节点 Tools + Skills + node.invoke
L6 执行端层 设备/系统注册为 Node,声明 caps/commands;接收 invoke,执行后回结果 Node + Device 身份

3. 工业侧和 OpenClaw 的对应与差异

维度 OpenClaw 工业多 Agent(借鉴后)
路由 按来源 binding → agentId 可保留「按来源」和/或 按意图 → agentId(或 sessionKey)
Agent work / life(人设/场景) 质检 / 排产 / 设备健康(任务型),仍按资源建模
Session 按 channel/peer/dmScope 算 sessionKey 可按产线/工单/租户/会话算 sessionKey
能力 内置工具 + 插件工具 + Skills(prompt) 内置/插件工具 + 工业 Skills(工艺/规则包)+ node.invoke
执行端 Node(设备/应用) Node(PLC、MES、相机、机械手等)

4. 一句话

借鉴 OpenClaw 的工业多 Agent 在架构上可以分层为:入口层 → 控制面(Gateway)→ 路由与资源解析(意图 or 来源 → agentId + sessionKey)→ Agent 资源层(按资源挂载、ReAct ± 子 Agent)→ 能力层(工具 + Skills + node.invoke)→ 执行端层(Node/设备);工业里通常会在路由层加入意图识别,其余保持「Agent as Resource + 统一 Gateway + Node 能力」的设计。

补充

1. 这里说的场景:一个 Agent 要调设备(Node)

说的不是「Agent1 调 Agent2」,而是:

  • L4 = 一个 Agent(例如质检 Agent)
  • L6 = Node(设备/系统:PLC、相机、MES…)
  • 场景:Agent 要在一台设备上执行命令(例如在相机 Node 上拍照、在 MES Node 上查工单)

所以:正常业务请求下,是「L4 调用 L6」——一个 Agent 调多台 Node;不是「Agent 调 Agent」。


2. “L4 →(经 L2 转发)→ L6” 在说什么

  • 谁决定「调谁、调什么」?
    L4(Agent)。Agent 在 ReAct 里决定要对哪台 Node、执行什么 command,然后通过工具发起「node.invoke(nodeId, command, params)」。

  • 实际网络/调用路径?
    Agent 跑在 Gateway 侧,没有直连 Node;所以请求是:
    L4 的 tool 代码 → 调 L2(Gateway)的 node.invoke 接口L2 查注册表、把请求转发给 L6(Node) → L6 执行后把结果经 L2 返回给 L4。

所以:

  • 业务上:就是 L4 调用 L6(Agent 调 Node)。
  • 技术上:这次调用必经 L2,即 L4 → L2 → L6,L2 只做转发和策略(鉴权、路由到哪台 Node),不替 L4 做「调谁、调什么」的决策。

你说的「正常链路应该是 L4 调用 L6」——对,就是 L4 调用 L6;补充一点是:这次调用会经过 L2 转发,所以写成「L4 →(经 L2 转发)→ L6」。

高可用

. 设计要点(按你的思路)
用户请求:经 LB 到 Gateway,按 用户 id(或 sessionKey)做会话保持,保证同一用户/会话总打到同一台 Gateway(会话状态在该实例)。
Gateway:注册到注册中心(如 Nacos、Consul、K8s Service + 发现),对外暴露地址列表。
Node:启动时从注册中心拉取当前所有 Gateway 地址,与每一台 Gateway 建一条 WebSocket(或长连);并监听注册中心变更(Gateway 上线/下线),动态增删连接,始终与“当前在线的所有 Gateway”保持连接。
这样:任意一台 Gateway 上跑的 Agent 做 node.invoke 时,目标 Node 一定已经连在这台 Gateway 上,不需要再靠 LB 把“会话”和“Node”路由到同一实例。

注册中心:Gateway 上线/下线要能及时在注册中心反映,Node 用长轮询或 watch 做同步更新(新 Gateway 出现就建连,下线就断连),避免连到已下线的实例。

posted @ 2026-02-21 14:20  向着朝阳  阅读(210)  评论(0)    收藏  举报