24/7 运行 23 个 AI 代理 6 个月的实战教训与修复指南
- 作者

- 姓名
- Nino
- 职业
- Senior Tech Editor
构建一个 AI Agent(智能体)的 Demo 并不难,但要让 23 个专门的 AI 代理在生产环境中 24/7 不间断运行,则是完全不同的挑战。在过去的六个月里,我管理着一个复杂的智能体集群,涵盖了从自动交易、内容创作到系统监控和市场调研的方方面面。这个系统运行在自托管的 VPS 上,核心技术栈包括 n8n、Docker 以及多种主流的大语言模型(LLM)。
在运行初期,一切看起来都很完美,但随着时间推移,各种“生产环境特有”的问题接踵而至:API 响应超时、成本失控、智能体陷入逻辑死循环。如果你正计划将你的 AI 工作流从本地测试迁移到 24/7 运行的服务器上,那么我总结的这五个关键失败案例及修复方案将为你节省大量的开发时间。为了确保智能体拥有最稳定的底层支持,使用像 n1n.ai 这样稳定、高速的 API 聚合平台是至关重要的第一步。
生产环境基础架构
在分析失败案例之前,先看下我的系统配置:
- 编排工具:自托管 n8n (基于 Docker)。
- 模型选择:Claude 3.5 Sonnet, GPT-4o, DeepSeek-V3, 以及 Gemini 1.5 Flash。
- 数据库:PostgreSQL 用于持久化状态,Redis 用于高速缓存。
- 网关:Traefik 反向代理,处理 SSL 和流量分发。
- 监控:集成 Slack 的报警系统和自定义的健康检查工作流。
1. 成本爆炸:从每月 180 美元降至 22 美元
问题现象:在运行的第二个月,我的 API 账单飙升至 180 美元。通过日志审计发现,问题的根源在于“模型过载”。当时,我为所有代理默认配置了 GPT-4o。无论是处理“格式化一个简单的 JSON”还是“分析 5000 字的文档”,系统都动用了最昂贵的模型。
解决方案:我引入了一个 查询分类层 (Query Classification Layer)。在每次调用 LLM 之前,先通过一段轻量级的逻辑(或极廉价的模型)来判断任务的复杂程度。
// n8n 中的复杂度分类逻辑示例
const query = $input.first().json.query;
const wordCount = query.split(' ').length;
const hasCode = /```|function|class|import/.test(query);
const isComplex = hasCode || wordCount > 150;
const isMedium = wordCount > 50 && !isComplex;
if (isComplex) return [\{ json: \{ model: 'claude-3-5-sonnet' \} \}];
if (isMedium) return [\{ json: \{ model: 'gpt-4o-mini' \} \}];
return [\{ json: \{ model: 'deepseek-chat' \} \}];
通过将 78% 的简单任务路由到通过 n1n.ai 接入的 DeepSeek 模型,我成功将月度支出降低了近 90%。核心经验是:在生产环境中,绝对不要使用“万金油”式的模型配置。
2. 供应商故障:构建多模型回退链
问题现象:某天下午,主要的 API 供应商出现了长达 2 小时的区域性故障。由于我的代理硬编码了单一的 API 节点,整个自动化业务线瞬间瘫痪。在生产环境中,依赖单一供应商是极其危险的。
解决方案:我弃用了单一 API Key 的模式,转向了 主 > 次 > 备 (Primary > Secondary > Tertiary) 的回退链架构。
| 优先级 | 模型名称 | 角色定位 |
|---|---|---|
| 主模型 | DeepSeek-V3 | 高性能、极低成本,处理日常任务 |
| 次模型 | Gemini 1.5 Flash | 高速率限制、低延迟,作为第一备选 |
| 备用模型 | Claude 3 Haiku | 极高稳定性,最后的保底方案 |
使用 n1n.ai 极大地简化了这一过程。通过 n1n.ai 的统一接口,我可以轻松访问多个模型,当某个模型出现延迟或服务中断时,系统可以自动切换,而无需修改核心业务代码。
3. 无限循环陷阱:死信队列 (DLQ) 的必要性
问题现象:一个负责内容提取的代理在处理特定的 JSON 格式时出错,触发了自动重试机制。然而,由于重试逻辑没有上限,它在 20 分钟内循环重试了数百次,消耗了超过 4 万个 Token,直到我手动强行关闭容器。
解决方案:我为每个任务引入了 最大尝试次数计数器 和 死信队列 (Dead Letter Queue)。
- 每个任务元数据中包含
attempt_count。 - 如果
attempt_count超过 3 次,任务将停止重试并存入 PostgreSQL 的failed_tasks表。 - 系统通过 Slack 实时通知管理员手动介入。
这种机制有效防止了“Token 大出血”,确保系统在遇到逻辑死胡同时能及时止损。
4. 状态丢失:从内存记忆转向持久化数据库
问题现象:每当 VPS 重启或 Docker 镜像更新时,所有正在运行的代理都会丢失当前进度。它们不得不从头开始“学习”当前任务的状态,这不仅浪费 Token,还导致业务逻辑不连贯。
解决方案:我将代理的状态管理迁移到了外部的 PostgreSQL 数据库。每个代理在启动或执行下一步操作前,都会先查询状态表。
CREATE TABLE agent_state (
agent_id TEXT PRIMARY KEY,
current_task JSONB, -- 存储当前任务的 JSON 结构
last_checkpoint TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
attempt_count INT DEFAULT 0,
context_summary TEXT -- 存储关键上下文摘要
);
现在,即使服务器意外宕机,代理在重启后也能通过数据库识别出自己正处于“步骤 4”,并无缝继续执行任务。
5. 静默失败:可观测性是生产环境的生命线
问题现象:一个负责市场调研的代理在某天停止了发送报告。因为代码本身没有报错(只是返回了空结果),我整整三天都没有察觉到异常。这种“静默失败”在复杂系统中非常致命。
解决方案:我在 n8n 中构建了一个专门的“看门狗 (Watchdog)”监控层:
- 健康检查:每 5 分钟执行一次 Cron 任务,检查各代理节点的活跃度。
- 成本看板:每日生成报表,分析每个代理的 Token 消耗占比。
- 异常检测:如果一个平时日均处理 100 个任务的代理突然处理量变为 0,系统会立即触发 Slack 警报。
总结与展望
经过六个月的迭代修复,系统的稳定性得到了质的飞跃:
- 月度成本:从 180 美元降至 22 美元。
- 正常运行时间:过去 30 天达到了 99.3%。
- 扩展性:智能体数量从 23 个扩展到 58 个,而维护工作量并未显著增加。
在生产环境中构建多代理系统,核心不在于写出多么完美的 Prompt(提示词),而在于构建一套足够强韧的容错和监控体系。通过使用 n1n.ai 获得稳定且高性价比的 API 支持,并结合上述的持久化与回退策略,你的 AI 系统才能真正从实验室走向实战。
立即在 n1n.ai 获取免费 API 密钥。