资讯动态

主动学习驱动的用户意图理解:数据策略与工程实践

发布时间:2026/10/21 14:40:07 来源:尧图企业网站定制
在AI产品团队里待过一段时间的人多半都撞过同一堵墙辛辛苦苦定义好用户的“意图范围”把标注好的数据喂给模型结果上线后发现用户根本不会按你预设的话术来提问。你准备了“查余额”“改密码”“转人工”这三类经典意图结果用户直接来一句“我钱没了怎么回事”——这到底该归到查余额还是投诉还是求助标注员犹豫了模型也懵了。这几年我在几个对话系统和智能助手项目里做用户意图理解模块最大的感受是模型结构本身反而没那么纠结真正决定上线效果的是“数据策略”。而这个策略里最被低估、但最值得花时间投入的就是主动学习。用户意图理解的主动学习策略说直白点就是让模型在“不知道该问什么样本”的时候主动开口把人力和算法资源押在最有价值的数据上用更少的标注量拿到更准的意图分类边界。它不是某个花哨的算法模块而是一整套围绕标注调度、样本采样、模型迭代的工作流。这篇文章我会把整套策略从设计思路到落地细节完整走一遍摘掉“主动学习”这个词的学术面纱讲讲怎么把它做成能日常运转的工程体系。1. 用户意图理解为什么要做主动学习先聊一个基础但关键的问题意图理解本来就属于典型的数据饥渴任务为什么常规的操作方式顶不住。1.1 标注成本与长尾分布是主要瓶颈很多做NLP的团队是从预训练模型或者大语言模型入手做意图分类以为有了强大的底座数据量就能省一点。但真实场景里意图理解跑得稳不稳看的不是头部那几个高频意图而是尾部那些“偶尔出现、但一出现就影响体验”的意图。我以自己做过的某多轮对话客服项目为例。最初我们从线上日志里筛了大约一万条用户话术做标注按人工惊讶的感觉“退款”“查物流”“开发票”这几个意图肯定占了最多量。实测下来头部十个意图确实覆盖了85%以上的线上流量但它们只占标注样本的一小部分。剩下15%的流量里意图零散而且边界模糊可能一个意图就一两条数据。这些边缘样本如果靠人工从庞大日志里去翻效率极低比大漠淘金还夸张如果干脆不标注模型在真实请求上就会频繁产生低置信度的乱猜。主动学习就是在这一步起作用的。它假设你有一个巨大的“未标注池”——比如几百万条历史用户日志但人力只能标注几千条那么与其随机采样不如让当前模型把最没把握、最像新意图的那批样本捞出来只把这些样本交给人工。目标不是“给模型更多数据”而是“给模型更让它在意的数据”。1.2 主动学习本质上是数据分配的决策问题把主动学习误当成“一个算法”是我们常见的认知偏差。从工程角度看它更像是一套数据分配策略每一轮迭代里要么选那些模型置信度极低的样本不确定性采样要么选那些能代表数据稠密区域的样本多样性采样要么两者混合着来。导向只有一个——决策边界的收敛速度。类比一下传统监督学习它是把数据、标注、训练当成流水线人闷头标模型闷头训两者在最后才碰头。主动学习则像是巡航导弹先飞一段发现自己歪了再把探测到的目标信息反馈给地面地面重新安排侦察资源导弹再飞一段。每一步都有目的性自然比盲飞命中率高。在意图理解这种类别多、类别之间界限模糊的场景里主动学习尤其合适原因有三个意图分类天然是“大量候选类别、少量高频类别”的分布长尾非常重随机采样的性价比很低。意图标注依赖专业经验内部团队运营、客服、产品的人工标注成本不低标错了还容易把模型教坏。业务意图会随促销节点、产品版本、季节等因素漂移模型要持续迭代主动学习的“动态选样”能力正好贴合“持续更新”的要求。2. 整体设计与核心方案选型拆解既然知道了“为什么要做”第二步就是把整套方案搭起来。这里我会按我自己在项目里迭代过的路径来拆包括样本池结构、查询策略选型、以及每轮迭代的细节参数。2.1 样本池与标注队列的架构设计主动学习的第一步是搭建数据基础设施。常见做法是把数据分成三块已标注集、候选池、待标注队列。已标注集当前模型训练用的全部标注数据包含意图标签和原始文本。候选池从线上日志、用户反馈、历史工单中拉取的海量未标注文本。这里要做一轮清洗和脱敏去掉纯广告、乱码、重复内容。待标注队列每次主动学习迭代中根据采样策略从候选池选出的一小批样本这批样本被送到人工标注平台去标注。在意图理解场景里我强烈建议把“代价敏感”和“类别样本数”考虑进队列设计。比如“退款”这种高影响意图宁可多标几条低置信样本也不愿意漏掉而“闲聊”这种低价值类别就尽量少标保持基础识别能力即可。还要注意候选池的时效性。我踩过的坑是候选池用上个月的日志但实际线上话术已经因为新功能上线发生了语义漂移模型迭代后对新话术的置信度预估严重失真。后来我把候选池改成周更迭代当天再随机抽一批最近3天的日志作为“新鲜样本”混进去效果提升很明显。2.2 查询策略选型不确定性、多样性与混合策略主动学习的“灵魂”是查询策略。对意图理解来说主流选项就三类每一类都有对应场景。不确定性采样Uncertainty Sampling这是最基础的一类。用当前模型对候选池里的每条样本进行预测选出那些模型最“犹豫”的样本。具体衡量方式有三种最低置信度Least Confidence样本预测概率中最高概率最低。比如模型认为某句话有35%概率是“退换货”30%概率是“投诉”那就说明它很迷糊。这类样本直接反映了模糊边界。边际置信度Margin Sampling取最高概率和第二高概率的差值差值越小越值得标注。相比最低置信度这个指标更适合类别之间容易混淆的场景因为它直接关注“模型在哪个类别之间摇摆”。熵值Entropy对所有类别的概率分布求熵熵越大就越不确定。多类别意图分类时熵能整体刻画模型对一条样本的“困惑程度”。在我的项目里多类别意图分类最常用的是熵值和边际置信度。单标签但候选意图较多时边际置信度更直观因为差值小就意味着在两个相似意图间摇摆这种样本对收敛最有价值如果既有单分类意图又有多标签分类意图那熵值更通用。多样性采样Diversity Sampling只关注不确定性的陷阱是“模型会一直挑同一类难样本”导致重复标注相似表达边界反而偏移。核心问题是候选池里有很多表面不同但语义重复的样本比如“我的包裹怎么还不来”“快递到哪了”“为什么物流没更新”这三条在意图分类器眼里其实是同一个簇。重复标注它们边际收益为零。多样性采样就是要挑出“覆盖不同语义区域”的样本让每一批待标注数据尽量不重复。常见做法是先对候选池文本做embedding向量化处理再做聚类然后从每个簇里选代表样本再结合不确定性排序。工程上我用过聚类中心法和核心集算法前者简单快捷适合意图数在几十个以内的场景后者更精确但计算开销大一些适合向量化表示已经稳定后的阶段。混合策略实际项目里纯不确定性采样或纯多样性采样都容易失衡。更稳妥的做法是比例混合70%样本用不确定性采样选出来用来精修当前边界。30%样本用多样性采样补充用来发现新的意图簇或者长尾表达。我最初在某个语音助手项目里用的是80/20后来发现新意图的召回率不够调整成70/30之后迭代三轮后OOD识别率提升了大约6个百分点新意图的发现速度也快了不少。这个比例没有绝对标准需要根据业务特点进行调参但建议以七三开作为起点。2.3 与LLM结合的预标注与辅助筛选这里必须单独说一个2024年以来的重要变化。大语言模型LLM虽然不能替代意图理解的整条流水线但在主动学习里非常适合做“预标注”和“筛选辅助”。基本思路是从候选池选出一批样本后先用LLM做一次零样本或少样本意图预测把置信度较高的样本直接作为预标注候选再由人工做快速确认只有LLM也难以判定的那部分样本才进入高成本的人工精细标注流程。这样做的成本优势非常明显。我在一个智能助手项目里做过对比引入LLM预标注后人工标注量节约了35%到40%而且准确率和纯人工标注持平。另外LLM还可以反向帮助主动学习本身把LLM驳回的低置信样本作为“纠缠池”这些样本往往意味着当前意图体系定义不清需要重新去审视意图定义而不是继续盲目做标注。这已经超出了算法层面是产品定义层面的修正工具了。3. 实操落地从冷启动到持续迭代的完整流程方案只是图纸落地才是工程。我们直接看一下从零开始把主动学习架到意图理解任务上的完整操作流程。3.1 冷启动初始化与意图体系定义主动学习不是“零样本”魔法它需要一个初始模型。冷启动阶段我们依靠三类数据建立第一版意图分类器从业务知识库、客服知识库中抽取的高频问题模板。从历史工单、帮助中心搜索词中筛出的少量代表性样本。用LLM生成的意图模板例句但需要人工审计不能直接进训练集。冷启动标注量一般控制在1000到2000条之间覆盖业务中最核心的15到20个意图。这阶段还有一个重要任务把“意图”本身定义清楚。我见过很多项目反复出现标注不一致根源是意图定义模糊。比如“我要投诉”究竟是单独的投诉意图还是“转人工”的子类在所有标注开始前必须先写一本十几页的标注规范每条意图要有明确的正例、反例、边界案例示例。3.2 迭代过程的关键参数与代码骨架冷启动模型训练完成后主动学习循环就可以跑起来了。核心流程是五个步骤对候选池全部样本计算当前模型的不确定度指标。按混合策略采样出下一批待标注样本。送交人工标注完成质检。合并新标注数据重新训练模型或增量更新。评估在固定测试集上的表现同时观测OOD样本的识别率。落到工程实现一个简化版的采样代码骨架大致是这样import numpy as np from sklearn.metrics import pairwise_distances from sentence_transformers import SentenceTransformer class ActiveLearner: def __init__(self, model, embedder, margin_weight0.7): self.model model # 当前意图分类器 self.embedder embedder # sentence embedding模型 self.margin_weight margin_weight def uncertainty_score(self, proba): # 边际置信度: 最高概率与次高概率之差越小越不确定 sorted_proba np.sort(proba, axis1)[:, ::-1] margin sorted_proba[:, 0] - sorted_proba[:, 1] return 1.0 - margin # 转换成“不确定度”越大越值得标 def diversity_rank(self, texts, k): # 先做embedding再聚类取每簇中心附近样本作为多样代表 vecs self.embedder.encode(texts) # 这里可用 KMeans 或 AgglomerativeClustering from sklearn.cluster import KMeans km KMeans(n_clustersk, random_state0).fit(vecs) centers km.cluster_centers_ batch [] for cluster_id in range(k): members np.where(km.labels_ cluster_id)[0] if len(members) 0: continue # 找到离簇中心最近的样本 dist_to_center pairwise_distances(vecs[members], [centers[cluster_id]]).ravel() batch.append(members[np.argmin(dist_to_center)]) return batch def query(self, texts, proba, batch_size): margin_scores self.uncertainty_score(proba) n_margin int(batch_size * self.margin_weight) n_diversity batch_size - n_margin # 取margin score最高的前n_margin margin_idx np.argsort(margin_scores)[::-1][:n_margin] # 从剩余样本中取多样性代表 remaining_idx list(set(range(len(texts))) - set(margin_idx)) diversity_idx self.diversity_rank([texts[i] for i in remaining_idx], n_diversity) diversity_idx [remaining_idx[i] for i in diversity_idx] return list(margin_idx) diversity_idx注意这是简化示意生产环境里还需要处理重采样、缓存、向量索引等。但核心思想在这里先把不确定度排序选出来再从剩余样本里用聚类找回一些覆盖面。3.3 标注质量与反馈闭环主动学习过程中标注质量比样本量更致命。因为模型专门挑出来的都是“难缠”样本如果标注员标注质量不过关等于把最难的数据教给模型错误答案模型会被教坏。我在流程里做了三层质检每批次标注结束后抽10%样本由第二人复核抽中样本一致率稳定在95%以上才算过。对每个意图类别建立“边界样本库”凡是模型提出来的低置信样本都会透视记录方便后续类目调整。标注平台里增加争议区域标识标注员对某条样本举棋不定时必须打上“混淆”标记由产品经理或领域专家再判断。这一批混淆样本是后续意图拆分或合并的重要依据。还有一个小技巧把上一轮模型预测结果直接展示给标注员做参考。预设标签正确时标注员只需要点确认速度能提升一倍但必须加一道权限限制——标注员可以改标签这样模型预测才不会沦为“权威答案”。3.4 评估策略离线测试与在线指标并行主动学习的迭代不能只盯着模型自己在候选池上的表现要设立固定测试集确保每轮迭代不过拟合到本轮采样的样本。我的做法是维护两个评估集固定公共测试集从历史数据中抽1000条覆盖各意图的样本永远不参与训练用于比较版本优劣。动态混淆集每次从模型容易混淆的样本中选一些累积下来单独评测。这类数据最能反映主动学习的真实收益。在线侧我会看意图理解模块带来的下游指标比如自助任务解决率、转人工请求的意图覆盖率、用户重复提问率。主动学习做得好不好最终要看这些指标而不是只盯着模型准确率。4. 多意图与OOD拒识主动学习最容易翻车的地方意图分类的进阶难点一是多意图并存二是未定义意图或叫OOD样本。主动学习在这两块的表现决定了系统离上线有多远。4.1 多意图样本的标注与主动筛选技巧真实用户的表达经常是“帮我查下上个月的话费顺便投诉信号不好”这条话术同时包含“查话费”和“投诉”两个意图。如果我们用单标签分类这类样本不管标哪个都会产生噪声。实操中我的做法是把主动学习的标注选项设置成多标签模式。采样时不光看模型最高两个类别的边际差值还要把模型对“第二潜在意图”的预测置信度纳入考量。具体来说可以训练一个多标签分类模型然后利用其输出的每个类别概率来判别如果一条样本同时有两个类别分数都超过某个阈值它就该被挑选出来。此外建议给标注规范里增加一类“多意图标记”标注员在遇到此类话术时不必硬选单一标签而是可以同时标两个意图。这样模型学会的是“并行触发”的能力而不是强行归类。4.2 OOD样本处理拒绝要比硬分类更重要意图理解系统上线后最怕的不是识别错了而是把完全不在体系内的问题硬塞到一个高置信意图里。比如用户说“我在哪能买到你们家股票”如果系统把它当成“查开户”去回答体验就崩了。主动学习可以在OOD识别上做两件事在候选池里专门注入一批“非业务”或“无关”的通用问句作为OOD负样本让主动学习选出那些模型识别不了的无关请求。设置OOD检测阈值。模型对某个样本的最高置信度如果低于阈值就归为OOD转到兜底回答或转人工。这个阈值需要用主动学习选出的难样本去校准不能拍脑袋定。我习惯的阈值校准方法是拿一轮主动学习选出的1000条低置信样本人工标注其中哪些属于体系内意图、哪些属于OOD然后画出置信度分布曲线用帕累托原则找一个平衡点——尽量不让OOD漏过同时不把过多的体系内请求推给人工。最终阈值会根据业务容忍度动态调整客服场景容忍低一点点自动处理金融咨询场景则更保守。4.3 意图体系分裂主动学习倒逼出来的类目修正迭代几轮之后你会注意到一个有意思的现象主动学习选出的模糊样本里会反复出现某一簇语义特别接近但业务含义不同的表达。比如“我要退差价”和“我想知道为什么没给我优惠”在分类模型看来高度相似但业务上一个是售后退费一个是营销咨询。这时不要把样本硬标注到现有意图里而是应该做一个动作拆分意图或合并意图。主动学习在这种细粒度意图的发现上远远优于随机抽样。如果你看到某一意图的低置信样本成簇出现大概率是该意图定义过宽需要做子意图拆分。如果两个意图的低置信样本始终重叠说明两者边界没有坚实业务依据该合并就得合并。5. 常见问题与排查技巧实录主动学习在意图理解里跑起来之后会碰到一些反复出现的坑。我整理了一下实际项目里最有代表性的几个附上排查思路和解决方案。现象可能原因排查方式与处理建议迭代两三轮后准确率不升反降采样批次里重复语义太多模型过拟合本轮分布降低不确定性采样比例增大多样性采样权重检查是否把LLM生成的模板重复赛入训练集人工标注一致性突然跌到90%以下意图定义边界已经过时标注员靠直觉标暂停迭代启动意图体系复盘补充标注规范的边界案例模型对OOD样本乱给高置信意图OOD负样本数量不足阈值设置过高在候选池注入更多通用问句重新校准阈值观察混淆矩阵中低置信区间分布新增意图召回极低多样性采样比例太小新意图表达不集中调高多样性采样比例或对向量聚类结果重点人工排查孤立簇标注人力不够队列堆积每轮批次数过大或预标注逻辑覆盖太少引入LLM预标注让标注员只做确认工作把每轮批次数量减半模型在公开测试集表现不错线上体验却很糟训练分布与线上分布偏移候选池需要加入最近日志的采样而不是用历史静态池几个实战里验证过的排查细节第一模型在主动学习迭代后对某类特定话术的置信度不断上升但有可能是数据泄漏。我曾遇到一版模型在测试集上准确率高达98%但线上毫无起色查了一圈发现是数据清洗时相同文本同时出现在训练集和测试集。处理方法是清洗阶段对所有文本做去重并且在每轮主动学习里强制追查重复样本的源头。第二标注员反馈也是一个信号。如果标注员频繁吐槽某类样本不知道该选哪个标签往往不是标注员能力问题而是我们的意图定义有问题。某医疗记录抽取项目中我们把“症状描述”和“用药反馈”的界限划得含糊标注员连续三周提供争议标记最后我们专门开了一场意图定义会重新梳理了六个子类的边界模型效果随之明显变好。第三别忽视“沉默样本”。候选池里那些模型置信度极低、但人工一看也不属于任何已有意图的样本很多人会直接丢进OOD。我建议单独立一个“新增意图候选”抽屉每轮从里面捡几条去反推业务上是否真有可能不少新功能入口的需求就是这么挖出来的。6. 一些落地前端的心得主动学习策略真正跑顺之后感受最深的不是模型指标涨了几个点而是团队的迭代节奏变了。过去我们是“标注三个月、训练一个月、上线就翻车”现在变成了“每周迭代、每轮只标几百条、随时能发现新问题”。这种节奏让产品和算法更贴近了意图体系的调整也能更快得到模型验证。这个方案还可以往几个方向扩展。一是把主动学习扩展到用户反馈信号的弱监督里比如用户点了“不满意”的服务会话作为多样化采样的一种来源二是对候选池做在线缓存和倒排索引让采样过程能从小时级缩短到分钟级为超大规模意图场景做准备三是在多模态交互场景里把用户语音转写文本和界面点击行为作为联合输入主动学习的目标会从“判断一句话的意图”扩展到“判断用户下一步操作的意图”那种系统会更有价值。如果你的团队正卡在意图标注成本上而不是卡在模型精度上那主动学习策略大概率能帮你打开局面。先别追求大而全的算法平台从小步快跑的采样循环开始跑通第一版让模型开始主动提问你很快就知道该怎么继续投入了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