← 返回博客列表

AI Agent 与传统工程的边界:什么时候不该用 Agent

为什么需要讨论这个问题

2026 年,Agent 已经从概念验证走向生产。但在一线落地中,一个反复出现的问题是:团队把本该用 if-else 解决的事情交给了 LLM Agent,结果得到的是更高的延迟、更难调试的系统、以及无法预测的成本。

Agent 的核心价值在于处理开放域、模糊输入、需要多步推理的任务。如果你的问题是封闭的、确定性的、可穷举的,引入 Agent 就是在用大炮打蚊子。

决策框架:5 个维度判断是否需要 Agent

在决定是否引入 Agent 前,用这个框架快速评估:

维度适合 Agent适合传统工程
输入确定性自然语言、模糊意图结构化参数、枚举值
分支复杂度组合爆炸、无法穷举有限分支、可用规则覆盖
容错要求允许 80-95% 准确率要求 100% 正确(金融、医疗)
延迟敏感度可接受 2-10s 响应要求 <200ms
可解释性过程可追溯即可需要确定性审计链

经验法则:如果 5 个维度中有 3 个以上落在”适合传统工程”列,就不该用 Agent。

6 个不该用 Agent 的典型场景

场景 1:确定性的数据转换

# ❌ 用 Agent:把 CSV 日期格式从 MM/DD/YYYY 转成 ISO
# "请帮我把这个日期转换格式" → LLM 调用 → 解析 → 输出
# 成本:~0.002$/次,延迟 800ms,偶尔格式错误

# ✅ 传统方案:3 行代码,确定性,零成本
from datetime import datetime

def convert_date(date_str: str) -> str:
    return datetime.strptime(date_str, "%m/%d/%Y").strftime("%Y-%m-%d")

判断依据:输入格式固定、转换规则明确、零容错空间。

场景 2:有限状态机可覆盖的工作流

订单状态流转(待支付 → 已支付 → 已发货 → 已完成 → 退款中)这类有限状态的业务逻辑,用 Agent 处理是典型的过度设计:

# ❌ Agent 方案:LLM 判断"当前状态能不能流转到目标状态"
# 问题:hallucination 可能让非法状态转换通过

# ✅ 状态机方案:穷举合法转换,编译期保证正确性
VALID_TRANSITIONS = {
    "pending": ["paid", "cancelled"],
    "paid": ["shipped", "refunding"],
    "shipped": ["completed", "refunding"],
    "completed": ["refunding"],
    "refunding": ["refunded"],
}

def can_transition(current: str, target: str) -> bool:
    return target in VALID_TRANSITIONS.get(current, [])

场景 3:高频低价值的模板填充

发送通知邮件、生成固定格式报表、填充合同模板——这些任务的”智能”部分接近于零。每次调用 LLM 去”生成”一封格式固定的邮件,本质上是在为确定性任务支付不确定性的代价。

// ❌ Agent:"请帮用户生成一封发货通知邮件"
// 成本:0.003$/封 × 10000 封/天 = 30$/天,还有格式出错风险

// ✅ 模板引擎:Mustache / Jinja2,零边际成本
const template = `尊敬的 {{name}},您的订单 {{orderId}} 已发货,
快递单号:{{trackingNo}},预计 {{eta}} 送达。`;

场景 4:需要硬实时保证的路径

交易撮合、实时风控决策(<10ms)、高频 API 网关路由——这些场景对延迟的要求决定了 LLM 不可能参与热路径。即使是最快的模型推理也需要 200ms+。

场景 5:合规性要求确定性审计的环节

银行交易记录、医疗处方校验、税务计算——这些场景需要 每一步决策都可追溯到明确的规则。Agent 的”思考过程”不能替代合规审计链。

场景 6:团队没有 LLM 运维能力

Agent 投产后需要持续的 prompt 调优、模型版本管理、成本监控、异常处理。如果团队没有这些能力储备,Agent 上线后会迅速变成一个黑盒——出了问题没人能修。

混合架构:Agent 只负责”模糊地带”

最佳实践不是二选一,而是让 Agent 只处理确定性工程无法覆盖的部分:

用户输入(自然语言)


┌─────────────┐
│  意图识别   │ ← Agent(模糊 → 结构化)
└─────────────┘

    ▼ 结构化指令
┌─────────────┐
│  业务逻辑   │ ← 传统代码(确定性执行)
└─────────────┘


┌─────────────┐
│  结果包装   │ ← 模板 or Agent(看是否需要个性化表达)
└─────────────┘

这个模式的核心思想:Agent 做翻译(自然语言 → 结构化指令),传统代码做执行。这样你得到了 Agent 的灵活性,又保留了确定性系统的可靠性。

# 实战示例:Agent 识别意图,传统代码执行
async def handle_user_request(user_input: str):
    # Agent 负责:理解模糊输入
    intent = await llm_classify(user_input)
    # intent = {"action": "refund", "order_id": "ORD-123", "reason": "quality"}

    # 确定性代码负责:执行业务逻辑
    if intent["action"] == "refund":
        result = refund_service.process(
            order_id=intent["order_id"],
            reason=intent["reason"]
        )
        # 校验、状态机、数据库操作——全是确定性的

    return result

选型 Checklist

在项目启动时,用这个清单过一遍每个功能模块:

  • 输入是自然语言还是结构化数据?
  • 业务规则能否在 50 个 if-else 内穷举?
  • 错误结果的代价是什么?(用户体验差 vs 资金损失)
  • 延迟预算是多少?
  • 团队是否有 LLM 运维能力(prompt 调优、成本监控、AB 测试)?
  • 这个功能的调用频率和单次成本算出的月账单可接受吗?

总结

Agent 是工程师工具箱里的一把锤子——一把非常昂贵、偶尔走火的锤子。用对地方它威力巨大,用错地方它只会增加系统的不确定性和运维负担。

三条底线原则:

  1. 确定性优先:能用规则解决的,不要用概率解决
  2. Agent 做翻译,代码做执行:把 Agent 限制在”理解”层,不让它参与”执行”层
  3. 算账:每个 Agent 调用都有成本,乘以调用频率后看月账单是否合理

把 Agent 用在刀刃上,才是真正的 AI 工程化。