来源:LangGraph Deployment · Google ADK Deployment · Anthropic Agent SDK | 整理时间:2026-05-14
概述
把 Agent 从本地 Demo 推到生产环境,需要解决五个问题:在哪里运行、怎么监控、怎么控制成本、怎么管理版本、怎么保障安全。本篇不讲特定框架的部署步骤(那些看官方文档就行),而是梳理通用的生产化决策框架。
部署模式选择
三种主流模式
| 模式 | 适合场景 | 成本 | 复杂度 |
|---|---|---|---|
| Serverless 函数 | 事件驱动、短任务、低并发 | 低(按调用计费) | 低 |
| 容器化服务 | 长时运行、需要状态、中等并发 | 中(按实例计费) | 中 |
| 自托管集群 | 高并发、数据敏感、需要完全控制 | 高(固定成本) | 高 |
按场景推荐
你的 Agent 做什么?
│
├─ 响应 Webhook / 定时任务
│ → Serverless(Cloudflare Workers / AWS Lambda)
│
├─ 持续运行、维护状态(如客服 Agent)
│ → 容器化(Docker + K8s / Cloud Run / Fargate)
│
├─ 处理敏感数据、合规要求
│ → 自托管(私有云 / 本地机房)
│
└─ 内部工具、团队使用
→ 容器化或 Serverless 都可以,取决于并发量
成本控制
Agent 的成本主要来自两个地方:LLM API 调用和基础设施。
LLM 成本优化
| 策略 | 效果 | 实现方式 |
|---|---|---|
| 缓存重复查询 | 减少 30-50% 调用 | 缓存 LLM 响应,相同输入直接返回 |
| 分级模型 | 降低 40-60% 成本 | 简单任务用 Haiku,复杂任务用 Sonnet/Opus |
| 限制 Token 预算 | 控制单次调用上限 | 设置 max_tokens,监控实际使用 |
| Prompt 压缩 | 减少 20-30% 输入 | 精简系统提示、移除不必要上下文 |
| 批量处理 | 提高吞吐量 | 积累请求后批量发送 |
监控指标
// 每次调用记录这些指标
{
"agent_id": "customer-support-v2",
"model": "claude-sonnet-4-6",
"input_tokens": 2847,
"output_tokens": 432,
"latency_ms": 3200,
"cost_usd": 0.023,
"tool_calls": 3,
"success": true,
"timestamp": "2026-05-14T10:30:00Z"
}
成本告警
- 单日支出上限:设置硬限制,超限自动停止
- 单次调用上限:超过阈值的调用记录告警
- 异常模式检测:Agent 进入循环时快速检测和终止
监控与可观测性
三层监控
| 层级 | 监控什么 | 工具 |
|---|---|---|
| 基础设施 | CPU、内存、网络、容器状态 | CloudWatch / Grafana / Prometheus |
| Agent 行为 | 调用次数、延迟、成功率、Token 用量 | 自定义 metrics + LLM 可观测平台 |
| 业务指标 | 任务完成率、用户满意度、错误类型 | 业务 dashboard |
关键告警规则
| 告警 | 条件 | 动作 |
|---|---|---|
| Agent 循环 | 同一任务连续 5+ 次 tool call 无进展 | 终止任务,通知值班 |
| Token 爆炸 | 单次调用 input > 50K tokens | 告警 + 记录上下文快照 |
| 错误率飙升 | 10 分钟内失败率 > 30% | 告警 + 自动降级到备用模型 |
| 成本异常 | 小时支出 > 日均 3x | 告警 + 暂停非关键 Agent |
日志设计
// 结构化日志示例
logger.info("agent_task_completed", {
task_id: "task_abc",
agent_version: "2.1.0",
duration_ms: 4500,
tool_calls: [
{ name: "search_issues", latency_ms: 800 },
{ name: "create_issue", latency_ms: 1200 },
],
tokens: { input: 2847, output: 432 },
result: "success",
});
版本管理
Agent 版本策略
| 策略 | 说明 | 适合 |
|---|---|---|
| 蓝绿部署 | 两套环境,切流量 | 需要零停机 |
| 金丝雀发布 | 5% → 20% → 100% 流量 | 需要渐进验证 |
| 功能标志 | 按用户/请求开启新版本 | 需要精细控制 |
| API 版本 | URL 路径包含版本号 | 对外服务 |
Prompt 版本管理
Prompt 是 Agent 的"代码",必须版本化:
prompts/
├── v1/
│ ├── system.md # 系统提示
│ └── tools-spec.json # 工具定义
├── v2/
│ ├── system.md
│ └── tools-spec.json
└── current → v2/ # 软链接指向当前版本
原则:
- Prompt 变更 = 版本变更
- 每个版本有对应的测试用例
- 回滚 = 切回上一个版本目录
安全保障
生产环境安全清单
| 类别 | 检查项 | 状态 |
|---|---|---|
| 认证 | Agent 调用需要认证 token | ☐ |
| 授权 | Agent 只能访问必要的 API 和数据 | ☐ |
| 输入过滤 | 过滤用户输入中的注入攻击 | ☐ |
| 输出过滤 | 检查 Agent 输出不泄露敏感信息 | ☐ |
| 速率限制 | 单用户 / 单 IP 调用频率限制 | ☐ |
| 审计日志 | 记录所有 Agent 操作用于审计 | ☐ |
| 回滚能力 | Agent 的操作可以回退 | ☐ |
| 成本上限 | 硬性成本限制,超限自动停止 | ☐ |
Agent 操作安全
// 危险操作需要人工确认
const dangerousActions = [
"delete_record",
"send_email",
"modify_permissions",
"execute_sql",
];
async function executeTool(name: string, params: any) {
if (dangerousActions.includes(name)) {
await notifyHuman(`Agent wants to execute ${name}`, params);
const approved = await waitForApproval();
if (!approved) return { error: "Operation cancelled by human" };
}
return await tools[name].execute(params);
}
部署架构示例
中小规模:Cloudflare Workers + KV
用户请求
↓
Cloudflare Workers (Agent 入口)
↓
┌──────────────────────────┐
│ Agent Logic │
│ - Prompt 组装 │
│ - LLM 调用 (Claude API) │
│ - 工具执行 │
│ - 状态管理 (KV) │
└──────────────────────────┘
↓
外部 API (GitHub / Slack / DB)
适合:单 Agent、事件驱动、中等并发、成本敏感。
企业规模:K8s + 多 Agent
负载均衡
↓
┌──────────────────────────────┐
│ Agent Orchestrator │
│ - 路由请求到合适的 Agent │
│ - A2A 协议处理 │
│ - 全局状态管理 │
└──────────────────────────────┘
↓ ↓ ↓
Agent A Agent B Agent C
(MCP) (MCP) (MCP)
适合:多 Agent 协作、高并发、需要精细控制和合规要求。
从 Demo 到生产的检查清单
| 阶段 | 必须完成 | 验证方式 |
|---|---|---|
| 功能验证 | 所有核心路径测试通过 | 自动化测试套件 |
| 成本评估 | 预估单次调用成本和月度预算 | 压测 + Token 统计 |
| 安全审计 | 输入/输出过滤、权限最小化 | 安全扫描 + 人工 review |
| 监控就绪 | 关键指标有 dashboard、告警配置完成 | 模拟故障验证告警 |
| 回滚方案 | 有明确的版本回滚流程 | 实际演练一次 |
| 文档 | API 文档、运维手册、应急预案 | 新人能独立操作 |