【0样本起手做多标签分类任务】

背景

当产品经理拍给你20个新需求,但训练数据只有3条微信聊天记录时…

作为算法工程师,你一定经历过这样的深夜:

  1. 产品突然拿着截图冲过来:“这个用户说’套餐贵了’,我们要立刻识别所有价格敏感型客户!”
  2. 你看着后台数据两眼发黑——相关对话记录?不到10条。标注样本?不存在的。
  3. 想请GPT出马?每秒200+的并发请求直接让API成本爆表
  4. 试图训练小模型?BERT对着3个样本直摇头:“臣妾做不到啊!”
更可怕的是,这种需求从来不会单独出现:

● 上周要识别"投诉倾向"
● 昨天新增"促销敏感度"
● 今天又要检测"离网风险"
● 每个任务都像在要求你用一根火柴点燃湿木头

老板们总幻想能直接复刻ChatGPT的智能,但现实是:

● 小模型:便宜但需要手把手教
● 大模型:能力强但每次咨询都要刷卡
● 而你,是那个要在预算为0时变出魔术的救火队员
以上来自deepseek的倾情奉献

具体到场景上几个核心难点

场景痛点:零样本条件下的意图识别困境

在对话系统中,意图识别是决定后续流程效率的核心环节。现有的单一解决方案都存在比较大的问题:
● LLM方案:响应延迟高,难以应对高QPS场景(如200+并发请求),成本高。
● 小模型方案:需要大量标注数据训练(通常需5000+样本/类),且模型容量限制准确率天花板

而现实业务场景往往呈现更严峻的挑战:
  1. 冷启动困境:新业务需求通常仅有概念定义 + 零星样本(<10条)
  2. 规模限制:需要同时处理20+新增分类任务,或不断追加新的分类
  3. 成本约束:直接使用LLM标注海量历史数据会产生极高计算成本
当前主流的小模型过滤+LLM精校方案,在初始阶段就会遭遇:

● 样本质量陷阱:LLM标注的初始数据准确率常低于40%(提示工程也同样需要难样本帮助打磨)
● 资源黑洞:处理百万级语料库时,单次标注成本超过很高
● 误差累积:多任务并发时错误样本相互污染

最近正好做了这样一个工程,这个工程整体可以分为两个主要阶段:推理流程和生产流程。虽然推理流程相对简单,但生产流程却充满了挑战和技巧。下面我将简要介绍这个项目的核心思路和关键点。

项目架构:

这个项目的核心是一个双阶段迭代系统

阶段一:冷启动(LLM+表征模型)

● 方法:LLM产生例句,表征模型做扩源,LLM做标注
● 产出:初步标注的种子样本库

阶段二:螺旋升级(小模型+LLM协同)

● 第一步:用种子样本训练轻量级分类器
● 第二步:小模型做流量过滤(减少LLM的运算量),LLM做推断
● 第三步:将LLM标注的高质量样本反哺小模型训练
● 循环:持续迭代,

本文的重点

上面的系统设计并不出奇,做过NLP的算法工程师大都会考虑类似的系统。本文的标注重点主要在这个系统中的几个关乎是否成功的要点:

  1. 样本挖掘的时候如何扩展出更多样本(一个使用的trick)
  2. 文本模型怎么做更灵活(一个简单Transform 分类头改造)
  3. 循环迭代中 (一些经验碎碎念)
    a. 如何避免死循环
    b. 提示工程的优化逻辑

本篇争取先把第一个trick说清楚,其他章节后面再更。

样本挖掘如何扩展出更多样本

我相信大部分NLP工程师在这个任务上的选择都是下面这个路径。

种子扩源–>大模型清洗–>再扩源…

我们先假设一个简单的业务需求

类别名称:客户需要服务-需要学习资料
类别描述:
可能需要的学习资料包括:客户明确表达需要某某科目学习资料,知识点清单,考情分析,中考政策解读,思维导图,试题,作文书,电子版资料,试卷等带有电子资料性质的都算

除此以外,我们还有一个完全没有标注的样本池(以之前项目的真实样本池为例,有7W条样本)。这就是我们开局的所有装备了。

0样本起手时表征扩源的困境

基于表征相似度的样本扩展方法在这里会有一个困境——缺乏种子样本时,表征模型无法建立有效的语义锚点,抓取到的相似样本非常有限。
这个时候可以诉诸大语言模型(LLM)生成初始样本,但这一路径存在显著瓶颈:如何确保生成样本的语义多样性

这里看一个简单的提示词

