从RPA到桌面Agent:容器化智能自动化的实践与选型

发布时间:2026/9/16 1:57:02
从RPA到桌面Agent:容器化智能自动化的实践与选型 做了三年影刀RPA接过电商订单、走过Excel报表自动化、也写过一堆网页数据采集流程。说实话这套东西在固定规则下非常能打。但今年上半年开始客户那边需求变了——不再是要严格按步骤执行的规则脚本而是希望机器人拿到任务后能自己判断这个字段该填哪里这封邮件该怎么回。这让我不得不重新审视Agent类工具的定位。正好最近把WorkBuddy容器版和桌面Agent执行层Crayfish完整跑了一遍体验之后最大的感受是它们和RPA压根不是一类东西硬要对比格局就小了。这篇文章不打算做产品宣传只以一个实践者的视角拆解三件事WorkBuddy容器版到底解决了什么问题、Crayfish在桌面Agent体系里扮演什么角色、以及容器化给自动化带来的那些RPA给不了的真实优势。1. 从影刀迁移到 WorkBuddy 容器版先说清楚我在对比什么1.1 我原本的 RPA 工作方式之前做电商场景影刀用得最多。典型任务长这样定时从商家后台导出订单Excel按店铺拆分再逐条填写到ERP系统。这套流程在影刀里是这样实现的写一个流程块用元素选择器绑定网页按钮位置用循环读取Excel每一行最后通过填写输入框指令把数据填进去。流程稳定运行效率高出问题也有明确的日志可以追踪。但最大的痛点在于任何一次页面改版任何一次字段增加都需要人工重新标注元素定位。这还只是维护成本真正让我头疼的是客户偶尔会提出一些看着流程自己临场变通一下的需求这在传统RPA里根本写不出来。1.2 WorkBuddy 容器版是什么WorkBuddy 这个名字在Agent工具圈已经不算陌生。简单说它是一个以大语言模型为核心驱动的桌面Agent应用框架你不需要写死每一步操作而是用自然语言描述目标WorkBuddy负责把目标拆解成可执行步骤并调用相应的工具/Skill去完成。所谓容器版就是把这套Agent核心跑在Docker等容器运行时里不再依赖本机图形界面。它和你直接安装一个WorkBuddy桌面客户端有本质区别桌面客户端偏向单机交互像个能用对话控制电脑的助手容器版则强调的是服务化能力——通过API通信、支持多实例编排、可以嵌入到企业系统里当数字员工的后端大脑。1.3 Crayfish 在体系里的位置标题里提到了Crayfish这名字初看容易让人以为又是一个独立Agent实际跑下来我倒觉得它更像Agent体系里的手——一个桌面执行运行时。它独立运行在宿主机或者有桌面环境的容器里负责屏幕识别、窗口管理、鼠标键盘模拟、剪贴板读写、文件系统操作这些接地气的命令。这里有个关键设计值得展开WorkBuddy容器版做决策Crayfish做动作。决策层不关心按钮在屏幕哪个坐标它只需要说点击确定按钮Crayfish负责在桌面环境中找到并执行这个动作。两层通过本地HTTP或WebSocket通信任务队列在中间调度。这样设计带来的好处非常明显Agent核心可以跑在无头服务器上而执行层可以分布在多台桌面机器上二者各自独立扩展。这套架构和传统RPA那种脚本录制器中央调度平台的思路已经完全不是一个维度。2. Crayfish 与 WorkBuddy 的两层分工Agent 大脑为什么必须和桌面操作解耦2.1 大模型不应该直接握鼠标一开始我也困惑既然大模型啥都能干为什么不让WorkBuddy直接操作界面非要中间隔一层Crayfish在跑通一个填表任务后我就明白了。让大模型直接输出鼠标坐标等于让一个读了很多书但没练过手的实习生直接做外科手术——逻辑上能推理出应该点哪里但手会抖点不准而且每次点击的像素坐标根本不可控。Crayfish这层解决的就是这个落差模型只输出语义化指令比如element:text提交按钮 clickCrayfish通过视觉识别和目标检测定位真实坐标再模拟鼠标完成操作。2.2 两层协作的具体流程我这里用实际跑过的把Excel里的数据填到ERP表单拆解一下WorkBuddy容器版收到任务描述把 orders.xlsx 里的前10行数据填入ERP采购单页面。WorkBuddy调用模型进行任务分解得到子步骤清单读取Excel-打开ERP页面-定位采购单控件-填数据-核对-保存。每个子步骤再映射到对应的Skill。读取Excel有现成的pandas技能包打开页面由Crayfish执行浏览器窗口唤起定位控件这一步Crayfish截取屏幕图片经过OCR把界面元素转成带坐标的文本树Agent根据语义判断哪个是供应商编号输入框。Crayfish执行填入动作完成后截屏回传WorkBuddy再次调模型判断是否填写正确。2.3 为什么说这是语义化界面传统RPA靠的是DOM选择器、窗口句柄、坐标偏移本质上是个物理定位器Crayfish这一层做的事情更高级——它把屏幕信息先转成人话变成Agent能理解的结构化数据再让模型基于语义去决定动作。说得夸张一点RPA看到的是像素Agent理解的是含义。这正好是桌面Agent相对RPA鲁棒性大幅提升的核心原因页面布局调整了选择器失效RPA脚本直接崩溃而Agent看到一个写着提交的按钮不管它在页面顶部还是底部都能正常点击。两层协作的架构也带来了一个隐性好处Agent策略层可以升级迭代而执行层保持稳定。今天我接的是DeepSeek明天想换别的模型只需要改WorkBuddy侧的模型配置Crayfish毫无感知。相对RPA那种流程和界面强绑定的模式这种解耦让整体系统在技术演进面前更有韧性。3. 容器运行时到底解决了什么环境隔离、模型接入、并发编排与最容易被忽略的隐患3.1 为什么非要在容器里跑作为一个常年被Windows环境折腾的RPA开发者我第一次看到WorkBuddy容器版时的第一反应是这不就是脱裤子放屁吗直接在服务器上装个程序跑不就行了直到自己部署过一遍才理解容器化不是形式主义而是切切实实解决了几类具体问题。首先是环境隔离。WorkBuddy容器版要跑Python依赖、OCR模型、浏览器内核、向量数据库还有各种Skill相关的第三方库。这些组件放在一起来安装版本冲突能让人崩溃——一个Skill要Python3.10另一个要3.8pip依赖直接打架。容器化之后每个实例内部的环境是自包含的互不干扰想换版本直接重新build镜像就行。其次是模型接入的灵活性。以我接DeepSeek为例只需要在容器启动时通过环境变量配置API Key、Base URL、模型名称WorkBuddy容器版的模型网关会统一转发请求。因为Agent调用模型是走标准OpenAI兼容协议所以换模型就像换个环境变量一样简单。这比起RPA工具商绑定自家AI能力开放度完全不是一个级别。3.2 多实例编排数字员工可以横向扩展RPA时代做并发有个很现实的问题一个机器人实例需要一整个Windows虚拟机资源License费用还不便宜。WorkBuddy容器版在这方面有明显优势——既然Agent核心是无状态的那就可以通过Docker Compose或者Kubernetes同时拉起多个容器实例每个实例对接不同的Skill配置处理不同业务线。我在测试环境用一台4核8G的Linux服务器跑了两套WorkBuddy容器实例一套对接电商订单处理一套对接财务对账任务。两个实例互不相干各自独立扩缩容。API层再挂一个简单的负载均衡基本就能当一个小型自动化平台用。这种感觉确实是传统RPA体系给不了的。3.3 部署踩坑容器没有显示服务器Crayfish按不下去按钮不过这段标题里提到的容器运行时真的不是开水一冲就能喝。我把WorkBuddy容器版跑起来后第一次让Agent执行打开浏览器的操作日志里直接报错无法找到DISPLAY环境变量。这是Linux容器最常见的坑——容器默认是没有X11图形显示能力的而Crayfish要操作GUI应用必须依赖一个显示服务器。我的解决方案比较直接如果WorkBuddy和Crayfish都跑在宿主机上就把宿主机的 /tmp/.X11-unix 目录挂载进容器并设置 DISPLAY 环境变量指向宿主机当前显示会话。但需要注意这种方案只适合单机测试。如果是纯服务器环境就干脆让Crayfish独立部署在一台带桌面环境的机器上WorkBuddy容器版通过API远程下发指令。这两种模式的取舍后面细说。还有两个细节也特别容易掉坑。一是容器里默认没有中文字体OCR识别中文界面直接乱码后来在宿主机安装了fonts-noto-cjk再挂载进容器才把识别准确率提上来。二是时区和locale问题容器默认是UTC生成的日志时间和我本机差8小时排查问题的时候非常迷惑必须在Dockerfile里提前设置TZAsia/Shanghai。3.4 WorkBuddy 启动慢的排查网上很多人反馈WorkBuddy启动非常慢我一开始也遇到了。分析日志后发现慢的核心原因是容器启动时要做模型预热、加载向量索引、初始化OCR模型这些加起来可能占用二三十秒。解决方案分两头第一是在镜像里预下载模型文件不要等运行时再拉取第二是把健康检查的超时时间调大别让编排平台在容器还没就绪时就判定失败重启。这里分享一个最典型的docker-compose配置片段跑的是WorkBuddy核心服务加Crayfish执行器services: workbuddy: image: workbuddy-container:latest container_name: workbuddy-brain environment: - DISPLAY:0 - TZAsia/Shanghai - LLM_API_KEY${DEEPSEEK_API_KEY} - LLM_BASE_URLhttps://api.deepseek.com/v1 - LLM_MODELdeepseek-chat volumes: - /tmp/.X11-unix:/tmp/.X11-unix - /workspace/skills:/app/skills - /workspace/models:/app/models ports: - 8080:8080 healthcheck: test: [CMD, curl, -f, http://localhost:8080/healthz] interval: 15s timeout: 10s retries: 20 start_period: 60s crayfish: image: crayfish-desktop-runtime:latest container_name: crayfish-hands environment: - TZAsia/Shanghai - WORKBUDDY_ENDPOINThttp://workbuddy:8080 volumes: - /tmp/.X11-unix:/tmp/.X11-unix - /dev/shm:/dev/shm depends_on: workbuddy: condition: service_healthy注意里面/dev/shm的挂载也不能省Chromium之类的浏览器内核在容器里对共享内存大小极其敏感不挂载大一点的/dev/shm页面截图功能会随机失败。4. 桌面 Agent 相对 RPA 的真实优势从录脚本到理解任务4.1 需求描述成本大幅下降做RPA项目最痛苦的阶段不是开发而是前期沟通。业务部门说帮我自动整理报表你得追着问几十个问题什么格式的报表来源系统是哪个字段对应关系是什么样的异常怎么处理这套需求澄清流程周期长而且业务人员的描述和开发人员的理解之间经常有偏差。桌面Agent把这道鸿沟填平了。同样是帮我整理报表你可以直接告诉WorkBuddy每周五下午5点把运营后台的销售数据整理成Excel按地区和产品线分别汇总发到指定邮箱。Agent会把这句话解析成任务清单执行过程中遇到歧义还会主动提问或者按最合理的常识默认处理。Agent不是让你写需求而是让你说需求。对非技术背景的业务用户来说这几乎是降维打击。4.2 鲁棒性的底层逻辑不同传统RPA处理页面变化的第一道防线是元素选择器页面结构一变脚本立刻失灵。有经验的开发者会写一堆异常处理逻辑比如元素不存在时尝试备用定位器再不行就截图报警。但这都是事前防御永远有覆盖不到的情况。桌面Agent的思路完全不同。它不关心元素在DOM树里的绝对位置它靠语义理解工作。表单提交按钮位置变了没关系Agent通过Crayfish截图看到页面有一个包含提交语义的按钮依然能正常点击。下拉框选项被重构了只要文本语义还在Agent就能重新匹配。这种鲁棒性不是靠代码堆出来的而是靠语言模型的理解能力天然带来的。我在迁移一个旧的影刀脚本时旧脚本动不动就因页面更新而失败而WorkBuddy跑类似任务时即使页面有轻微改版也能继续推进。4.3 Skill 机制让经验变成可复用的资产用过影刀的人都知道影刀有应用市场和组件库可以下载别人封装好的流程模块。但RPA组件的复用粒度太重经常要跟着具体业务场景走换一个系统就废了。Skill机制不一样它的定位是一项独立能力。我写好一个PDF转Excel的Skill它就是一个能处理任意PDF文件的原子能力我写好一个网页内容摘要的Skill它就能被所有需要摘要的任务引用。这种方式天然适合团队积累内部知识库。RPA时代团队沉淀的是某张表的填法Agent时代沉淀的是某项能力的用法后者的可迁移性强太多。4.4 人机协作模式更透明还有一点Agent在执行过程中会生成自然语言解释我正在打开销售报表页面检测到表格数据共120行Excel文件已生成。你随时可以打断它、纠正它、补充新要求。传统RPA跑起来就是个黑盒中途想改条件只能停了改脚本再重跑代价极大。这种透明性带来的不仅是效率更是信任感尤其是面对非技术管理者时看得懂的Agent远比神秘的自动化脚本更容易在组织里推广。4.5 代价也要讲清楚但必须泼一盆冷水桌面Agent并不是免费的午餐。模型调用有延迟、有成本每一步决策都伴随着不确定性需要完善的验证机制。不稳定的网络可能导致模型调用失败OCR识别错误可能导致点错位置这些都需要额外的重试策略和人工兜底设计。相较之下RPA脚本一旦调试通过执行效率极高性能稳定适合大规模、高频、固定规则的重复操作。所以我的结论是桌面Agent不是来取代RPA的它和RPA解决的是不同层面的问题。RPA解决怎么稳定地做桌面Agent解决怎么做才聪明。两者在未来会被整合进同一个自动化平台里各司其职。5. 实操WorkBuddy 容器版跑通第一个 Skill接入 DeepSeek5.1 环境准备与架构选型实操部分我以一台Ubuntu 22.04服务器为例环境要求如下Docker Engine 20.10CPU 4核以上、内存8G以上跑Agent核心需要如果有GPU更好宿主机或同网络内一台带桌面环境的机器用于部署Crayfish执行桌面操作部署模式我选用容器里跑WorkBuddy核心 宿主机跑Crayfish的混合方案。原因是纯容器模式下Crayfish需要额外配置VNC虚拟显示运维复杂度高而混合模式既保留了容器化的模型调度优势又避免图形环境折磨。5.2 配置模型接入WorkBuddy容器版通过标准OpenAI兼容协议访问模型服务所以DeepSeek的接入非常直接export DEEPSEEK_API_KEYsk-你的key export LLM_BASE_URLhttps://api.deepseek.com/v1 export LLM_MODELdeepseek-chat这段配置加在docker-compose环境变量里即可。接入后WorkBuddy会自动把任务拆解、工具调用、结果校验这些环节的模型请求统一转发到DeepSeek。这一步是整个体系中技术含量最低但最容易出错的环节——很多人的API Key配置完不生效往往是没注意Base URL末尾的/v1路径DeepSeek兼容OpenAI协议对这个路径有要求。5.3 注册第一个 Skill从PDF提取表格并输出ExcelSkill本质上是一段带有输入输出定义的代码片段WorkBuddy会在任务需要时按描述自动匹配调用。这里写一个示例将PDF里的表格提取后转成Excelfrom pathlib import Path import pdfplumber import pandas as pd def run(input_path: str, output_path: str output.xlsx): tables [] with pdfplumber.open(input_path) as pdf: for page in pdf.pages: for table in page.extract_tables(): if table: tables.append(table) if not tables: return {status: no_table_found} # 取表头数据 header tables[0][0] rows [] for t in tables: rows.extend(t[1:]) df pd.DataFrame(rows, columnsheader) df.to_excel(output_path, indexFalse) return {status: ok, output: str(Path(output_path).resolve())}把这个文件放到容器挂载的/workspace/skills/pdf_to_excel.py目录再配一个Skill描述文件声明技能名称、功能描述、输入参数格式即可。WorkBuddy会在Agent规划任务时根据提取PDF表格这个语义描述自动关联到这个Skill。5.4 通过API触发任务容器版的价值就在API交互上。任务触发接口很简单一行curl就能搞定curl -X POST http://localhost:8080/api/v1/tasks \ -H Content-Type: application/json \ -d { task: 读取 /data/订货单.pdf 中的表格整理成Excel后保存到 /data/result.xlsx, skills: [pdf_to_excel] }返回任务ID然后轮询任务状态接口即可。跑完去目录里确认输出文件整个过程没有打开任何界面纯服务端执行——这对需要嵌入到现有业务系统的场景来说是非常关键的能力。5.5 常见错误排查清单把部署过程中踩过的坑整理成一张表后面看到类似的直接对号入座现象可能原因处理方式Agent提示找不到模型Base URL拼写错误检查是否带上/v1确认API Key有权限OCR识别乱码容器缺少中文字体挂载fonts-noto-cjk重启容器Crayfish无法点击容器无桌面授权挂载X11 socket设置DISPLAY任务一直排队健康检查未就绪调大start_period预加载模型页面截图空白/dev/shm太小挂载大容量/dev/shm进容器这五条基本覆盖了从零到第一个任务跑通的全过程。如果一次性全对上剩下的就是业务逻辑层面的打磨了。6. 三类自动化场景三种不同的选型答案6.1 场景一财务对账、人事自动处理这类固定流程这类任务特征是流程严格固定、涉及时序审计、不允许自由发挥。比如财务每月的银行对账每一笔勾稽逻辑都有明确规则做错一笔要出大问题。这种场景我会明确推荐继续用影刀、UiPath这类成熟RPA产品。理由很直接规则明确、重复度高、审计要求严格RPA的确定性就是它最大的优势。脚本一旦调试通过每一次执行都可以预测出现问题可以复现不会出现模型今天状态不好所以跑偏了这种玄学问题。在影刀里做一个对账Agent流程是死的下载银行流水-读取系统订单-逐笔匹配-输出差异Excel。用RPA写得清清楚楚运行又快又稳完全没必要上Agent。6.2 场景二跨系统数据搬运、重组、轻度判断这类任务在电商运营、销售支持、市场分析里面特别常见。比如从CRM导出客户数据结合社交媒体信息做客户画像分类再推送个性化跟进话术。这里面有分类判断生成内容的成分传统RPA写起来痛苦Agent做起来顺理成章。我实际测过一个场景每天早上从三个业务后台抓数据合并去重后按客户类别生成针对性通知文案。RPA要写判断逻辑和文案模板工作量巨大WorkBuddy只需要一个自然语言任务描述Agent自动调用数据读取Skill用模型生成文案再由Crayfish打开IM工具发送。这种数据判断生成的复合任务就是桌面Agent的主场。6.3 场景三混合模式——RPA做动作Agent做决策我个人最看好的形态是混合架构RPA引擎负责稳定、高频、精确的原子操作Agent负责任务理解、规划、异常处理和自然语言交互。比如一个电商订单处理系统Agent接收订单消息理解业务语义判断是否属于异常订单正常订单调用RPA流程完成标准处理流程遇到异常情况Agent不依赖固定分支而是根据当前数据自己决定是用备用流程还是转人工。这种架构下RPA保证了下限稳定Agent拉高了上限智能。两个系统通过API桥接Agent发指令给RPA执行RPA把结果回传给Agent判断。成本可控、风险可控、性能也可控。6.4 你的团队应该怎么选选型时我建议你用下面这个清单快速判断任务规则是否频繁变更如果每月都有逻辑调整Agent的语义处理优势更明显。是否需要自然语言输出要写回复、写摘要、写报告直接锁定Agent。是否有严格的执行审计要求票证、金融、医疗类场景RPA更稳妥。团队技术栈如何如果以Python为主Agent生态上手更快如果以低代码拖拽为主RPA更友好。成本敏感度如何高频高并发固定任务用RPA成本更低低频灵活任务用Agent的边际成本几乎为零。单个任务里如果混合了多种特征就按6.3的思路做混合架构不要在单一平台里硬塞所有需求。7. 最后关于容器化这件事再多说几句从影刀到WorkBuddy容器版这一路折腾下来我最大的收获不是某个工具好不好用而是意识到自动化行业的底层逻辑正在换以前我们写的是怎么做的说明书现在只需要表达要什么结果。容器化让Agent可以像微服务一样被编排、调度、观测这让数字员工这个概念第一次真正变得可落地、可量化和可横向扩展。如果你现在正打算从零接触桌面Agent我的建议是先别急着上容器版花两天时间在桌面客户端把Skill机制和任务拆解逻辑跑通理解Agent是怎么思考的再迁移到容器版把API接好把环境变量管好把模型接对。等到容器版运行稳定了你才会真正体会到那套决策与执行分离架构的妙处。踩过几次坑之后回过头来看RPA和桌面Agent之间的关系更像是算盘和计算器——算盘在特定场景下依然精准可靠但计算器能做的事情早已超出了算数本身。把两者都握在手里才是当下自动化从业者比较务实的姿势。