
1. 从 RPA 到桌面 Agent为什么我会盯上容器版做了五六年 RPA 实施和运维说实话这两年我心里一直有根刺。影刀、金智维、UiPath 这些工具用起来确实顺手做网页自动化、Excel 表格处理、钉钉消息通知这种固定流程效率是真的高。但每次遇到需求变更比如页面改版、字段增删、审批流调整我都得手动改脚本、重新跑测试。客户一句稍微调一下背后就是半天起步的排查和调整。这种规则写死、变化靠人的模式越来越让人觉得不对劲。直到我最近研究 AI Agent 和容器化方案接触到 Crayfish 和 WorkBuddy 容器版这套组合才突然有种自动化原来还能这么玩的感觉。简单说它把传统 RPA 里最耗人力的流程固化和维护问题换成了自然语言描述目标 模型动态规划 容器隔离执行而桌面操控这块又通过 Crayfish 这样的组件补齐了。也就是说你告诉它帮我把这几份报表合并后发到钉钉群它自己拆解任务、调网页、点按钮、传文件而不是你手动画流程图、逐元素配置选择器。这篇文章我主要写给三类人一是和我一样长期做 RPA 实施的工程师二是在评估要不要从 RPA 迁移到 AI Agent 的技术负责人三是刚接触桌面 Agent、想搞清楚它和 RPA 到底差在哪的入门者。我会从设计思路、容器运行时原理、实操部署、问题排查这几个维度展开尽量把为什么这么设计讲透而不是只列功能清单。2. Agent 容器化的设计思路RPA 脚本写死 vs AI 动态拆解2.1 RPA 的核心问题不是自动化而是规则化我先说个粗糙的比喻。传统 RPA 就像你给一个特别听话但没有脑子的实习生写了份精确到每一步的 SOP他必须按着 SOP 一步步来一旦实际情况和 SOP 对不上就卡住。AI Agent 则更像是一个带了丰富经验的远程助理你告诉他把这周的数据整理一份周报发给我他会自己判断该查哪张表、怎么汇总、用什么格式、发到哪个邮箱。RPA 的灵魂是选择器——通过网页元素的 XPath、CSS 路径、窗口句柄这些硬编码来确定操作对象。这也是 RPA 最大的痛点来源网页一改版路径就失效弹窗一变化流程就中断登录态一过期整个跑批就失败。我维护过的一套电商订单同步流程平均每个月要修两到三次全是这类琐碎问题。而 Agent 的思路完全不同。它通过视觉识别加语义理解来看屏幕通过大模型的推理能力来规划步骤再通过工具调用来执行操作。它不关心按钮的 XPath 是什么只关心页面上有没有一个叫确认订单的按钮。页面改了只要功能还在它大概率就能找到新入口。这种灵活性是传统 RPA 从架构上就很难做到的。2.2 为什么桌面 Agent 需要容器运行时很多人会问Agent 不是装在本地跑就行了为什么要用容器最开始我也这么想。但实际用下来才明白桌面 Agent 有一个非常麻烦的问题——运行环境极其脆弱。一个 Agent 通常依赖 Python 环境、Node.js 运行时、浏览器驱动、各种 SDK 和模型接口。你的系统升级了 Python 版本它可能跑不了你装了个别的软件占用了端口它可能连不上向日葵或者 TeamViewer 的远程控制可能抢占鼠标让 Agent 乱点一气。容器化解决的核心问题其实就是环境一致性。把 Agent 连同它所有依赖、配置、甚至浏览器实例全部打包进一个镜像里无论你在 Ubuntu 还是 CentOS 上跑拉下来就是一套一模一样的运行时。我在本地调试好的环境扔到服务器上不用重新配这是 RPA 时代不敢想的事情。当年我搭影刀机器人服务器光环境就折腾了两天Python、Chrome、驱动版本必须精确匹配稍有偏差就是各种黑屏报错。而且容器把 Agent 的权限隔离做得更干净。WorkBuddy 容器版跑在 Docker 环境里它默认只有容器的访问权限宿主机文件、系统配置都是隔离的。就算 Agent 被恶意指令攻击能造成的破坏也局限在容器内部。这个安全收益在 RPA 里通常要依赖专门的安全模块才做得到。2.3 WorkBuddy 与 Crayfish 的定位区分我从项目资料和实际使用中理解下来这套组合里 WorkBuddy 负责的是大脑和工作台——任务是归它管的技能Skill是归它调的对话交互、计划编排、任务调度都在这一层完成而 Crayfish 更接近手和眼睛负责底层的桌面操控能力比如读取屏幕截图、模拟键鼠操作、识别 UI 元素、执行本地命令。坦白说我第一次看这种分工想到的是 RPA 里的控制台和机器人执行端。WorkBuddy 像是控制台负责任务编排和监控Crayfish 像是执行端负责把指令落到桌面上。但区别在于RPA 控制台和执行端之间传输的是写死的流程包WorkBuddy 和 Crayfish 之间传输的却是目标 上下文。前者是剧本演员必须照着念后者是任务书演员自己现编台词、现走位。这样的分层也带来了一个实际好处如果你已经有一套自己的 Agent 框架只是想补桌面操控能力那单独把 Crayfish 抽出来用就行不需要整套 WorkBuddy。反过来如果你只想用 WorkBuddy 做任务规划、配合其他执行端也完全可以。这种模块化的自由度是传统 RPA 单体架构没有的。3. 核心细节解析容器运行时、桌面操控与技能机制3.1 容器运行时的架构拆解WorkBuddy 容器版的整体结构我画在脑子里大概是这么几层最底层是操作系统宿主机上面是 Docker 引擎再往里是 WorkBuddy 容器容器内部包含 Agent 核心、技能注册中心、模型网关、工具调用模块以及一个内置的浏览器实例。这个浏览器实例很有意思。传统 RPA 通常用 Chrome 加开发者工具协议来控制浏览器而 WorkBuddy 容器版直接在容器里起一个浏览器Agent 通过视觉方式看这个浏览器界面再决定怎么操作。相当于它把浏览器当成一个可以看见的桌面而不是一堆 DOM 节点。好处是对网页的复杂内部结构不敏感坏处是对图像识别和延迟要求更高。容器和宿主机之间的通信主要靠两个通道一个是 API 端口宿主机上写好的任务或者你通过 Web 界面提交的指令通过 HTTP 协议进到容器另一个是挂载卷用来共享宿主机的文件目录这样 Agent 生成的报表、下载的文件才能传到宿主机上。这里必须提一个部署细节。很多第一次装 WorkBuddy 容器版的人会忽略容器内存限制结果 Agent 跑复杂任务时直接 OOM。我建议至少给容器分配 4GB 内存和 2 核 CPU如果你同时要跑视觉模型做页面识别内存最好给到 8GB。这个不是官方硬性要求是我跑了几个真实任务后得出的经验值。3.2 技能Skill和自定义指令Agent 的组件库如果说容器运行时的核心是环境隔离那么 WorkBuddy 最有杀伤力的设计就是技能机制。你可以把技能理解为 Agent 的组件库每一个技能都封装了一个特定能力比如读取网页表格发送钉钉消息汇总 Excel 数据定时触发等。Agent 在执行任务时会根据你的自然语言目标动态选择合适的技能组合。我自己最常用的一套技能组合是钉钉多维表定期同步。因为团队里的日报、库存表都放在钉钉多维表里以前用 RPA 做同步要对齐 API 接口、处理 Token 过期、写异常重试代码几百行。现在我在 WorkBuddy 里建了个技能描述是每两小时读取本地 Excel 的库存表同步到钉钉多维表对应目录并在表格顶部更新时间戳。Agent 会自动处理 Token 刷新和数据格式映射我要做的就是写清楚目标和触发规则。自定义指令则是更轻量级的扩展方式。如果说技能是完整的工具包自定义指令更像是给 Agent 设定一个行动准则和偏好模板。比如我设置了一条指令你在整理周报时要按项目维度汇总先说结论再列明细最后标注风险和下周计划。之后每次让它生成周报它都会自动按这个风格输出。这相当于把你个人的工作习惯固化成了 Agent 的默认行为省掉了每次重复描述需求的时间。3.3 Crayfish 的桌面操控能力Crayfish 这个名字我第一次听还以为是可加辣条的爬虫工具实际是个桌面操控组件。它在设计上借鉴了计算机视觉的思路——通过截取屏幕图像用目标检测模型定位界面元素再模拟键鼠操作。和传统 RPA 的 UI 自动化库相比它最大的特点是对非标准界面的处理能力强。什么叫非标准界面比如一个用 Java Swing 写的老系统、一个用自绘控件做的客户端界面这些在 RPA 里是噩梦因为拿不到元素树选择器根本用不了。我当年处理一个银行老系统的自动录入任务最后是靠图像识别加坐标偏移硬做的非常脆弱屏幕分辨率一变化就全废。Crayfish 的思路是直接看图所以它天然对这类界面有更好的适应力。Crayfish 还支持把桌面操作封装成动作序列。比如双击打开 ExcelCtrlA 全选CtrlC 复制切到目标窗口CtrlV 粘贴这整个流程可以被定义成一个可复用的动作模板供 WorkBuddy 里的 Agent 调用。这个设计类似于 RPA 里的子流程但比子流程更灵活——因为动作之间的衔接和判断由 Agent 的推理能力来动态完成而不是硬编码。3.4 和 RPA 组件生态的对比说到组件就不得不提 RPA 的组件市场。影刀有插件市场、金智维有组件商城里面都是做好的功能模块比如读取 Excel发送邮件调用接口。WorkBuddy 的技能机制和这些在表面上有相似之处但有一个本质区别RPA 组件之间是流式连接的你必须在流程图上画好每个组件的先后顺序而 WorkBuddy 的技能是没有固定顺序的Agent 根据目标现场判断当前该用哪个技能。这个区别在实际使用中的体验差异巨大。我用影刀写一个抓取竞品价格整理 Excel发到微信群的流程要画至少五个组件节点的流程连线还要处理每个节点的参数配置而用 WorkBuddy我只需要说一句每天下午三点抓取这几家电商平台的指定商品价格整理成表格发到微信群。剩下的步骤由 Agent 自己规划和拆分。当然Agent 的执行稳定性还需要观察但这个从流程编排到目标驱动的转变才是真正的代际差异。4. 实操过程记录WorkBuddy 容器版部署与首个技能上线4.1 环境准备与容器部署我目前的主力环境是一台 Ubuntu 22.04 的服务器16G 内存、4 核 CPUDocker 已经装好。如果你用的是 CentOS 或者 Rocky Linux操作也差不多关键就三件事装好 Docker、建好挂载目录、给足容器资源。部署 WorkBuddy 容器版大致分这几步# 1. 拉取镜像以官方仓库路径为例 docker pull workbuddy/container:latest # 2. 创建宿主机数据目录用来挂载存放任务脚本、报表和日志 mkdir -p /opt/workbuddy/data /opt/workbuddy/logs # 3. 启动容器映射 API 端口并挂载数据卷 docker run -d \ --name workbuddy \ -p 8800:8800 \ -v /opt/workbuddy/data:/app/data \ -v /opt/workbuddy/logs:/app/logs \ --memory8g \ --cpus2 \ workbuddy/container:latest # 4. 确认容器正常启动 docker ps | grep workbuddy启动完成后通过浏览器访问http://服务器IP:8800进入 WorkBuddy 工作台。第一次进入需要初始化模型配置这里建议直接把 API Key 配好不然后续技能调用都会失败。配置方式在工作台的系统设置里填模型服务地址和密钥就行支持 OpenAI 兼容接口很多国产模型也能接入。这里我特别提醒一句--memory8g这个参数是我强烈建议你加上的。原因前面说了Agent 在跑复杂任务时要同时处理视觉识别和文本推理内存不足会非常频繁地卡死。我一开始没设内存限制默认容器只吃 2G结果第一个任务跑到一半就 OOM 被 Docker 强制杀掉了日志里全是 Killed 字样。后来加上 8G 限制这类问题再没出现过。4.2 配置第一个技能从自然语言到可执行工具容器跑起来后真正花时间的是配置技能。以我实际部署的竞品价格监控为例完整配置过程是这样的。先在工作台里新建一个技能填写技能名称和描述。这里有一个非常关键的技巧描述一定要写详细告诉 Agent 这个技能在什么时候用、怎么用、有哪些注意事项。比如我写的是当用户需要监控电商平台商品价格时使用本技能。步骤打开目标商品页面提取价格字段与上次记录对比若价格下降超过5%则发送预警消息。Agent 会基于这个描述来决定何时调用技能、如何执行。然后是这个技能涉及的操作脚本。WorkBuddy 支持你把一些固定的操作步骤写成 Python 脚本作为技能的执行体。比如获取网页价格那段我写了一个脚本用 Selenium 打开指定的商品链接通过 CSS 选择器提取价格文本清洗后返回。def fetch_price(url, selector): from selenium import webdriver options webdriver.ChromeOptions() options.add_argument(--headless) driver webdriver.Chrome(optionsoptions) try: driver.get(url) element driver.find_element(css selector, selector) price_text element.text.strip() return {url: url, price: price_text} finally: driver.quit()配置好脚本后测试调用是必须的一步。WorkBuddy 里可以直接选一个技能来做仿真运行把参数填上看返回结果。我第一次测试时返回的价格带了¥符号和逗号后面做数值比较时直接报错。所以在技能脚本里我又加了文本清洗逻辑去掉货币符号和千分位分隔符转换成浮点数再存到列表里。4.3 编写自定义指令规范 Agent 的输出行为技能解决的是能不能做自定义指令解决的是怎么做才符合我的习惯。这个区别我建议所有想用 WorkBuddy 的人都要重视。配置方式很简单在工作台的指令管理里新增一条写好指令内容和生效范围。举个例子。我团队里之前用 RPA 做日报固定要求是按业务线分别汇总每条业务线下先写完成情况、再写待办、最后写风险。以前用影刀我每次都要写一堆格式转换逻辑。现在我用一条自定义指令把这套规则告诉 WorkBuddy生成日报时必须按业务线分组每条业务线下依次列出完成情况、待办事项、风险与对策语言简洁不使用夸张形容词。配置完这条指令后Agent 在生成日报类任务时会自动遵守。我后面甚至把周报的格式偏好也拆成了另一条指令涉及不同文档类型时它自己会选择合适的指令模板。这个机制用熟了以后你会觉得像是给 Agent 装了一套企业级的口头禅和行文规范。4.4 与 Crayfish 联调让 Agent 真正操作本地桌面WorkBuddy 的网页自动化和数据处理能力很强但有些任务必须操作本地桌面比如登录 OA 客户端、操作财务软件、处理某个只在桌面端才能打开的老系统。这时候就需要把 WorkBuddy 和 Crayfish 联动起来。联调的方式不复杂。WorkBuddy 容器版提供了桌面操作类型的技能接口里面可以填 Crayfish 的调用地址。Crayfish 作为宿主机上的一个独立服务运行监听某个端口接收来自容器内 Agent 的操作请求然后通过系统的键鼠事件模拟实际桌面操作。我搭好后测试的第一个任务是打开本地 Excel 文件把第一张表的数据更新为最新库存并另存为新文件名。整个流程是Agent 接收任务 - 调用 Crayfish 打开 Excel - Crayfish 通过截图识别找到对应单元格区域 - 模拟键盘输入新数据 - 保存文件。走到这一步你会真正感觉到桌面 Agent 的威力——它不再只是操作浏览器而是像人一样坐在工位上手把手操作电脑。4.5 调度任务替代传统 RPA 的定时触发调度是 RPA 的强项WorkBuddy 也支持而且配置更简单。在工作台的任务管理里可以创建定时任务选择对应的技能和指令设定 cron 表达式或简单的时间规则。比如我设置了每天 09:00 和 18:00 各执行一次竞品价格监控。实际用下来WorkBuddy 的调度逻辑和 RPA 有一点不同RPA 是严格的时间点触发到点就跑不管有没有异常WorkBuddy 可以在技能描述里加如果网络异常则等待 5 分钟重试最多重试 3 次这类自然语言描述Agent 会自动执行重试逻辑。对你没看错——容错策略也能用自然语言写这比 RPA 里配置重试次数、等待时长的参数窗口直观多了。5. 常见问题与排查技巧实录5.1 容器启动慢和网络连接失败根据网上不少人反馈的WorkBuddy 启动非常慢和网络连接失败问题我实际排查下来基本是三类原因。第一类是镜像拉取慢。WorkBuddy 镜像里打包了 Python 运行时、Node.js、浏览器实例、各种依赖库体积动辄几个 GB。国内环境下拉镜像确实慢这个建议用镜像加速器或者提前下载好镜像导出导入能省不少时间。第二类是容器启动后要初始化模型网关和技能注册中心这个初始化过程在低配机器上可能要 1 到 3 分钟。很多人看到日志没输出就以为启动失败其实只要日志里没有报错堆栈耐心等一下就好。我建议用docker logs -f workbuddy观察日志输出不要凭感觉判断。第三类是网络连接失败。如果是宿主机能上网但容器里不行大概率是容器 DNS 配置问题。在启动参数里加上--dns 223.5.5.5或改用 host 网络模式就能解决。如果是 WorkBuddy 连不上模型服务检查 API Key 和接口地址是不是配置正确尤其要注意模型服务的地址在容器内部能访问到不能写localhost要写宿主机 IP。5.2 桌面操控失败的排查思路使用 Crayfish 做桌面操控时最容易遇到两类问题一是键鼠动作没触发二是识别到了元素但点击位置偏移。键鼠动作没触发先看 Crayfish 服务日志确认请求有没有到。如果日志正常但动作没生效很可能是权限问题——Linux 下模拟键鼠事件需要访问输入设备节点普通用户可能没有权限。解决办法是给运行 Crayfish 的用户加入input组或者给相应设备节点设置权限。点击位置偏移这个说起来更像是玄学但核心原因无非是屏幕缩放比例和分辨率变化。Crayfish 做元素定位时依赖截图分析如果宿主机的屏幕缩放是 125% 或 150%坐标换算就容易出偏差。我在 Ubuntu 上直接把缩放设成 100%之后再没遇到过偏移问题。如果是远程桌面场景注意连接分辨率要固定不要每次连上去分辨率都不一样。5.3 从影刀 RPA 迁移时容易踩的坑最后聊聊从影刀这类传统 RPA 迁移到 WorkBuddy 容器版有哪些容易忽略的地方。第一个坑是流程逻辑不能直接平移。RPA 脚本里那种点击按钮A-检查页面B-输入数据C的顺序逻辑你需要先翻译成文字描述再交给 Agent 重新拆分执行。这不是简单的脚本转描述而是要把你的业务目标、判断标准、异常处理策略都说明白。第二个坑是数据存储依赖。RPA 项目里常用本地 Excel 或数据库记录运行状态迁移到 Agent 后这些事情更适合交给 WorkBuddy 的挂载卷来处理。我建议容器里所有需要持久化的数据都写到/app/data目录下方便备份和迁移。第三个坑是验收标准要对齐。RPA 是确定性的跑十次结果都一样Agent 因为有模型参与可能每次执行路径略有不同偶尔还会出现识别不确定的情况。所以迁移后验收标准要从过程必须一致调整为结果必须正确。我见过有人拿 RPA 的标准验收 Agent结果因为 Agent 换了一种更高效的执行路径而被判定为不规范流程这其实是需求定义的问题。6. 相对 RPA 的真实优势一张表看透本质聊了这么多实操细节是时候回到最初的问题Crayfish 和 WorkBuddy 容器版这套桌面 Agent 方案相比 RPA 的真实优势到底是什么我觉得可以从 8 个维度来对比这里整理成一张表对比维度传统 RPA桌面 AgentWorkBuddy Crayfish流程定义方式画流程图、配置组件自然语言描述目标Agent 动态规划界面适配能力依赖元素选择器页面改版即失效视觉识别 语义理解界面变化容忍度高运行环境依赖本机完整环境迁移成本高容器打包环境一致性 100% 可复制异常处理需要人工配置重试、捕获规则自然语言描述容错策略Agent 自决策技能扩展组件市场需按组件接口拼装技能机制一个技能封装完整能力可动态调用部署形态每台电脑装客户端集中管控复杂容器化一台服务器跑多个实例跨系统操作依赖系统接口和驱动老系统难处理视觉驱动兼容各类界面人工参与度开发和维护都是高成本人力活把做什么交给用户把怎么做交给 Agent6.1 最大的优势从规则化到目标化说到底RPA 把自动化建立在对界面规则的精确描述上Agent 把自动化建立在对目标的理解和拆解上。这个底层区别决定了上层的一切能力差异。RPA 适合需求变化极少、执行路径完全固定的流程Agent 适合需求有变化、场景复杂、需要一定灵活性的工作。这个优势在维护成本上尤其明显。我维护 RPA 流程的日常工作是修——修选择器、修异常、修版本兼容维护 Agent 任务的日常工作是聊——告诉它业务变化了给它补充一些规则让它重新调整执行方式。前者是被动响应问题后者是主动优化效率。6.2 什么场景下 RPA 依然够用但我不是劝大家把所有 RPA 都扔了。如果你的流程完全标准化比如每天定时从某个系统导出 Excel、处理后传到另一个系统三五年都不会变那 RPA 依然是最经济的选择——确定性高、资源占用小、执行速度快。Agent 的优势是灵活但灵活往往意味着更大的计算资源开销和更不可控的 Token 消耗。所以更务实的策略是混合使用核心的、稳定的、高合规要求的流程继续让 RPA 跑非结构化的、需要决策的、频繁变化的任务交给 Agent。这也是我目前项目里的实际做法两者不是替代关系而是互补关系。6.3 未来演进Agent 会吃掉大部分 RPA 工作我个人有个判断未来两三年RPA 这个岗位的定义会发生很大变化。以前 RPA 工程师的核心技能是写脚本、配选择器、调稳定性未来可能变成 Agent 编排师——把业务需求翻译成 Agent 能理解的目标和约束管理好技能库和指令库持续优化 Agent 的执行质量。Crayfish 和 WorkBuddy 容器版这样的组合恰恰是这种演进方向的第一批实际落地。我在实际使用中最大的体会是别把 Agent 当 RPA 去用。它不是一个影子化脚本工具而是一个能和你协作的虚拟员工。你花在理解 Agent 思维方式和配置技能上的时间会让你在长远维度获得比 RPA 大得多的回报。但同样的也别神化 Agent它依然需要人来定义目标、校正行为、兜底异常。真正最有价值的永远是那个能把 RPA 的确定性和 Agent 的灵活性结合起来的工程师。