你的任务是根据给定的定义A生成例句
定义A是"""类别名称:客户需要服务-需要学习资料
类别描述:
可能需要的学习资料包括:客户明确表达需要某某科目学习资料,知识点清单,考情分析,中考政策解读,思维导图,试题,作文书,电子版资料,试卷等带有电子资料性质的都算
"""
现在你要展开头脑风暴,生成50种不一样的,在教育场景中会出现的,客户是学生家长的,在微信这种短消息沟通中,符合定义A的场景下会说出来的话。

以通义千问的API为例,看看得到的结果。仔细观察以下句子,你会发现,大模型给出的例句在句式上高度相似,基本上都是【想要的同意表达】+【资料的描述】。

根据定义A,以下是50种在高中教育场景中学生家长可能会在微信短消息沟通中提到的需求学习资料的话语示例:

1. “请问有最新的数学高考模拟试题吗?”
2. “能提供一些化学科目知识点总结吗?”
3. “想获取物理学科的思维导图。”
4. “有关于历史中考政策解读的材料吗?”
5. “需要语文作文书推荐。”
6. “有没有电子版的历史大事年表?”
7. “可以分享一下英语语法专项练习题吗?”
8. “求推荐生物科目的复习资料。”
9. “寻找地理考情分析资料。”
10. “想要政治课的知识点清单。”
11. “请提供最新版的数学习题集。”
12. “希望能得到化学实验操作指南。”
13. “找寻物理考试重点解析。”
14. “有关于古诗文背诵技巧的文档吗?”
15. “需要数学公式的整理表格。”
16. “寻求英语听力训练材料。”
17. “询问是否有生物遗传学专题讲义。”
18. “想要地理气候类型分布图。”
19. “寻找关于中国近现代史的讲解视频。”
20. “希望获取政治经济学基础知识概览。”
21. “请发送一份化学方程式记忆法。”
22. “求分享物理电学部分的习题解答。”
23. “需要语文写作指导手册。”
24. “能否提供一份高考数学冲刺计划?”
25. “寻找英语词汇速记方法。”
26. “想知道如何准备物理实验考试。”
27. “求推荐适合高中生阅读的英文书籍。”
28. “希望能够看到生物细胞结构图解。”
29. “寻找地理世界地图高清版。”
30. “需要政治哲学经典论述摘录。”
31. “请问哪里能找到化学有机合成的教程?”
32. “想了解物理光学原理及其应用实例。”
33. “寻求语文古代文学作品选读。”
34. “需要英语口语练习对话脚本。”
35. “希望能够获得生物遗传与进化的学习资料。”
36. “寻找地理自然环境变化的研究报告。”
37. “需要政治科学基础概念汇总。”
38. “请提供一份化学元素周期表详细解释。”
39. “寻找物理力学定律的实际案例分析。”
40. “需要语文阅读理解能力提升策略。”
41. “能否分享英语新题型应对策略?”
42. “寻找生物基因编辑技术简介。”
43. “希望获取地理自然灾害预防知识。”
44. “需要政治国际关系理论概述。”
45. “请问有关于化学热力学的学习资源吗?”
46. “想找到物理电磁感应现象的教学视频。”
47. “需要语文修辞手法运用实例。”
48. “寻找英语学术论文写作指南。”
49. “希望能够看到生物生态系统平衡分析。”
50. “寻找地理地球运动规律的动画演示。” 

这些句子覆盖了多种可能的学习资料需求,并考虑到了实际沟通中的表达方式。

诚然,这时候可以继续优化提示工程,比如注入更加详细的场景说明,用外骨骼的形式注入随机句法要求,在生成句子后进行二次改写等等方案。但是这不是我们的目标,也不应在这个场景上花费很多时间

这个种子句子列表的召回效果如何?

以上例句只能从7.4W的样本池里找到93句相似句子,还不到种子句子数量的两倍。(这里预设了大意相近的阈值)
本文中用的表征模型是:BGE-small-zh(BGE模型主页)计算的欧式距离,后面将使用faiss-gpu库的faiss.IndexFlatL2 来建立索引和检索。(Stella在这个场景下效果也不错,这里不纠结。)
召回结果如(随机抽了一些)

