客服对话多标签生成
本章内容已接入千帆ModelBuilder线上加速营课程,一起来感受模型精调的奇妙之旅吧。
一、客服对话多标签生成介绍
在客服对话场景中,可以通过大模型分析用户与客服之间的对话信息,准确识别用户的意图和对应原因,生成对应标签为后续回复和营销策略服务。比如,用户因地址填写错误与客服沟通,说希望能够取消订单,则取消订单是意图,地址填写错误是原因。最初我们选择小模型进行多标签生成,在初期使用中展现出一定的效果,能够在较短时间内进行部署并提供基础的标签生成功能。然而,随着业务需求的日益复杂,现有的小模型在多标签生成上存在一些明显的问题和挑战:
- 标签准确率不高:小模型的标签准确率通常保持在接近80%左右,无法满足业务进一步提高准确率的期望。业务需求日益复杂,用户提出的问题多样化,小模型的识别能力有限,导致部分标签无法准确标识。
- 标注数据需求量大:训练一个有效的小模型,每个标签至少需要300个标注数据,人工成本高昂。尤其是在业务需求不断变化的情况下,标注工作量进一步增加。
- 对标签体系的依赖性强:小模型对标签体系还会有较强的依赖,一旦业务标签体系发生较大变化,例如三层标签扩展到四层标签或大规模调整标签结构,标注和训练工作需要大规模重复建设。
针对上述问题,我们提出了使用ERNIE Tiny大模型进行微调的解决方案。ERNIE Tiny大模型在语言理解能力上更强,能够在较少标注数据的情况下,达到或超过现有小模型的准确率要求。通过微调训练,ERNIE Tiny大模型能够更好地适应业务需求的变化,提高多标签生成的准确性和效率,从而更好地支持客服对话场景的应用。
二、难点问题及微调前后对比
对于客服对话多标签生成场景而言,需要大模型能够精准识别用户的意图和原因,保证模型能够做到以下两点:
- 按照指定格式(json格式)进行输出,示例:'{"意图": "xxx","原因”: "xxx"}'。
- 精准判断最有可能的客户意图以及对应的原因标签,意图和原因标签必须严格控制在给定的范围之内。
如果我们直接调用大模型,会发现可能存在如下问题:
- 难点问题1:微调前模型的输出可能并不能完全遵循指定格式进行输出,该示例将“原因”错误输出为“原因标签”的键值对,且“意图”和“原因”对应的内容均未严格控制在给定的范围之内,输出多余的文字。经过微调后的模型解决了这个问题,输出符合预期。
用户输入 | |
王琳K:欢迎光临DianCan披萨,为了给您提供更加优质的服务,请问您有什么具体的问题或需要帮助吗? 客户李先生:我刚刚下了一个订单,但是地址写错了,能帮我取消吗? 王琳K:非常抱歉给您带来困扰,我可以帮您取消订单。为了确认您的身份,需要您提供订单号或者下单时使用的电话号码,可以吗? 客户李先生:我的订单号是DC123456789,电话号码是138****1234。 王琳K:非常感谢您提供的信息,我已经找到了您的订单。现在我将为您取消该订单,请稍等片刻。 客户李先生:好的,谢谢。 王琳K:您的订单已经成功取消。如有其他问题,请随时联系我们。感谢您的理解和支持。 客户李先生:非常感谢你们的帮助,我会重新下单的。 王琳K:非常高兴能够帮助您解决问题。祝您用餐愉快!如有其他问题,请随时联系我们。 |
|
微调前的输出 | 微调后的输出 |
{ "意图": "客户意图:取消订单", "原因标签": ["地址填写错误", "订单号提供不准确"] } | { "意图": "取消订单", "原因": "地址填写错误" } |
- 难点问题2:微调前模型的输出可能存在无法精准识别客户意图和原因,无法将意图和原因标签严格控制在给定的范围之内。经过微调后的模型解决了这个问题,输出符合预期。
用户输入 | |
DianCan 自助点餐机器人:您好,欢迎光临DianCan披萨,有什么可以为您服务的吗? 顾客:你好,我刚刚下了一个订单,但是我发现我填写的地址是错的。 DianCan 自助点餐机器人:非常抱歉给您带来困扰。请问您是否希望取消订单并重新下单呢? 顾客:是的,我想取消订单。 DianCan 自助点餐机器人:好的,请告诉我您的订单号,我会尽快帮您处理。 顾客:我的订单号是XXXX。 DianCan 自助点餐机器人:好的,已经为您查询到了订单。为了确认您的身份,请问您能提供下单时使用的手机号码后四位吗? 顾客:手机号码后四位是XXXX。 DianCan 自助点餐机器人:非常感谢,已经确认您的身份。我们现在就为您取消订单,并会尽快处理退款。退款将在3-7个工作日内原路返回至您的支付账户。请您注意查收。 顾客:好的,非常感谢你们的帮助。 DianCan 自助点餐机器人:不客气,如果您还有其他问题或需要进一步的帮助,请随时与我们联系。祝您用餐愉快! |
|
微调前的输出 | 微调后的输出 |
{ "意图": "客户意图:取消订单", "原因标签": ["地址填写错误", "订单号提供不准确"] } | {"意图": "取消订单", "原因": "地址填写错误"} |
如若拥有类似场景的训练任务,您可以按照如下流程进行模型精调和应用:
三、模型精调的核心步骤
(一)准备数据
1、构造“意图-原因”标签集
意图 | 原因 | 数据份数 |
---|---|---|
如何提交评价 | 未收到评价邀请 | 1 |
你们有某种餐品吗 | 餐品缺货_短期或长期 | 1 |
某餐需要做成不辣 | 顾客特殊需求 | 1 |
在餐厅丢失了物品怎么寻回 | 找回遗失物品 | 1 |
订单什么时候能做好 | 餐品制作时间 | 1 |
如何访问我的订单历史记录 | 历史订单查询 | 1 |
取消订单 | 取消订单_无具体理由 | 1 |
为什么我的优惠券不见了 | 优惠券未到账 | 1 |
取消订单 | 地址写错误 | 1 |
我想要加番茄酱或者不加番茄酱 | 加or不加番茄酱_顾客定制 | 2 |
餐品不对 | 漏餐错餐 | 1 |
餐厅电话是多少 | 食物变质 | 1 |
我在哪里可以参加活动 | 活动地点咨询 | 1 |
有没有推荐的产品 | 需要推荐餐品 | 1 |
客户要开发票 | 开发票 | 2 |
2、生成对话数据
从”意图-原因“生成客服对话的Prompt
你是一个利用【意图-原因】生成对话的机器人,请你仔细观察下面的输入输出,发挥你的想象,根据【输入】提供的已知信息和要求,生成客服对话。具体要求如下:
1.【输入】和【输出】的格式与示例相同。
2.【输出】为生成的对话。
3.你生成的是DianCan披萨公司的客服对话,请你刻意回避百胜公司、肯德基餐饮相关的产品和名词。
遵循以上准则,请你根据【输入】创造一个新的客服对话,示例如下:
【输入】
###意图-原因
"{"意图": "某产品你们有吗","原因": "产品是否有_餐厅断货_临时or永久"}"
【输出】
### 对话内容
"客服:正在为您转接人工服务中,目前人工繁忙,如需继续等待请输入:继续
客服:欢迎进入人工客服通道,56959很高兴为您服务对话过程中以及完成后,您会收到评价提醒,希望您能对我个人本次服务做个评价,您的反馈和建议也是我努力的方向哦,感谢~
顾客:继续
顾客:你好,鸡腿饭现在是下架了嘛
客服:DianCan客服中心,很高兴为您服务,我先查看一下您反馈的问题哦~
顾客:附近每家店子都没有[嚎哭]
客服:没有看到说明售罄,暂时断货,没有这个餐点,建议客官过段时间在购买查看的,不好意思。
客服:以您在我们官网看到的为准,有就是有,没有就是没有的呢。
顾客:那可以查一下附近哪家店有吗
顾客:武汉洪山区哪家店有
顾客:我看了好多家都没有[嚎哭]
客服:小二这边是客服中心的,不是某家餐厅,不是很清楚每个门店的具体情况,非常抱歉。
客服:或者您可以通过DianCan微信公众号-自助服务-点击入群,可加入附近DianCan餐厅的社群哦~了解具体信息。
客服:亲亲,您还在线吗?我还在快马加鞭处理中,如果您还有问题,也及时回应哦~
客服:"
---------------------------------
【输入】
###意图-原因
"{"意图": "你们有某种餐品吗","原因": "餐品断货_短期或长期"}"
【输出】:
3、构造调优数据
数据格式:本实验是采用SFT调优方式,需要使用Prompt+Response数据格式。
- Prompt:预设情景+“意图-原因”标签集+对话内容。
- Response:Prompt中对话内容对应的“意图-原因”数据。
训练数据example
[{
"prompt": "假设你有一套客户意图分类以及该分类下属的原因标签。请根据给定的客服对话内容,判断最有可能的客户意图以及对应的原因标签,意图和原因标签需要严格控制给定的范围之内;一个意图可能对应多个原因,但一个原因只会对应一个意图;如果均不匹配则回答无明确客户意图;回答请使用json的格式,示例:'{\"意图\": \"xxx\",\"原因”: \"xxx\"}'\n### 下面是客户意图的分类\n1.客户意图:如何提交评价;原因标签:未收到评价邀请\n2.客户意图:你们有某种餐品吗;原因标签:餐品缺货_短期或长期\n3.客户意图:某餐品需要做成不辣;原因标签:顾客特需服务\n4.客户意图:在餐厅丢失了物品怎么寻回;原因标签:找回遗失物品\n5.客户意图:订单什么时候能做好;原因标签:餐品制作时间\n6.客户意图:如何访问我的订单历史记录;原因标签:历史订单查询\n7.客户意图:取消订单;原因标签:取消订单_无具体理由\n8.客户意图:为什么我的优惠券不见了;原因标签:优惠券未到账\n9.客户意图:取消订单;原因标签:地址填写错误\n10.客户意图:我想要加番茄酱或者不加番茄酱;原因标签:加or不加番茄酱_顾客定制\n11.客户意图:餐品不对;原因标签:漏餐错餐\n12.客户意图:餐厅电话是多少;原因标签:食物变质\n13.客户意图:我在哪里可以参加活动;原因标签:活动地点咨询\n14.客户意图:有没有推荐的产品;原因标签:需要推荐餐品\n15.客户意图:客户要开发票;原因标签:开发票\n\n###对话内容\n李丽丽 2023年04月25日 14:23:12\n您好,我已经成功为您转接人工客服。\n张晓峰 2023年04月25日 14:23:28\n你好,我在订单上忘记备注了,我想要我的披萨上加额外的番茄酱。\n李丽丽 2023年04月25日 14:23:50\n非常抱歉给您带来困扰,我会立刻为您处理。请告诉我您的订单编号。\n张晓峰 2023年04月25日 14:24:05\n我的订单编号是DC123456789。\n李丽丽 2023年04月25日 14:24:40\n好的,我已经找到您的订单了。我会为您的订单添加额外的番茄酱,这样您收到披萨时就会按照您的要求加好番茄酱了。\n张晓峰 2023年04月25日 14:25:02\n太好了,谢谢你!我还以为要重新下单呢。\n李丽丽 2023年04月25日 14:25:25\n不用的,这是我们应该做的。如果您还有其他需求或者问题,也请随时告诉我,我会尽力帮助您解决。\n张晓峰 2023年04月25日 14:25:48\n没有了,这样就可以了。你们的客服真的很棒!\n李丽丽 2023年04月25日 14:26:10\n非常感谢您的夸奖,我们会继续努力提供优质的服务。祝您用餐愉快!\n\n###输出",
"response": [
[
"{'意图': '我想要加番茄酱或者不加番茄酱', '原因': '加or不加番茄酱_顾客定制'}"
]
]
}]
4、数据洞察与处理
4.1 数据洞察
当你手头有一份SFT数据集并且要对样本进行深度分析时,数据洞察为您提供了一个多方位诊断、精细化操作的数据集工作台。例如:
- 数据集混杂着未标注样本,需要过滤该类数据并发起模型训练
- 数据集部分样本的字段值空缺或特殊字符过多,对模型训练有害,需要识别并去除此类样本
- 数据集中混杂着多种业务场景的样本,想要从中遴选某一类场景的样本构建数据集,用于后续的定向调优
- ......
4.1.1 结合自定义字段,构建平台数据集
一般而言,SFT数据集的基本字段包含 ''system" / "prompt" / "response",该类字段在精调时会参与模型的实际训练。
此外,数据集每个样本也可能附带业务属性信息,例如:客服对话场景数据集的每条样本,有可能归属 “售前”、“售中”、“售后”的一种场景,该类业务信息往往也能成为数据洞察的重要依据。
如JSONL文件,您可在平台上传SFT数据集时,添加辅助性质的自定义字段。该客服对话案例中,在 "prompt" / "response" 基本字段之外,我们为每条样本附带添加了 "cls"(每个样本对应的场景类别:“售前”、“售中”、“售后”),以及 "intent"(每个样本对应的“意图”) 两个自定义字段,有助于在数据洞察环节为我们提供更多的样本信息。
4.1.2 开启数据洞察
您可对上一步形成的数据集开启数据洞察,如下是洞察工作台示意:
1、左侧数据洞察图表区,为您提供每个字段的样本分布信息
2、右侧数据表格区,为您提供精细化筛选、排序,以及拆分构建数据子集的能力
- "prompt" 字段:通过洞察图表不难发现,字符数分布相对分散。在精调场景中,我们建议 "prompt" 的字符数分布与实际对话场景分布尽可能保持一致,这样可发挥最佳精调潜力。
此外,您可通过数据表格区提供的升降排序或高级筛选能力,遴选特定字符数的样本,例如处在 320~450 字符数区间的样本集合。
- "response" 字段:数据集中混杂着仅含 "prompt" 不含 "response" 的未标注样本。通过对数据表格区添加 "response" 为空的筛选条件,您可定向遴选并剔除此类问题样本。
- 总共1546条样本中,“售前”:“售中”:“售后” 约等于 1:1:2。我们同样建议此处分布与实际对话场景分布尽可能保持一致。
- 总共1546条样本中,意图共包含14种。其中,“客户要开发票”、“取消订单”、“我想要加番茄酱或者不加番茄酱”的样本占比最多。剩余意图的样本占比相对较少且分布均衡。
3、最后,您可将符合条件的样本集,从当前数据集拆分并构建新的数据子集。新的数据子集可进一步开展数据清洗、数据增强等处理操作,处理后的数据集可再度开展数据洞察。
例如,通过数据洞察我们发现,表达“如何提交评价”意图的样本占比相对较少,则可以将该类场景的样本集拆分构建成新的数据集—"如何提交评价_客服对话多标签生成"。该数据集可通过后续的数据增强功能,对“如何提交评价”意图类的样本进行自动扩充。
4.2 数据增强与数据清洗
- 数据增强:样本较少时,可基于自监督的方式发起数据增强任务。
- 数据清洗:可实现异常清洗、过滤、去重和去隐私过程。
4.3划分train-eval数据
基于构造的1243条训练数据,按照 9.5:0.5 的比例划分,最终1181条作为训练集,62条作为评估集。
(二)精调模型
1、基础配置
基础模型选择:选择ERNIE Tiny模型,该模型是百度自研的超高性能大语言模型,且精调成本在文心系列模型中最低,能够在保证准确性的同时降低成本。
基于ERNIE-Tiny-8K模型做SFT全量更新实验,参数和训练方法配置如下:
模型 | 训练方法 | Epoch | Learning Rate | 序列长度 |
---|---|---|---|---|
ERNIE-Tiny-8K | 全量更新 | 1 | 1e-5 | 4096 |
2、评估报告
3、效果评估
评估规则:在客服对话多标签生成中,结果相对清晰明确。可定义评分规则,评分按照1-2-3三档执行,其中1分表示输出格式不对;2分表示输出格式正确,但内容不正确;3分表示输出的格式和内容全部正确。
评估方式:实施自动打分,将评分标准、场景要求、上下文、大模型的回答拼接成一个Prompt,使用EB4等大模型进行自动打分。
根据结果可以看到:基于ERNIE-Tiny-8K模型使用SFT全量更新的训练方法,且训练参数Epoch=1、Learning Rate=1e-5、序列长度=4096时,模型输出效果远远优于微调之前。
模型 | 训练方法 | Epoch | Learning Rate | 序列长度 | 评估结果-1分 | 评估结果-2分 | 评估结果-3分 | 评估结果 |
---|---|---|---|---|---|---|---|---|
ERNIE-Tiny-8K (微调前) | -- | -- | -- | -- | 34 | 26 | 2 | 1.483871 |
ERNIE-Tiny-8K (微调后) | 全量更新 | 1 | 1e-5 | 4096 | 0 | 1 | 61 |