先把结论甩在前面:让一个智能体什么都能干的最省事办法,不是把所有逻辑塞进一个超长 prompt,而是先花几十毫秒判断用户这句话「想干嘛」,再把它甩给对应的分支去处理。意图识别在前,分流在后。听着像废话,但我前后返工了三版才真信这套。
起因挺琐碎的。三月份我给团队的客服机器人加功能,本来只回退换货政策,后来产品想让它顺带查物流、查发票、再答点常见问题。我图省事,直接往 system prompt 里堆,堆到大概一千多字的时候,这玩意儿开始抽风——用户问「我那单到哪了」,它给我背退货流程;问发票它又去查物流。
为啥会这样?我后来想明白了。模型每次回答,都是在它脑子里那一坨上下文里做概率采样。你把退货、物流、发票、闲聊四套规则全糊在一个上下文里,它们的语义是会互相渗的。「发票」和「物流」都跟订单号沾边,token 一近,注意力就串台。说白了,上下文越杂,模型越容易抓错重点。这跟人也像,你同时盯四件事,总有一件办岔。
所以分流的本质,是给模型「减负」。先用一个轻量的判断,把这句话归到某一类——退货 / 物流 / 发票 / 闲聊;归好类,再进对应分支。而每个分支里,上下文是干净的:查物流的分支只挂物流相关的工具和提示词,不掺别的。模型在一个窄上下文里干一件窄的事,准头肉眼可见地回来了。
具体怎么判这个意图?我试过两条路。
一是关键词 / 正则硬匹配。命中「退」「换」就走退货。快,几乎零延迟,零成本。但太脆——用户来一句「这鞋穿着挤脚能咋办」,没有「退」「换」二字,直接漏。
二是丢给一个小模型做分类,让它输出个标签。这条准得多,能扛口语和错别字,代价是多一次模型调用,慢个几百毫秒,还得花钱。
我现在的折中是混着来:高频又规整的意图(查物流这种基本带订单号)走规则,先拦一道;规则拿不准的兜底再交给模型分类。八成请求被规则截胡,省了八成的分类调用。
判别方式 | 延迟 | 准头 | 适合 |
关键词/正则 | 极低 | 一般,怕口语 | 格式固定的高频意图 |
小模型分类 | 几百ms | 高 | 自然语言、模糊表达 |
规则+模型兜底 | 看命中率 | 综合最好 | 大多数真实场景 |
光说原理有点虚,讲讲我后来怎么落的。我没再手写编排,改用了个零代码就能拖智能体的平台。把它当一张流程图来搭:入口先接一个「意图识别」节点,下面拉出四条线,每条线挂一个独立的子分支——物流分支挂上查单的工具,退货分支挂上政策知识库(RAG 我把退换货文档喂进去就行,没写一行解析代码)。拖完连线,意图识别的输出标签直接决定走哪条线。说实话我当时有点意外,这种本来要写一堆 if-else 加 prompt 拼接的活,在画布上拖一拖配一配就成了,跑通第一版大概花了我一个下午。
当然不是没坑。第一版的意图识别太死,只认四类,用户问「你们客服电话多少」直接落到闲聊分支胡扯,我后来补了个「兜底」分支专收识别不了的,转人工。还有学习曲线——节点之间的变量怎么传、判别节点的输出格式怎么对上下游,我对着文档磨了挺久才顺。它也只能干这种结构化编排的杂活,真正难的业务判断逻辑,还得我自己想清楚喂给它。
但分流这套思路是真香。智能体一旦要干超过两件事,别犹豫,先识别意图再分支,别指望一个大 prompt 包打天下。
对了,模型那层我走的讯飞星辰 MaaS,现成大模型直接调,没自己部署算力。你们做多意图智能体是怎么分流的,纯规则还是上了分类模型?评论区聊聊,我那个兜底分支还想再优化优化。