['主要是想让她语文写作提升一下',
 '主要是数学,还有物理',
 '作文,阅读',
 '先报物理试试看',
 '准备学物理',
 '化学有吗',
 '化学现在不太行,',
 '化学资料已经有了,谢谢。',
 '单词速记方法',
 '可能语文阅读理解比较弱',
 '听听物理课',
 '嗯嗯,我就是想听听语文阅读理解题的做题技巧',
 '嗯它是需要有一个阅读量的,',
 '嗯,就主要是阅读理解,',
 '基础知识,阅读理解',
 '多读书是一方面,还是要有技巧',
 '它是语文是需要有阅读量的。',
 '对语文有很大的问题,',
 '对,一个是古古文阅读,还有个古诗呃,文言文阅读,',
 '应该基础题和作文,',
 '我是准备啊,我是准备先报物理,',
 '所以才说要提升语文的阅读和作文',
 '政治也要背很多东西。',
 '数学、物理',
 '数学全有,',
 '数学课表个有',
 '数学,物理',
 '数学,物理,',
 '文学常识背诵方面,阅读理解',
 '有化学吗']

其实能看到,有很多样本跟期望的还是有明显差别的。

分析

为什么上面的例子有很多不相似句子呢?

由于transformer强大的学习能力,文本的句子表征不仅包括句子里词的意思,也包括句子的句式、态度等信息。
抽上面LLM生成的某个句子举个例子

有关于古诗文背诵技巧的文档吗?

这个句子和"有资料吗?" 这一句的距离是 0.3194 和 “有吗” 这一句的距离是 0.3040。这一结果比较好的展现了句式(疑问句)对表征相似度的影响。

这里还有个思路就是 【我换一个表征模型好了】,但如果你看到BGE的训练任务你会发现,换一个表现很好的其他表征模型(不是自己训的),他的训练任务逻辑跟BGE差异并不大,表征表现可能只是在句子、总结、逻辑与或非、关键实体、句式等方面上的重点倾向略有不同,不会带来本质的变化。而且我们要再次问自己那个问题有必要在这个问题上花时间吗?

不花时间有简单的方案吗?

如果我把句子改成这样:

有古诗文/学习/背诵/做题/技巧资料吗

这个句子和“有资料吗”这一句的距离是 0.2744 和 原句“有关于古诗文背诵技巧的文档吗?” 的距离是 0.1139 。显然这个句子更适合作为检索句子的锚点。
这样,我们只是通过简单的关键词堆叠,放大了“资料内容”在句子中的重要性
而且,只要我们改让LLM生成若干个相关的关键词,然后再取这些关键的随机组合,就能快速生成大量种子句子。
比如生成了50个关键词之后,我们用这个函数

def generate_unique_combinations(c1, c2, c3):
	""" c1,c2,c3 分别是三个生成的符合当前定义要求的关键词
	这个函数限制了组合长度,只要求生成这三个关键词的所有组合结果
	"""
    # 将输入列表转换为集合以去除重复元素
    set_c1 = set(c1)
    set_c2 = set(c2)
    set_c3 = set(c3)
    
    # 生成所有三项的组合
    three_combinations = set(itertools.combinations(set_c1 | set_c2 | set_c3, 3))
    
    # 生成所有两项的组合
    two_combinations_c1_c2 = set(itertools.combinations(set_c1 | set_c2, 2))
    two_combinations_c1_c3 = set(itertools.combinations(set_c1 | set_c3, 2))
    two_combinations_c2_c3 = set(itertools.combinations(set_c2 | set_c3, 2))
    
    # 合并所有的组合
    all_combinations = three_combinations | two_combinations_c1_c2 | two_combinations_c1_c3 | two_combinations_c2_c3
    
    return all_combinations

更加激进的用更多的关键词生成组合关键句在实践中并没有达到更好的效果,因此在这里只用了3个关键词组成一个种子句子的方案。

这个方法能保证更大范围的召回吗?

诚然,上面的方法会让启动非常轻,但能保证效果吗?
这个问题单用检索结果很难说明白。我这里将BGE-small的表征做了一个简单的PCA处理,卡到前两维上。(诚然,有不少更好的方法来展现表征空间,但我这里只是把大意展示出来。)
我们来看看 这两种方法(方法1:LLM生成种子句子)和(方法2:生成种子关键词,再用关键词随机组合堆叠形成种子句子)对样本表征空间的覆盖
左图是方法1,右图是方法2,两张图的x,y轴分别是两个PCA的主维度
左图是方法1,右图是方法2,两张图的x,y轴分别是两个PCA的主维度
图上可以看到,生成的种子句子直接盖住了空间的某个子区域。

那召回结果的对比呢?

同样,左图是方法1的召回结果,右图是方法2的召回结果,能够非常直观的看到方法2的召回结果也覆盖了语义空间的大量相关区域
召回结果图示
可以看到,本文的这个小trick可以在0样本起手的时候,快速的让我们有大量的启动样本用于后续的LLM标注。

实践中的tips,LLM生成的关键词有时候会不符合需求,让业务同学审核一下,顺便让他们再拍拍脑袋给点关键词,速度会更快。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值