在AI获客场景中,意图识别是整个系统的核心关口。用户的每一条咨询,都需要被准确判断意向等级,才能决定后续跟进策略。本文分享一套在实际业务中跑通的意图识别工程方案——两级漏斗架构。
一、为什么需要两级漏斗
一开始我们尝试用单层模型做意图识别:把用户对话输入一个分类模型,直接输出意向等级。这个方案看起来简单,但实际跑下来有两个问题。
第一个问题是成本和延迟。如果用大模型做零样本分类,每条对话都要调用一次API,按token计费,成本很高。而且大模型推理延迟在200-500ms,用户体验不好。
第二个问题是精度和召回率的矛盾。单层模型要在"不漏掉高意向"和"不误判太多无效"之间做权衡。阈值设高了会漏掉表达含蓄的高意向用户,阈值设低了又会把很多无效对话放进来。
两级漏斗的思路是:第一层做粗筛,用规则快速过滤明显无效的对话;第二层做精筛,用模型判断真实意向。两层各有分工,组合使用。
二、粗筛层的规则引擎设计
粗筛层用规则引擎实现,目标是把70%的无效对话挡在外面,减少模型层的计算压力。核心是三类规则的组合。
2.1 正则匹配规则
用于识别纯表情、纯符号、联系方式等明确无效的模式。这类规则执行速度快,适合处理模式固定的无效内容。
def regex_filter(message):
# 纯表情/符号
if re.match(r'^[\W_]+$', message.strip()):
return False
# 手机号/微信号
if re.search(r'1[3-9]\d{9}', message):
return False
return True
2.2 关键词黑名单
覆盖与业务无关的高频话题。黑名单不能太宽,否则会误杀正常咨询。维护方法是定期复盘被误判的对话,把误杀词从黑名单中移除。
黑名单的更新频率建议每周一次,重点关注新增的网络流行语和无关话题。
2.3 对话轮次判断
单轮且无实质内容的对话直接过滤,多轮对话才进入精筛层。因为高意向用户通常会有追问,而闲聊用户往往只发一条消息就消失。
数据显示,超过3轮的对话中,高意向占比是单轮对话的4.7倍。
三、精筛层的模型设计
精筛层用文本分类模型,输入是完整对话上下文,输出是意向等级(高/中/低/无效)。
3.1 模型选型
用小模型做垂直领域微调,比用大模型零样本判断更划算——成本低、延迟小,而且针对获客场景做过优化,准确率更高。
微调数据来自历史对话的人工标注。标注标准要明确:
- 高意向:明确表达购买或合作意愿
- 中意向:有需求但在犹豫
- 低意向:泛泛了解
- 无效:闲聊或无关话题
3.2 标注一致性控制
标注过程中最大的坑是标准不统一。不同标注员对"中意向"的理解差异很大,导致模型学习到模糊的边界。
解决方案是写详细的标注手册,每个等级配5个正例和5个反例,标注前先做校准测试。两个标注员标注同一批数据,一致性达到85%以上才开始正式标注。
3.3 上下文窗口设计
精筛层的输入要包含完整对话历史,而不是只看最后一条消息。因为在获客场景中,对话的演进过程比单条消息更能反映真实意向。
实测数据显示,只看最后一条消息的模型,准确率比包含完整对话历史的模型低8个百分点。
四、迭代与监控体系
两级漏斗不是上线就完事,需要持续迭代。我们建立了完整的迭代链路:
- 每天自动收集模型判断错误的对话
- 每周人工标注一批新数据
- 每月重新微调一次模型
- A/B测试新版本效果
- 全量上线
这个链路里最容易被忽略的是A/B测试。直接全量上线新版本,如果效果不好,已经影响了业务。必须先小流量灰度,确认新版本效果不劣于旧版本,再逐步全量。
五、效果指标与调优方向
上线后核心监控四个指标:
| 指标 | 含义 | 目标值 |
|---|---|---|
| 有效线索率 | 筛出的高意向中真正有效的比例 | 90%+ |
| 误判率 | 高意向被误判为无效的比例 | <5% |
| 粗筛保留率 | 进入精筛层的对话占比 | 30%左右 |
| 平均延迟 | 单条对话处理时间 | <200ms |
调优方向上,目前还有两个可以优化的点:一是引入强化学习做实时调整,根据销售的反馈在线更新模型;二是引入多模态识别,处理用户发图片、语音的场景。
最后说两句
两级漏斗本质上是"分层处理"这个通用工程思想在获客场景的应用。把明显简单的问题用简单方法解决,把复杂问题留给复杂模型,整体效率和效果都会更好。
这个思路不只适用于获客筛选,任何需要处理大量请求、其中大部分是简单情况的场景,都可以套用两级漏斗的架构。
本文为技术科普,不构成任何商业建议。