去年冬天我把一台吃灰的 Mini 主机塞进了书架角落,给它配了一堆服务,然后它就真的开始“上班了”。到现在,这套系统已经连续跑了快两个月,期间我只远程重启过两次,还都是因为我自己乱改配置。这台机器上跑的,不是一个普通脚本,而是一套我逐步搭起来的多 Agent 集群:十几个分工明确的 AI Agent,通过任务队列、共享记忆和统一调度协作,处理我这边从数据采集、内容生成、定时巡检到自动报告的全部工作,真正实现了 7x24 小时无人值守。
这篇文章就是这套集群从零到稳定运行的完整记录。会说清楚为什么单 Agent 撑不起长期任务、集群架构怎么选、调度和记忆怎么设计、故障恢复怎么让进程“打不死”,以及我在实际运维中踩过的各种坑。如果你跟我一样,想让 AI 不光能聊天,还能长期稳定地替你干活,这篇文章应该能帮你省掉不少试错时间。
1. 多 Agent 集群设计的核心思路
1.1 为什么不是“一个超级 Agent”而是“一群普通 Agent”
最开始我也犯过新手都会犯的错:想做一个“全能 Agent”,所有工具全塞给它,希望它能自己搞定一切。结果发现,模型一面对十几个工具,光做工具选择就开始摇摆不定;任务一长,它经常做到一半就忘了主线,甚至在一个子问题上反复打转,白白烧 Token。
后来我换了个思路,不追求单个 Agent 无所不能,而是把一个大活儿拆成多个小活儿,交给一群各自擅长的 Agent 去干。这其实就是团队协作的逻辑:让一个人同时管研发、运营、客服、财务,他大概率翻车;但让十个人各管一摊,再配一个协调者,系统反而很稳。
在 AI Agent 上,这个逻辑体现得更明显:每个 Agent 的工具越少,指令越聚焦,上下文越短,出错率就越低。集群化不是炫技,而是用结构换稳定性。如果只是跑个 Demo,单 Agent 完全够用;但想让 AI 7x24 小时持续干活,集群化设计几乎是必经之路。
1.2 编排架构的三种路线与最终选型
多 Agent 集群的关键问题是:这么多 Agent 之间怎么配合?我调研下来,主流方案大致有三种:
- 中心化编排(Orchestrator 模式):一个调度 Agent 负责拆解任务、分配任务、收集结果。优点是流程可控、实现简单,适合任务路径比较固定的场景。
- 分层指挥(Hierarchical 模式):主管 Agent 把任务拆给小组长,小组长再分给执行者。适合复杂多级任务,但层级多了容易增加延迟和 Token 开销。
- 事件驱动 / 市场模式(Event-driven 模式):任务发布到消息队列,多个 Agent 订阅各自感兴趣的主题,谁空闲谁消费。优点是弹性强、并发高,Agent 之间完全解耦。
我最终选的是**“中心化调度 + 事件驱动执行”的混合模式**。调度器负责任务拆解和分发,把任务按主题投递到 Redis 队列;执行 Agent 各自订阅相关队列,异步竞争消费。这样既保留了编排模式的可控性,又获得了队列解耦的弹性——某个 Agent 挂了,任务只是积压在队列里,不会导致整条链路崩溃,别的 Agent 或重启后的它自己都能接着消费。
1.3 Agent 职责划分与技能拆分实践
我的集群里实际跑的 Agent 大概分成了七类,各自职责非常单一:
| Agent 名称 | 核心职责 | 主要工具 |
|---|---|---|
| 采集 Agent | 定时抓取指定数据源 | HTTP 请求、RSS 解析 |
| 清洗 Agent | 去重、格式化、抽取字段 | 文本处理、正则 |
| 内容生成 Agent | 按模板生成报告/文案 | LLM 生成、模板渲染 |
| 审核 Agent | 检查生成内容的关键词和格式 | 规则引擎、敏感词库 |
| 发布 Agent | 推送到目标平台 | API 调用、上传工具 |
| 巡检 Agent | 监控其他 Agent 的心跳和日志 | 系统命令、日志查询 |
| 汇总 Agent | 汇总所有执行结果,生成日报 | 数据聚合、摘要生成 |
每个 Agent 的 prompt 里,我会明确写三件事:你负责什么、你能用什么工具、什么情况必须上报人工。工具权限也严格隔离——比如发布 Agent 只能调发布 API,绝对不给它数据库写权限。
这带来的收益非常直接:提示词短了,模型理解得准了;工具少,误调用的概率低了;每个 Agent 的状态简单,出了问题也容易定位。从成本角度看,简单任务用便宜的小模型就能跑,只有内容生成和审校这类任务才需要上强模型,整体 Token 开销降了不少。
2. 集群核心运行时:调度、状态与模型路由
2.1 任务队列与调度策略
任务队列是整个集群的“传送带”。我用了 Redis 作为队列底层,原因很朴素:轻量、快、自带持久化选项,而且社区生态成熟,Python 这边有很多现成封装可以直接用。比 Kafka 轻得多,对我的任务量级来说完全够用,没必要引入那么重的依赖。
队列的设计上,我实现了三个关键机制:优先级、延迟任务、失败重试。任务对象会带上priority字段,调度器消费时优先处理高优先级任务;定时任务则用delay字段控制,到点才进入可消费状态。下面是简化后的任务封装,实际代码比这个长,但核心逻辑就是这几行。
import redis, json, time, uuid r = redis.Redis(host="localhost", port=6379, db=0) def enqueue(queue: str, payload: dict, priority: int = 5, delay: int = 0): task = { "id": str(uuid.uuid4()), "payload": payload, "priority": priority, "enqueue_time": time.time(), "available_at": time.time() + delay, "retry_count": 0, } # 用 ZSet 做优先级队列,score = 优先级越小的越先被处理 r.zadd(queue, {json.dumps(task): -priority})执行 Agent 消费任务时,会做三件事:先检查任务的available_at是否已到,再到 ZSet 里取出任务,最后执行完毕后删除或标记完成。凡是执行失败的任务,会根据retry_count决定是重回队列还是进入死信队列(Dead Letter Queue)。死信队列的任务会单独告警,人工看一眼,避免问题任务无限重试打爆系统。
2.2 状态持久化与工作记忆
Agent 干活不能没有“记性”。如果每次任务都是全新上下文,它就不知道之前做到哪了、哪些数据已经处理过、上次结论是什么。我引入了一张任务状态表,把每个 Agent 的工作进度、输出路径、关键参数全部落库。这样即使进程崩溃重启,Agent 也能从数据库恢复现场,接着干而不是从头再来。表结构大概是这样的:
CREATE TABLE task_state ( task_id TEXT PRIMARY KEY, agent_name TEXT NOT NULL, status TEXT NOT NULL, -- running / done / failed / dead current_step TEXT, input_path TEXT, output_path TEXT, result_summary TEXT, created_at TIMESTAMP DEFAULT now(), updated_at TIMESTAMP DEFAULT now() );实际运行中我发现,状态表不要只记录最终结果,还要定期写入中间步骤。比如采集 Agent 每抓完一个页面就更新一次current_step,这样就算任务中途挂掉,重启后也能从断点继续,不用整批重跑。
2.3 模型网关与成本控制
集群里的 Agent 会用到不同等级的模型,如果每个 Agent 都直连模型 API,成本控制就会失控。我加了一层模型网关,所有模型请求统一走这里,由网关根据任务复杂度自动路由。规则大致是:普通文本分类、信息抽取这类简单任务走轻量模型;内容生成、复杂推理才走旗舰模型;当旗舰模型超时或触发限流时,自动降级到次一级模型,保证任务尽量完成。
| 任务类型 | 默认模型 | 降级模型 | 说明 |
|---|---|---|---|
| 文本分类/抽取 | 轻量模型 | 无 | 成本优先,速度快 |
| 内容生成 | 旗舰模型 | 中等模型 | 质量优先,允许降级 |
| 日报汇总 | 中等模型 | 轻量模型 | 平衡质量与成本 |
| 代码审查 | 旗舰模型 | 无 | 绝降级,低质结果宁可不跑 |
网关还会记录每个任务的 Token 消耗,并执行熔断策略:单日消耗超过预算阈值,低优先级任务会被自动挂起;单个任务 Token 超限也会被终止,避免一个失控任务吃光配额。这套机制配合之前的状态表,让成本从“事后看账单”变成了“事中可控”。
3. 7x24 小时稳定运行:故障恢复与高可用设计
3.1 进程守护与自动重启
多 Agent 集群想真正做到 7x24 小时干活,第一关就是进程守护。Linux 上我试过几种方案:systemd 简单可靠,适合少量进程;Supervisor 适合管理多进程;Docker 容器则自带restart策略,最适合和集群一起部署。我最终是用 Docker Compose 起的服务,所有容器都配置了:
restart: unless-stopped仅靠重启策略还不够,因为 Agent 进程可能“没死但卡住”。比如模型请求长时间无响应,进程 CPU 正常但就是不返回结果。所以我在每个 Agent 里加了心跳线程,每 30 秒往 Redis 写一次心跳时间;调度器会定期检查每个 Agent 的“最后心跳时间”,超过 3 分钟没心跳,就标记该 Agent 不健康,触发重启 API,同时把它的任务重新入队。
3.2 可观测性:日志、指标与告警
集群跑起来之后,最怕的是“不知道它在干嘛”。所以我从头就做了三件套:结构化日志、运行时指标、自动告警。日志统一 JSON 格式,带上任务 ID 和 Agent 名,方便按 ID 串联整个任务链路;指标用 Prometheus 采集,Grafana 展示;告警走企业微信机器人,出问题直接推送到手机。
我重点盯的指标有五个:队列积压数、任务成功率、平均处理时延、Token 消耗速率、进程重启次数。队列积压数是“第一指标”——它一旦持续走高,基本说明某类 Agent 处理不过来了,要么扩容,要么优化任务拆分。
下面是一条 Grafana 告警规则的简化写法,作用就是当队列积压连续 5 分钟超过 50 时告警:
groups: - name: cluster_alerts rules: - alert: QueueBacklogHigh expr: redis_queue_length > 50 for: 5m labels: severity: warning annotations: summary: "任务队列积压过高,请检查消费 Agent 状态"这套东西建好之后,最大的变化是:我不再需要天天盯着后台看,异常会自动找到我,而且告警信息里已经带上了排查线索。
3.3 降级策略与限流熔断
外部依赖不可能永远稳定。模型 API 会超时、第三方接口会限流、网络也会抽风。我一开始没做任何保护,结果某个第三方平台一限流,整条任务链全部失败,队列瞬间堆了几百条。后来我参考微服务领域的熔断器模式,做了三层防护:
- 超时控制:所有外部调用必须有明确的超时时间,模型请求设为 60 秒,普通 HTTP 请求 15 秒。没有超时的调用就是定时炸弹。
- 限流降级:第三方 API 返回 429 时,主动放慢消费速度,而不是疯狂重试。重试策略采用指数退避,第一次等 5 秒,第二次 25 秒,第三次 125 秒,最多重试 3 次。
- 熔断开关:某个外部依赖在 1 分钟内错误率超过 30%,直接熔断 30 秒,期间相关任务快速失败并标记为“已降级”,不等超时白白消耗资源。
熔断状态用 Redis 记录,这样即使某个 Agent 重启了,熔断状态也不会丢。形态上就是典型的“关闭-打开-半开”状态机,逻辑不复杂,但价值极高——它让集群在外部系统抽风时仍能保持“带病运行”,而不是全线崩溃。
3.4 我做的破坏性测试
系统上线前,我专门找了一个晚上做了几组破坏性测试,模拟真实故障场景。说实话,测完才发现一堆隐藏问题。
第一组是kill -9 直接杀 Agent 进程。杀掉之后,调度器在下一轮心跳检查时发现失联,自动拉起新容器,任务在队列里等待,恢复后继续消费。这个流程跑通了。
第二组是断网测试。我把容器的外网连接断开,结果发现模型调用全部超时,队列积压暴涨。好在熔断器及时打开,没有无限耗资源;网络恢复后,积压任务逐个消化,系统自动恢复正常。这一轮暴露了超时配置过短的问题——我原来设的 10 秒太乐观,后来统一调成 60 秒,反而减少了无谓的失败重试。
第三组是磁盘写满模拟,这个坑最大。我发现大量 Agent 会把临时文件写到默认目录,一旦磁盘满,进程并不一定崩,但日志和状态写入全部失败,系统进入“假死”状态。后来我加了磁盘水位监控,超过 85% 就自动清理临时文件,并给告警留出足够提前量。
4. 长时运行的关键:记忆、上下文与工具调用
4.1 上下文压缩与滚动窗口
Agent 长时间运行中,最容易遇到的问题就是上下文爆窗。模型输入长度有限,对话历史一长,要么超限报错,要么模型“迷失”在长篇历史里抓不住重点。短任务感受不到,一旦任务链条持续几小时,这个问题几乎是必然爆发。
我的方案是摘要化 + 滚动窗口:每次对话轮次超过阈值,就把早期对话压缩成摘要,只保留关键事实和最终结论,把原文从上下文里移除。压缩逻辑简化成伪代码大概是这样的:
def compact_context(history: list[dict], max_len: int) -> list[dict]: # 计算当前长度 total_tokens = sum(count_tokens(m["content"]) for m in history) if total_tokens <= max_len: return history # 把最旧的一半消息交给摘要模型 old_part = history[: len(history) // 2] new_part = history[len(history) // 2:] summary = summarize_by_llm(old_part) # 调用摘要模型 return [{"role": "system", "content": f"[历史摘要] {summary}"}] + new_part实测下来,摘要化之后任务准确率明显提升,因为模型不用再在一堆废话里找有效信息了。摘要模型的成本很低,相比旗舰模型的长上下文费用,压缩反而更省钱。
4.2 长期记忆与向量检索
上下文压缩解决的是“短期记忆”,跨天、跨周的事实性信息还是得靠持久化记忆。我给集群加了一层向量检索记忆库:Agent 每次执行完任务,会把关键结论和值得长期保留的事实写入向量库;下次遇到类似任务时,先检索相关记忆,再带着检索结果生成回复。
写入记忆的格式很关键。我一开始直接存完整对话记录,结果查出来的都是噪音。后来改成**“结构化事实 + 简短自然语言描述”**的形式,比如:
fact: 用户偏好简报风格 = 简洁、结论前置 source: 内容生成Agent任务 #2048 用户反馈 time: 2025-01-12这样的记忆粒度更适合检索,也更节省存储。查询时用语义相似度召回 Top 5 相关片段,拼接到系统提示词里,Agent 就相当于有了“长期工作经验”。这套机制配合上状态表,集群就不再是一堆无状态脚本,而是一个有积累、能成长的协作体。
4.3 工具调用的可靠落地
Agent 的能力上限很大程度取决于工具调用是否可靠。我在实践中最看重三点:结构化输出、超时保护、错误回灌。现在主流模型都支持结构化工具调用模式,也就是模型返回一个 JSON 格式的工具调用指令,而不是自然语言描述,这样我把 JSON 解析出来就能直接执行,大幅减少格式解析的幺蛾子。
工具执行器我做成了解耦模块,核心逻辑如下:
def run_tool(tool_name: str, args: dict) -> str: tool = registry.get(tool_name) try: result = tool.run(args, timeout=15) # 所有工具统一 15 秒超时 return json.dumps(result, ensure_ascii=False) except TimeoutError: return json.dumps({"error": "tool timeout"}) except Exception as e: return json.dumps({"error": str(e)})注意这里工具执行失败并不是直接把错误扔掉,而是把错误信息作为文本返回给模型。模型看到“tool timeout”或“file not found”之后,自己能判断是重试、换参数还是换方案。这种“错误回灌”的能力,是 Agent 表现出自主性的关键——它能基于真实反馈调整行为,而不是死板地重复失败操作。
5. 集群部署基础设施与资源规划
5.1 资源估算与配置参考
很多人以为多 Agent 集群需要很高配置,其实未必。我这个集群跑在 8 核 16G 内存的 Mini 主机上,加上 Redis、PostgreSQL、模型网关、十几个 Agent 容器,一切正常。真正的资源大头是模型 API 调用,本地只是跑逻辑和状态。实测每个 Agent 常驻内存大约 80-150MB,空闲时 CPU 占用几乎可以忽略,任务高峰期 CPU 才会短暂上去。
| 服务 | CPU | 内存 | 存储 | 说明 |
|---|---|---|---|---|
| 调度器 + API | 1 核 | 1G | 10G | 常驻,轻负载 |
| Redis | 1 核 | 1G | 5G | 队列 + 心跳 + 熔断 |
| PostgreSQL | 1 核 | 2G | 50G | 任务状态 + 日志表 |
| 执行 Agent × 10 | 4 核 | 8G | 20G | 每个容器限额 |
| 模型网关 | 1 核 | 2G | 5G | 路由和限流 |
如果 Agent 数量翻倍,优先升内存和 Redis 性能。实测下来瓶颈一般不在 CPU,而在 Redis 的并发连接和队列积压速度上。
5.2 容器化部署的关键细节
我用 Docker Compose 做编排,每个服务一个容器,内部网络互通。部署时有几个细节容易被新手忽略:
- 健康检查必须配:Compose 里给每个服务加
healthcheck,依赖服务的启动顺序用depends_on: condition: service_healthy控制,避免 Agent 启动时 Redis 还没就绪,报一堆连接错误。 - 日志必须轮转:容器日志不限制会一直涨,最后撑爆磁盘。我统一配置了
logging驱动,每个容器日志上限 100MB,超过自动切割。 - 持久化卷要分离:Redis 的 AOF 文件、PostgreSQL 数据目录、向量库的数据目录都要挂独立卷,容器重建不丢数据。
services: redis: image: redis:7-alpine restart: unless-stopped volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 postgres: image: postgres:15-alpine restart: unless-stopped environment: POSTGRES_PASSWORD: ${DB_PASSWORD} volumes: - pg_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 10s timeout: 5s retries: 55.3 数据层的运维心得
Redis 和 PostgreSQL 是集群的“心脏”,它们的稳定性直接决定集群可用性。Redis 我开了 AOF 持久化,并设置appendfsync everysec,兼顾安全与性能;同时给 Redis 设置了最大内存和allkeys-lru淘汰策略,防止某些任务意外堆积把内存吃满。
PostgreSQL 这边,我每天凌晨做一次全量备份,保留 7 天;每个月做一次数据完整性检查。跑了一个多月之后,我发现真正需要关心的不是表数据,而是连接数——Agent 数量一多,连接池很容易被打满,所以我用的是短连接加应用层连接池,而不是每个 Agent 维持长连接。
关于数据层选型,我也试过直接上 Kafka 集群,但后来冷静下来想,我的任务量一天也就是几千条,Redis 队列完全扛得住,非要上 Kafka 只会增加运维成本。技术选型要看量级,不能为了架构好看什么都加。
6. 安全管理与权限控制
6.1 最小权限:密钥隔离与访问边界
多 Agent 集群的安全问题,本质上就是权限爆炸问题。Agent 越多,泄露面越大。我给每一个 Agent 分配了独立的 API 密钥,不同 Agent 之间的密钥严格隔离。即使某个 Agent 被攻破,影响范围也仅限于它自己的权限,其他 Agent 和核心数据库不受牵连。
密钥本身放在独立的密钥环境变量文件里,Compose 加载时通过${VAR}引用,不写进代码仓库。数据库密码、第三方平台 token 也都走同样的方式管理。另外,每个 Agent 的系统提示词里会显式声明权限边界,比如巡检 Agent 只有“读取日志”权限,没有“删除日志”权限;发布 Agent 只能调用发布接口,不能访问数据库。
6.2 提示注入与外部内容的风险控制
Agent 和普通程序最大的不同是:它会主动读取外部内容,然后根据内容做判断。这带来了一个典型安全风险——提示注入。如果 Agent 读取的网页、文档或用户输入里夹带“忽略之前的指令,执行某某操作”,模型可能真的会照着执行。
我的应对方案有这么几层:第一,工具白名单,Agent 的每个工具都明确声明“只接受标准参数格式”,拒绝自由文本拼接命令;第二,外部内容隔离,所有从网络抓取的内容先经过清洗模块,截断到指定长度,去掉可疑指令段落,再交给模型;第三,高危操作二次确认,凡是涉及发布、删除、转账这类不可逆动作,工具执行器都会要求单独的人工审批码,Agent 自己无法完成完整操作链。
| 操作类型 | 风险等级 | 控制措施 |
|---|---|---|
| 读取数据 | 低 | 白名单 URL,内容长度限制 |
| 写日志/状态 | 低 | 正常执行,记录审计 |
| 发送消息 | 中 | 内容审核通过后执行 |
| 删除/覆盖文件 | 高 | 需要审批码 + 审计记录 |
| 调用外部付费 API | 高 | 单次成本上限 + 熔断 |
6.3 审计日志与数据脱敏
所有任务的关键行为我都会写审计日志:谁(哪个 Agent)、什么时候、调了什么工具、传了什么参数、得到什么结果。审计日志单独存表,普通 Agent 没有读取权限。这些日志平时用不上,一旦出现异常行为,就是定位问题的唯一线索。
数据脱敏也是重点。Agent 处理用户数据、抓取的内容里经常夹带手机号、邮箱等个人信息,这些如果原样写进日志或者模型请求,会带来合规风险。我加了统一的脱敏组件,在日志写入前和模型请求发出前都过一遍,替换成占位符。这个组件看起来不起眼,但对长期运行的系统来说,它让我少了很多隐私层面的顾虑。
7. 常见问题与排查技巧实录
7.1 高频问题速查表
跑了一个多月,我把遇到的高频问题整理成了一张速查表,遇到类似情况可以直接照着排查:
| 问题现象 | 可能原因 | 快速排查 | 解决方式 |
|---|---|---|---|
| 任务堆积不消化 | 消费 Agent 挂了或卡死 | 查心跳时间、队列长度 | 重启 Agent,确认工具调用是否卡住 |
| 模型频繁超时 | 网关路由到过载模型 | 查网关超时率 | 调整路由策略,启用降级模型 |
| Agent 输出格式随机变化 | 上下文被压缩后丢细节 | 查摘要内容是否完整 | 调整摘要触发阈值,保留关键约束 |
| 系统日志大量报错但不崩溃 | 某个外部 API 在限流 | 查熔断器状态 | 等待熔断结束,优化重试策略 |
| 磁盘空间持续下降 | 日志和临时文件堆积 | 查容器日志大小 | 配置日志轮转,加自动清理任务 |
| 任务结果重复处理 | 消费确认逻辑丢失 | 查任务状态表的 status | 加幂等标识,消费前检查状态 |
7.2 我的排查三板斧
集群出问题时,我有一套固定的排查顺序,基本能覆盖 90% 的场景:先看队列积压,再看模型超时率,最后看工具调用错误。
第一步看队列积压,能快速判断问题在“生产端”还是“消费端”。积压暴涨,多半是消费 Agent 处理不过来了,这时候看心跳确认它是不是卡死;积压为零但任务不产出了,问题在生产端——调度器或上游数据源。第二步看模型超时率,如果网关显示超时率飙升,先查是不是模型服务故障或限流,再决定要不要降级。第三步看工具调用错误日志,重点找“反复失败被重试”的任务,这类任务往往不是系统问题,而是任务本身的参数不合理。
这个顺序看起来很朴素,但确实最有效。因为队列、模型、工具正好对应集群的传输层、认知层、执行层,从前往后排查,每一步都能快速缩小范围。
7.3 避坑清单
最后分享几条我用真金白银踩出来的经验:
- 生产环境不要频繁改 prompt。我有一阵为了优化效果,每天改 Agent 的系统提示词,结果任务质量忽高忽低,根本没法定位是哪次改动导致的。后来改成“先小范围灰度,稳定后再全量”,效果立刻可控了。
- 不要把全部工具暴露给所有 Agent。工具越多,模型越容易选错。每个 Agent 的工具最好控制在 5 个以内,超过 10 个我就开始拆解职责了。
- 模型输出不要直接当代码或命令执行。至少加一层格式校验和参数白名单,否则模型输出的一个小格式错误就能让整个工具链崩掉。
- 重视磁盘和内存的长期趋势。很多故障不是突然爆发的,而是缓慢增长到阈值才出事。磁盘水位、内存水位一定要有监控和自动清理机制。
整套系统跑了五十多天,最让我意外的不是稳定性本身,而是“集群”这种设计反过来逼着我把流程梳理清楚了很多。以前一个人闷头写脚本,流程混乱也无所谓;现在任务要跨 Agent 流转,每一步都必须定义清楚输入、输出、失败策略。这种梳理过程,比堆多少个 Agent 都更有价值。
如果你也想搭一套类似的系统,我的建议是先从一个 Agent 开始,让它稳定跑一天,再拆第二个。所谓 24 小时不停工,不是靠堆高配机器,而是靠把失败当成正常事件来设计。等到你发现某个部门任务量已经稳定到值得“招”一个新的 Agent 来接手时,再慢慢扩张也不迟。