
从2024年我开始把大量重复性业务从人工操作改成脚本再慢慢引入AI Agent参与流程前后折腾了不少项目。真正让我意识到“编排层”是个独立问题的是一个叫Paperclip的项目——它的定位写得很直白给所谓“无人公司”提供一层可运行、可观察、可回滚的业务编排基础设施。说白了就是把原来靠人盯着的业务流程拆成一段段可执行的状态流用统一的引擎去调度让AI、定时任务、人工审批、外部API能在一套体系里协同工作而不是像过去那样靠一堆脚本四处串联。这篇文章不聊“无人公司”是不是真的能做到没有一个人因为至少在目前的技术条件下纯无人运营还是不现实。Paperclip的思路更务实把公司里那些确定性极高、重复度极高的环节交给系统把少量的关键决策点仍然保留给人只是在编排层把“人”也当作一个特殊的执行节点来管理。这样一个架构能够同时减少人力投入也保留足够的控制力。下面我会从我实际调研和使用这套思路的经验出发把它拆开讲清楚适合正在做AI Agent落地、自动化运营、或者想把手头工作流系统化的朋友参考。1. 先搞清楚“无人公司”缺的到底是什么1.1 无人公司不是没有人而是人只做关键决策很多人一听到“无人公司”脑子里先浮现出一个完全没有员工的空办公室这种画面感很强但方向是错的。真实情况更接近“自动驾驶分级”系统负责绝大多数路况判断但遇到极端场景还是要把控制权交给人。一家公司要跑起来涉及市场、产品、研发、客服、财务各个角色现阶段想全部交给大模型自动完成既不安全也不经济更别说还有法律风险在里面。所以Paperclip这种编排层的存在核心问题不是“让AI代替所有人”而是把业务流程中可固化的部分固化下来让人从过程执行里解放出来只在一个个审批点、异常点、策略变更点上做决策。比如内容发布流程里AI可以负责选题和草稿但最终点击发布之前负责人还需要看一眼文案有没有违规、数据有没有造假。这个“看一眼”的动作在编排层里就是一个特殊节点它不占用人的日常精力只在需要时把事件推过来。这种设计带来两个直接好处。第一是流程稳定性提高了因为每个节点都有明确的输入输出和成功失败标准不会再出现“这事今天忘了”的情况。第二是决策质量提高了人被放在关键卡口上看到的是系统汇总后的完整上下文而不是一堆分散的聊天记录和邮件。1.2 为什么靠一堆脚本拼起来撑不住那有人会问我写十个Python脚本用crontab定时跑不也能实现自动化吗在小规模场景下确实可以但一旦流程跨越多个系统、涉及多个人工审核环节、需要处理失败重试和并发账目时脚本方案就很容易崩。我自己以前试过用脚本串联多个API先跑一个爬虫脚本再跑一个LLM调用脚本最后再发一封通知邮件。看起来每个脚本都很简单但真正运行起来问题成堆。第一个问题是状态散落脚本A执行完结果存在本地文件里脚本B读的时候可能文件还没写完于是隔三岔五出现空数据。第二个问题是失败不可观测脚本C挂了不会有人主动知道除非第二天看邮件发现没发出去。第三个问题更难搞流程一旦需要改变中间某一步你得改好几个脚本的调用关系牵一发而动全身。编排层的意义就在这它把流程定义从代码里抽离出来变成一份描述性的工作流文件。执行引擎负责状态持久化、失败重试、并发控制、事件通知。这样流程调整就不需要翻代码改配置就行而且中间每一步都有日志可查、有状态可溯。这也是Paperclip这种项目存在的最底层逻辑。2. Paperclip的定位与核心设计2.1 编排层到底管哪些事如果只用一个词概括编排层的职责我会选“状态管理”。Paperclip围绕状态做了一系列设计可以拆成五个核心模块来理解。第一个是工作流定义用声明式的方式描述一个业务从头到尾要经过哪些步骤每个步骤依赖什么输入超时怎么处理。第二个是执行引擎负责把定义变成实际运行的任务它维护每个实例的当前状态并驱动状态迁移。第三个是任务调度包括定时触发、Webhook触发、手动触发以及对各步骤的并发和优先级控制。第四个是重试与补偿机制单步失败时按照策略重试重试仍失败则执行备用分支或者调人工异常处理。第五个是可观测性记录每个实例在每个节点上的开始时间、结束时间、输入输出快照、错误堆栈方便后续回放和调试。这五个模块合在一起编排层才真正称得上“公司的操作系统”。它不关心你的业务逻辑具体怎么写只负责保证业务逻辑按照你定义的方式可靠地执行。类比一下它就是交通指挥中心红灯绿灯的切换规则是固定的至于每辆车装什么货、送到哪那不是它该管的事。2.2 事件驱动加DAG两条腿走路在选型的时候很多人会纠结到底用事件驱动架构还是用DAG任务依赖模型。这两个概念听着高大上实际区别并不难理解。DAG适合描述有明确依赖关系的任务图A完成后必须B先执行C才能开始比如先写文案再配图。事件驱动则更适合那些没有固定顺序、靠消息触发异步处理的场景比如用户下单后触发一堆后续服务。Paperclip在设计上比较聪明的一点是两者都要而不是二选一。核心工作流可以用DAG定义保证依赖关系清晰、状态可视化节点之间的通信则采用事件机制允许异步等待外部回调。这样既保留了流程编排的可读性也给集成外部系统留出了弹性空间。举个实际例子我在跑内容流水线的时候工作流里有一个节点是“等待小红书审核结果”这个节点不是立刻完成的它需要调用外部接口然后挂起等对方回调。如果用单纯的DAG模型节点要么被当成失败要么就得反复轮询。而事件驱动能很好地处理这种情况节点注册一个回调然后把自己挂起直到事件到达再恢复。这种长时挂起加回调的模式在真实业务场景里实在太常用了。2.3 状态机是整个架构的基石编排层要稳健底层必须有一张清晰的状态迁移表。Paperclip把每个工作流实例定义成几种基础状态待执行、执行中、等待外部事件、成功、失败、被取消。每个节点实例也有自己的状态节点状态组合起来形成工作流状态。这个设计不算新但要落地做好需要约束住几个边界。一个边界是重复事件的幂等性。同一个Webhook回调如果由于网络重发到达两次系统不能把节点状态从“等待中”改成“已完成”两次否则就会触发后续节点重复执行。解决办法是给每个外部事件一个唯一标识并在状态迁移前做校验。另一个边界是超时和状态冲突。节点还在等待事件但流程级超时已经到了这时候引擎要把所有挂起的节点强制打成“超时失败”并且不再接受该流程实例后续的任何事件回调。我在实际测试Paperclip时就见过因为忘了处理这个边界的尴尬场面节点明明已经被超时终止了事件来了又把状态改了回来导致后续重新跑了一遍发布逻辑。3. 实战从零搭一条“无人运营”的业务流3.1 先选定场景并拆解业务环节纸上谈兵说了不少现在落到实际操作。我想搭一条尽可能接近“无人公司”的内容自动发布流水线这个场景以现在的技术完全能跑起来。业务拆解一下就是五个环节自动选题、调用AI生成初稿、人工审核、定时发布、数据回收。选题环节让AI基于历史内容和热点词生成一个标题候选列表然后由预设规则筛选一条得分最高的生成初稿环节调用LLM的API限定好字数和风格要求人工审核是保留的唯一人工节点负责人需要在系统里确认文案合规发布环节调用博客平台的发布接口数据回收则在一个小时后再抓取阅读数据并归档到数据库。这五步从逻辑上是一个典型的串行工作流中间只有人工审核一步需要外部介入。难度不大但足够说明编排放的实际运转方式。3.2 用声明式文件定义工作流Paperclip给我最直观的感受是定义工作流更像写配置文件而不是写程序。我用类YAML的格式把上面五个环节描述出来内容大体是这样name: auto_content_pipeline version: 1 triggers: - cron: 0 9 * * * steps: - id: generate_topics type: agent node: topic_agent timeout: 120s - id: generate_draft type: agent node: writer_agent input: ${generate_topics.output} timeout: 300s - id: human_review type: approval assignees: [ops] timeout: 24h - id: publish type: http method: POST url: https://api.blog.example.com/v1/posts body: ${generate_draft.output.published} on_approval_of: human_review retry: 3 timeout: 60s - id: collect_stats type: http method: GET url: https://api.blog.example.com/v1/stats/${publish.output.post_id} delay: 1h timeout: 30s这里有个细节值得展开${generate_topics.output}这种引用语法看起来简单但引擎在背后要做的事情是把上游节点的输出结构体完整缓存下来等下游节点真正执行的时候再注入。也就是说每个节点输出都会被序列化持久化这样即使下游节点因为故障重启了也能从存储里拿到原有数据而不是丢丢空。人工审核节点是这套流程中最特殊的。它不是一个能在几秒内返回结果的函数调用而是要等待一个真实的人去操作。我习惯把它的超时时间设置成24小时同时配置一个提醒机制超过8小时没有人处理就给负责人推一条通知。如果超过24小时还没有人点“通过”或“驳回”这个流程实例就会被标记为超时失败并且不会继续往发布节点走。3.3 接入AI Agent与外部服务Paperclip本身不提供AI能力它更像一个插座的集线器把各种现成的Agent服务接进来。实际接入AI节点的时候我没有直接写OpenAI的调用逻辑而是把调用封装成一个标准的Agent服务通过HTTP暴露给编排引擎。这样做的原因是隔离性编排层不关心你在里面用了什么模型也不关心提示词是什么它只关心你有输入、有输出、有超时时间、有没有报错。我分别为选题和写作写了两个Agent服务。选题Agent内部会维护一个热点词库每天自动抓取数据源并生成候选标题写作Agent则接收选题和风格参数调用大模型生成正文。为了让流程失败时能定位问题每个Agent服务都必须实现一个统一规范请求里带流程实例ID和节点ID响应里返回结构化结果失败时返回错误码和错误详情。这种极低耦合的设计在实际排障时帮了大忙。有一次线上流程卡在写作环节我通过Paperclip的后台看到该节点的失败堆栈定位到是Agent服务内部超时导致返回了空结果。我没有去改动工作流定义只是在Agent服务里把超时时间从30秒调到90秒然后重新执行那一条实例流程就恢复正常了。这就是编排层把错误边界切得足够干净的典型案例。3.4 人工审核节点的设计与通知机制虽然叫“无人公司”但在Paperclip的体系里人工审核节点实际上是一个一等公民。它有几个参数需要仔细定义审核人列表、超时时间、驳回后的处理方式、以及审核界面的数据展示。我一般把审核逻辑设计成“单一审核人通过制”加“任何人可驳回”的模式。也就是说流程会推给审核人列表里的第一位如果超时就按顺序切到下一位。但是列表中的任何一个人都有权利驳回因为驳回往往说明这个流程本身明显有问题不需要来回踢皮球。驳回之后流程会进入一个可配置的分支。大多数时候它会直接终止并把驳回原因记录到实例里这样后续复盘的时候就知道哪一步的设计让AI产出了不合格结果。审核界面上应该展示什么这个也值得单独说。编排层掌握着上游节点的全部输出所以审核页面里可以直接看到选题Agent生成的候选列表、写作Agent生成的文章草稿、以及可能涉及的参考文献链接。在Paperclip的设计里这些数据不需要重新调用API获取而是直接从流程实例的数据存储里读取。审核人看到的就是流程在那一刻的完整快照也不会因为下游节点已经执行而被意外改掉。4. 常见问题与排查技巧实录4.1 状态不一致和重试风暴编排层最常见的问题不是功能缺失而是状态不一致。我第一次实际跑这套流水线的时候发现发布节点偶尔会出现重复调用原因让人挠头我在HTTP请求里没有设置幂等请求头而HTTP客户端在网络超时触发了重试实际上服务器已经处理了第一个请求只是响应丢了。第二次重试等于又发了一次POST博客后台就出现了两篇相同ID的文章。这个问题后来从两端解决。一端是在所有写操作的HTTP请求里增加一个基于流程实例ID生成的幂等头让服务端能识别重复请求。另一端是在编排层的重试策略里引入退避时间而不是立刻重试。我给Paperclip这层配置的是第一次重试等待10秒第二次等待30秒第三次等待60秒三次之后不再重试直接走失败分支。这样做虽然增加了整体耗时但至少不会再出现“重试风暴”把下游服务打死的惨剧。4.2 长时挂起任务的假死现象还有一个比较隐蔽的坑发生在等待外部Webhook回调的节点上。流程节点进入“等待中”状态后如果外部服务始终没有回调就会一直在那里挂着看起来没失败但也没有进展。这种假死状态特别容易被人忽略因为监控面板上看它还在运行实际上业务已经完全卡住。我的处理方法是给所有“等待中”节点设置最大挂起时间超时后强制转为失败。比如审核节点最长24小时Webhook节点最长6小时。设计这个参数还有一个讲究不能短到让人来不及处理也不能长到让业务看起来僵尸化。6小时对大多数异步回调是足够的24小时则基本覆盖了一个工作日的审批周期。此外我还会定期生成一份“长时间未完成流程”的列表每天早上推一遍方便手动排查那些已经接近超时上限但还没触发的实例。4.3 超时与重试参数如何合理设定超时设定可以说是编排层最磨人的细节。设小了慢接口容易被误杀设大了一个接口挂半小时也不报警。根据我这段时间的使用经验整理出一套不太容易出错的初始值节点类型建议初始值说明快速API调用30秒如果正常响应都要30秒以上先考虑优化接口LLM生成节点120-300秒大模型生成长文本确实慢不要用10秒这种激进值人工审核节点8-24小时至少要覆盖一个完整的工作时段外部回调等待1-6小时太短容易误杀太长会导致僵尸实例较多文件上传下载120秒大文件场景要按总量和带宽算这些数值不是拍脑袋来的。它们对应着一个核心原则超时时间应当大于该节点正常情况下的P95耗时同时小于业务方能够容忍的最大等待时间。如果能拿到历史数据就直接用分位数来定如果第一次跑还没有数据就用上面的初始值然后观察一个月再微调。我见过不少人把LLM节点超时设成30秒结果一到高峰期就大量失败其实不是模型的问题是超时阈值定得太苛刻了。4.4 审计与回放机制为什么重要无人公司还有一个经常被忽略的需求审计。当流程完全靠编排引擎自动跑的时候如果出现一次错误操作它造成的破坏可能比人工失误更大所以必须做到每一步都有据可查。Paperclip在审计方面的做法值得点赞每个流程实例都保存完整的执行轨迹包括启动时间、每个节点的输入输出快照、重试次数、耗费时长、是哪个事件触发的状态迁移。这意味着你可以在任何时间点把一条流程完整“回放”一遍看到业务到底是怎么走到当前状态的。我之前排查过一次数据重复上报的问题就是靠着回放功能找到了一条分支里被意外重复压入队列的事件。没有这种回放能力想在十几个节点的流程里定位一个逻辑漏洞难度会大上很多。我也给自己定了一条规矩生产环境的流程定义变更必须走版本管理每个发布的版本都要有对应的Workflow定义快照。这样回放老实例的时候用的就是当时实际运行的那个版本的逻辑而不是用现在最新的定义去看历史状态否则会得出完全错误的结论。5. 我的实际体会与可以继续扩展的方向5.1 从小闭环开始不要一上来就追求大而全如果你也想在项目里引入编排层我最想给的一句建议是不要第一次落地就奔着“无人公司”这种宏大目标去。编排层本质上是一套调度系统它有学习成本也有基础设施成本如果连一个最简单的自动化流程都没有跑通就直接开始编排复杂业务大概率是给自己制造麻烦。我当时是先从“每天上午9点自动生成一篇行业简报并发到群里”这个小闭环开始的。整个流程只有三个节点抓取数据、生成摘要、推送到群没有人工审核也没有复杂的失败分支。跑稳定两周之后才逐步加AI写作、人工审批、发布、数据回收这些环节。这样做的好处是每一步变更都能明确知道引入的问题来自哪里而不是所有问题混在一团里根本没法拆。5.2 成本监控和独立预算很值得做编排层跑久了你会发现自己开始烧一些看不见的钱。大模型API调用费用、外部服务调用费用、计算资源费用都会随着实例数量线性上涨。没人盯着的时候还好一旦业务量翻倍月底账单可能惊人。我在Paperclip前面加了一个简单的成本统计模块每一笔Agent调用都把模型名、输入Token数、输出Token数、消耗金额记录到Cost表里。每天早上看前一日的用量趋势设置月度预算提醒超过80%就报警。这个不是编排层本身的功能但对于运营一个无人化程度很高的业务成本控制是最容易被忽略但最重要的一环。5.3 编排层不是银弹它适合的边界要心里有数说到最后我还是要泼一点冷水。编排层的价值在于让确定性的流程变得稳定、可观测、可控但它不会替你把业务逻辑想清楚。如果你的业务流程本身就是模糊的今天这么走明天那么走连成功和失败的定义都不清晰那编排层只会把一个混乱的过程执行得更有纪律反而是把问题固化了下来。我判断是否适合用编排层的标准很简单这个流程在三个月后还是不是这个样子如果答案是大概率会剧烈变化就先别急着上复杂的编排系统用脚本或者任务队列顶一顶等流程真的稳定了再迁过来。Paperclip这类工具真正发光的场景是规则清晰、重复度高、需要多人或多种系统协作的稳定业务在那种情况下它带来的收益是肉眼可见的。我自己跑下来最大的感受是它把“运营的体力活”和“经营的高质量决策”彻底切开了而这个切换完成的那一刻才真正能体会到什么叫无人公司的编排层。