AI Agent 拆开看就是 if 语句?我写了个对照实验,发现真正的问题在别处
前两天 dev.to 热榜第一的文章说,大部分 AI Agent 拆开看就是穿着风衣的 if 语句。评论区吵成一片,一半人狂点头,一半人骂作者不懂装懂。
我觉得两边说的都不是重点。所以干脆自己动手,写了个 60 行的对照实验:同一个客服值班任务,一个用 if/else 写,一个接大模型,喂同样六条消息,看看差距到底在哪、又在哪一边栽跟头。

先说结论
规则版和 LLM 版在"常规消息"上打平,真正的差距全在长尾消息上。但 LLM 版也绝不是碾压——它赢的方式很危险,这个后面细说。
实验设计
任务设定成电商客服值班助手,六条消息分两档:
前三条是常规消息,特征明显:服务器故障报告、带订单号的物流查询、退款咨询。这种消息一个正则就能路由,属于规则的主场。
后三条是长尾消息,我故意写成真实用户会打出来的那种话——不带关键词,话里还套着话:
用户说付款了但订单还是待支付,后台看已经扣款了,
这算重复扣款吗?我该怎么跟他解释
你们那个积分是不是弄反了,消费反而涨积分,而且我上次
兑换的东西显示已发货但物流20天没动了
我把身份证照片发给客服了,现在担心隐私问题,能撤回吗
规则版就是典型"AI Agent"的真身:三个 if/elif 配正则,匹配"挂了/打不开"走工单,匹配订单号格式走查询,命中"退款"走话术,其他全部进兜底转人工。
def rule_agent(msg):
if re.search(r"挂|打不开|宕机|崩溃", msg):
return "[工单已创建] 已通知运维排查服务器,请稍候。"
elif re.search(r"订单\s*\d{8}-?\d+", msg):
num = re.search(r"\d{8}-?\d+", msg).group()
return f"[自动查询] 订单 {num} 状态:运输中,预计明天送达。"
elif "退款" in msg:
return "[自动应答] 退款请在订单页点击'申请退款',1-3个工作日到账。"
else:
return "[兜底] 抱歉,我不太明白您的意思。已转人工。"
LLM 版就一行系统提示词加一次模型调用,用的 GLM-5.3-flash(图个便宜,这种任务犯不着上旗舰模型)。
常规消息:平局,但平得有意义
三条常规消息两边都接住了。但注意规则版答的是"标准答案",LLM 版答的是"人话"。比如服务器故障这条:
规则版:[工单已创建] 已通知运维排查服务器,请稍候。
LLM 版:非常抱歉给您带来不便!服务器故障已紧急上报技术团队加急处理,请您稍后再试。
如果客服考核的是响应模板一致性,规则版完胜。如果考核的是用户感受,LLM 版至少听起来像个活人。这一局没有输家,只是风格不同。
长尾消息:真正的分水岭
三条长尾消息,规则版全部兜底转人工,0% 处理率。LLM 版全部给出了具体处理建议,比如那条"重复扣款"的,它回的是:
"多为支付同步延迟,不算重复扣款。可先安抚并让用户等10分钟刷新,仍未更新则截图上报技术核实。"
这条回复让我后背有点凉。因为它不是在复读话术——它真的理解了"扣款成功但订单未更新"这个状态组合,还给出了带时间窗口的处理步骤。你翻遍全网的客服话术库,都找不到这句话的原文。
但 LLM 版赢得并不干净
细看它对身份证那条的回复:"若在撤回时限内可自行撤回"——你的系统里有撤回时限这个功能吗?我的实验里没有。它是顺着用户的话编了一个合理但可能不存在的功能。
规则版永远不会犯这种错,因为它只会说写在代码里的话。这就是那篇"if 语句"文章真正的价值:规则系统不说谎,但也不思考;LLM 会思考,但会顺手编造。两边都不是省油的灯。
所以正确的做法是什么
我自己的结论是:别二选一,分层。常规高频消息走规则(便宜、稳定、可审计),长尾消息才放行给 LLM,而且 LLM 的回复要过一道"引用是否存在"的校验——它可以组织语言,不能发明功能。
那个说"AI Agent 就是 if 语句"的作者没说错,他只是漏了后半句:好的 Agent 是 if 语句负责 80% 的确定性,模型负责剩下 20% 的混沌,并且永远有人盯着那 20%。
完整实验代码不到 70 行,两条路线加起来一屏就能放下。你自己的客服机器人是哪种,测一下就知道了——长尾消息那条线,比任何跑分都更能暴露系统的真实水位。