前言:Agent 能跑 Demo,但能跑生产吗?
前几周我们写了手搓 Agent 系列——从 ReAct 到 MCP,技术栈完整。但技术能跑 Demo 是一个问题,能跑生产是另一个问题。
最近三个真实案例值得关注:
- 首钢:热轧产线计划单审核从 1 小时缩到秒级,安全隐患识别效率提升 60%
- 京东云:通过推理优化,同样业务从 2700 元降到 10 元
- CSDN 创始人:预判未来一两年 99% 的代码可能由 AI 智能体生成
这篇文章讲的是 Demo 到生产的鸿沟怎么跨。
一、Demo 和生产之间差了什么?
| 维度 | Demo 阶段 | 生产阶段 |
|---|---|---|
| 任务确定性 | "帮我分析这段代码" | "分析 PR #342 的安全性,只关注 SQL 注入和 XSS,输出 JSON 格式" |
| 错误处理 | 打印异常信息 | 自动重试→降级→告警→人工介入 |
| 成本 | 不管 | 每次调用追踪到分,日预算硬上限 |
| 可观测性 | print 语句 | 结构化日志 + 链路追踪 + 成本仪表盘 |
| 人机协作 | 全自动 | 高风险操作人工审批,低风险自动 |
| 集成方式 | 命令行 | REST API / Webhook / 企微/钉钉/飞书 |
二、任务拆分:不要让 Agent 一口吃成胖子
生产环境中最常见的错误:给 Agent 一个模糊的大任务,期待它自己搞定一切。
错误示范
"帮我优化这个系统的性能"
Agent 不知道从哪里开始,可能会:读取所有文件 → 分析所有代码 → 给出 5000 字的建议 → Token 超限 → 任务失败。
正确做法:任务原子化
class TaskDecomposer:
"""将大任务拆分为 Agent 可执行的原子任务"""
def decompose(self, task: str) -> list[dict]:
"""LLM 辅助拆分 + 人工确认"""
prompt = f"""将以下任务拆分为 Agent 可执行的原子步骤。
每个步骤应:单一职责、有明确输入输出、可独立验证。
任务:{task}
输出 JSON 数组,每项包含:
- id: 步骤编号
- title: 简短描述
- input: 需要的输入数据
- output: 期望的输出
- tool: 需要的工具
- risk: low/medium/high
"""
# 实际调用 LLM 获取拆分结果
steps = self._call_llm(prompt)
# 高风险步骤标记需要人工确认
for s in steps:
if s["risk"] == "high":
s["require_approval"] = True
return steps
以"优化系统性能"为例,正确拆分为:
Step 1: 获取慢查询日志(工具:read_log, 风险:low)
Step 2: 分析TOP 5 慢查询(工具:analyze_sql, 风险:low)
Step 3: 为每个慢查询生成优化SQL(工具:generate_sql, 风险:medium)
Step 4: 检查优化SQL是否安全(工具:validate_sql, 风险:high,需确认)
Step 5: 输出优化报告(工具:write_report, 风险:low)
三、成本控制:从 2700 到 10 元
京东云的实际案例:同样的业务逻辑,通过以下优化把成本从 2700 元降到 10 元。
| 优化手段 | 节省 | 原理 |
|---|---|---|
| 模型降级 | 60% | 80% 的请求不需要旗舰模型 |
| 缓存复用 | 25% | 相似问题直接返回缓存结果 |
| Prompt 精简 | 10% | 去掉冗余指令,Token 减半 |
| 批量合并 | 5% | 多个小请求合并为一次大请求 |
class ProductionCostController:
"""生产成本控制器"""
def __init__(self, daily_budget: float = 50.0):
self.daily_budget = daily_budget
self.spent_today = 0.0
self.cache = {}
def before_call(self, task: str, complexity: str) -> str:
"""调用前检查:预算 + 缓存 + 模型选择"""
# 1. 预算检查
if self.spent_today >= self.daily_budget:
return "BUDGET_EXCEEDED"
# 2. 缓存命中
cache_key = hashlib.md5(task.encode()).hexdigest()
if cache_key in self.cache:
return "CACHE_HIT"
# 3. 模型选择
if complexity == "low":
return "luna" # $1/1M
elif complexity == "medium":
return "terra" # $2.5/1M
else:
return "sol" # $5/1M
def after_call(self, task: str, result: str, cost: float):
"""调用后:记录成本 + 缓存结果"""
self.spent_today += cost
cache_key = hashlib.md5(task.encode()).hexdigest()
self.cache[cache_key] = {"result": result, "cost": cost, "time": time.time()}
四、人机协作:不要全自动
生产环境中,Agent 应该能区分"可以自己做"和"需要问人"。
```python
class HumanInTheLoop:
"""人机协作决策器"""
AUTO_APPROVE_RISK = ["low"]
REQUIRE_APPROVAL_RISK = ["high", "critical"]
ASK_IF_UNCERTAIN_RISK = ["medium"]
def decide(self, action: dict, confidence: float) -> str:
"""返回: auto / ask / block"""
risk = action.get("risk", "medium")
if risk in self.AUTO_APPROVE_RISK and confidence > 0.8:
return "auto"
if risk in self.REQUIRE_APPROVAL_RISK:
return "block" # 必须人工审批
if risk in self.ASK_IF_UNCERTAIN_RISK and confidence 如果觉得有用,欢迎 **点赞 + 收藏 + 关注**。手搓 Agent 系列已完结,本文是生产落地篇的补充。
🔜 下午:AI 编程工具市场格局——ChatGPT 份额跌破 50% 后的生态变化