购物平台客服对话摘要
大模型精调 最佳实践与分享 已接入本样板视频教程,点击获取!
一、客服对话摘要介绍
在购物平台上,顾客通常会咨询平台的商品。比如咨询商品的用途、价格,让平台推荐商品等。对于平台来说,有没有服务好顾客,有没有为顾客带来良好的购物体验也是能否留住客户、吸引客户的关键。所以,作为平台需要对平台的顾客与客服的对话内容进行分析,了解顾客咨询的问题、顾客对客服提供的方案是否满意、顾客有没有接受客服提供的方案、顾客的情绪等。进而对顾客数据进一步分析,制定提升顾客体验的策略。
分析顾客的对话数据是比较耗时的工作,我们可以考虑调用大模型,使用大模型的生成能力整理对话数据,用于进一步的分析。
二、客服对话摘要的难点问题
如果我们直接调用大模型,要求大模型按prompt中的格式输出摘要内容。会发现可能存在如下问题:
- 大模型存在不按指定格式输出。我们直接调用ERNIE 4.0和ERNIE Speed均发现会输出
json
字样。
prompt如下:
你是一个对话摘要机器人,根据下面的已知信息,生成摘要。请使用以下格式输出:{"用户问题":xxx
"客服方案":xxx
"是否接受":xxx
"是否负面情绪":xxx}
请根据以下会话的内容,概述用户咨询的问题、客服提供的方案、用户是否接受、用户是否有负面情绪:
用户:你好,我购买的商品一直没有收到,能帮我查一下物流信息吗?
客服:您好,非常抱歉给您带来不便。请问您能提供一下订单号吗?我帮您查询一下物流信息。
用户:订单号是123456789,麻烦你了。
客服:好的,我帮您查询一下。根据物流信息显示,您的包裹目前正在途中,预计明天就能送达,请您耐心等待一下。
用户:好的,谢谢你。
客服:不客气,如果后续有任何问题,欢迎您随时联系我们。
返回如下,输出的内容中增加了json
字样。
```json
{"用户问题":"购买的商品一直没有收到,需要查询物流信息。","客服方案":"提供订单号后查询物流信息,得知包裹目前正在途中,预计明天送达。","是否接受":"接受","是否负面情绪":"没有"}```
- 大模型的总结能力太差,没有总结出重点信息。
prompt如下:
你是一个对话摘要机器人,根据下面的已知信息,生成摘要。请使用以下格式输出:{"用户问题":xxx
"客服方案":xxx
"是否接受":xxx
"是否负面情绪":xxx}
请根据以下会话的内容,概述用户咨询的问题、客服提供的方案、用户是否接受、用户是否有负面情绪:
用户:你好,我购买的商品一直没有收到。
客服:您好,非常抱歉给您带来不便。能否提供一下您的订单号?
用户:我的订单号是123456789。
客服:好的,我查询一下。您购买的商品由于物流原因,可能会有一些延迟。我们会尽快联系物流公司,让他们加快配送速度。
用户:我已经等了很久了,你们能不能给我一个确切的送货时间?
客服:非常抱歉,由于物流公司的配送时间我们无法完全掌控,所以无法给您一个确切的送货时间。但我们会一直跟进您的订单状态,确保您尽快收到商品。
用户:好吧,希望你们能尽快解决。
客服:非常感谢您的理解和支持,我们会尽快处理您的问题。
大模型回复中,对客服方案和用户是否有负面情绪描述的过于繁琐。
{
"用户问题": "购买的商品一直没有收到,询问确切的送货时间。",
"客服方案": "向用户道歉并解释由于物流原因导致的延迟。表示会联系物流公司加快配送速度,但由于物流公司配送时间无法完全掌控,无法提供确切的送货时间。承诺会跟进订单状态,确保用户尽快收到商品。",
"是否接受": "用户表示理解并希望尽快解决。",
"是否负面情绪": "用户在对话中表达了一定的不满和焦虑,但客服回应后,用户表示理解,并未表现出强烈的负面情绪。"
}
三、模型精调方案的分析
对于上述直接调用大模型存在的两个问题:
- 大模型存在不按指定格式输出:该问题属于典型的直接大模型存在不遵循输出格式的问题。我们可以通过准备一些Prompt+Response语料,使用SFT的能力解决大模型不按格式输出的问题。
- 大模型的总结能力太差,没有总结出重点信息:我们期望大模型能对用户的情绪精准的总结,或者精准简短的总结用户的情绪变化。因此可以准备一些总结能力强的Prompt+Response语料,比如"是否负面情绪"的总结中,使用"无"、"否"、"用户没有表现出明显的负面情绪"、"用户表达了不满,但客服承诺改进后用户情绪得到缓解"等。经过SFT调优可以使大模型的输出更简洁。
四、模型精调最佳实践
(一)准备数据
1、收集原始数据
(1)根据数据格式准备语料
数据格式:本实验是采用SFT调优方式,对于SFT调优,需要使用Prompt+Response数据格式。 准备调优数据:对于模型调优来说,高质量的数据是保证模型效果的最关键步骤,建议您参考以下经验准备调优数据:
- 真实性:来源最好来自于业务真实的调用数据,从而让大模型更好的基于业务场景训练。因此,我们可以收集线上的客服对话,然后人工或者借助大模型能力抽取数据,包括抽取"用户问题"、"客服方案"、"是否接受"、"是否负面情绪"。
- badcase改写:我们也可以直接调用大模型,生成对应数据。建议针对不符合预期的badcase人工改写。
- 数据量:最低需要准备100条数据,建议达到1000条的量级为优,并能覆盖不同类别的问题、不同用户情绪的描述等。注意数据量并非越多越好,多次实验发现上万条数据容易出现饱和,精调反而不如千条数据效果好。
(2)数据示例
对于SFT来说,数据格式为Prompt+Response对的形式。
Prompt中需要包括:1)基础的指令要求;2)输出的格式要求;3)用户咨询的历史记录。
Response按输出的格式输出。分为"用户问题"、"客服方案"、"是否接受"、"是否负面情绪"。
[
{
"prompt": "你是一个对话摘要机器人,根据下面的已知信息,生成摘要。请使用以下格式输出:{\"用户问题\":xxx\n\"客服方案\":xxx\n\"是否接受\":xxx\n\"是否负面情绪\":xxx}\n请根据以下会话的内容,概述用户咨询的问题、客服提供的方案、用户是否接受、用户是否有负面情绪:用户:你好,我遇到了一个问题。\n客服:您好,请问有什么可以帮您?\n用户:我购买的商品一直没有收到,但是物流信息显示已经签收了。\n客服:非常抱歉给您带来不便,我会尽快为您查询物流信息并联系快递公司。\n客服:经过查询,发现快递公司将包裹送到了错误的地址,我们会尽快为您补发商品,并给您带来相应的赔偿。\n用户:好的,谢谢你们的帮助。\n客服:非常感谢您的理解和支持,我们会尽快为您处理。",
"response": [["{\"用户问题\": \"购买的商品未收到,但物流信息显示已签收\", \"客服方案\": \"查询物流信息,发现送错地址,承诺补发商品并给予赔偿\", \"是否接受\": \"是\", \"是否负面情绪\": \"否\"}"]]
}
]
2、分析与处理数据
获取1200条Prompt+Response对,经过去重、清洗,最终获得1113条。
(1)异常数据过滤
如以下数据的response中,并未按照要求抽取客服对话内容,因此将数据删除。
[
{
"prompt": "你是一个对话摘要机器人,根据下面的已知信息,生成摘要。请使用以下格式输出:{\"用户问题\":xxx\n\"客服方案\":xxx\n\"是否接受\":xxx\n\"是否负面情绪\":xxx}\n请根据以下会话的内容,概述用户咨询的问题、客服提供的方案、用户是否接受、用户是否有负面情绪:\n\n用户:你好,我收到的商品有破损。\n客服:非常抱歉给您带来不便,能否请您提供一下破损商品的照片呢?\n用户:好的,我马上就发。\n客服:非常感谢您的配合,我们会尽快为您处理。\n用户:大概需要多久?\n客服:通常我们会在收到照片后的24小时内为您处理,如果需要退换货,我们会尽快为您安排。\n用户:好的,希望你们能尽快处理。\n客服:非常感谢您的理解和支持,我们会尽快为您解决问题的。",
"response": [["{\"用户问题\":xxx\n\"客服方案\":xxx\n\"是否接受\":xxx\n\"是否负面情绪\":xxx}"]]
}
]
(2)数据去重
在真实的对话场景中,可能会存在相似度比较高的对话内容。在训练前,我们一般需要评估数据集的相似度,并将相似度高的数据集进行去重。
在相似度度量上,我们取数据集实例中的prompt中的对话内容进行中文分词。并与其他实例中的prompt中的对话内容的中文分词结果进行对比。通常我们使用RougeL去重方法,ROUGE-L是一种用于评估NLP任务(例如自动文摘或机器翻译)的常用指标,基于LCS(Longest Common Subsequence)计算两个序列中最长公共子序列的长度。
计算当前实例与数据表中其他实例的RougeL相似度, RougeL >= 0.95 被认定重复,去除;< 0.95被认定不重复。
3、拆分数据集
经过数据清洗,我们得到一份高质量的数据集。同时为了评估我们调优的模型的质量好坏,需要准备对应分布的评估数据集。我们可以对上述得到的数据集进行拆分,拆分的部分数据集用于评估模型的好坏。针对客服对话的场景,评估数据集需要注意的是:
- 评估集中的数据最好能覆盖咨询问题的几种类别、以及用户情绪的描述
- 评估集和训练集内容不能重复,避免评估不准确
我们的数据集一共有1113条真实语料,从中随机抽取得到50条验证集,剩下的1063条作为训练集,保证评估集和训练集分布一致性。
训练集已预置进平台数据集中,点击 数据集可进入通用数据集-预置数据集模块查看。
(二)精调模型
1、基础模型选择
本次的场景是摘要提取对话的内容,场景和输出格式相对比较简单。我们可以先在本平台体验中心体验基础模型的效果。一般来说,如果基础模型的返回效果还可以,格式和描述存在问题,均可以通过SFT解决。
对于简单的摘要对话场景,ERNIE Lite通过SFT也能处理。ERNIE Speed 模型参数量级大于ERNIE Lite,效果整体上会优于ERNIE Lite,该实验中我们选择了ERNIE Speed 模型。如果您对训练和部署的价格比较在意,也可以尝试使用ERNIE Lite 最新版本。
2、精调方法选择
SFT精调又分为全量更新与LoRA两种方式。
- SFT-全量更新:是指在训练过程中对大模型的全部参数进行更新的训练方案,也是目前较为主流的方式。相较于LoRA,全量更新更容易保障效果精度和泛化能力。因此建议您对精度要求较高且数据量充足时,直接选择全量更新。
- LoRA:是指在固定预训练大模型本身的参数的基础上,在保留自注意力模块中原始权重矩阵的基础上,对权重矩阵进行低秩分解,训练过程中只更新低秩部分的参数的训练方法。LoRA方法在训练时间和内存消耗上比全量更新方法大幅减少,因此它训练成本低,训练时间快,可以低价高效地完成训练。如果您想要快速训练看到实验效果,可以优先尝试使用LoRA的训练方法。
本次最佳实践分别实验了以上两种训练方式,虽然训练后均在基础模型的基础上有效果提升,但是SFT-全量更新效果最优,详细实验结果可以看效果评估数据。
3、模型参数配置
拿到一个训练场景或者任务后,往往比较难判断参数应该如何调整。一般使用默认的参数值进行训练即可,平台中的默认参数是多次实验的经验结晶。 接下来介绍参数配置中有两个较为关键的参数:
- 迭代轮次(Epoch): 控制训练过程中的迭代轮数。轮数增加代表会使用训练集对模型训练一次。
- 学习率(Learning Rate): 是在梯度下降的过程中更新权重时的超参数,过高会导致模型难以收敛,过低则会导致模型收敛速度过慢,平台已给出默认推荐值,也可根据经验调整。
- 序列长度:如果对话数据的长度较短,建议选择短的序列长度,可以提升训练的速度。
本次也针对Epoch和Learning Rate进行简要的调参实验,详细实验结果可以看效果评估数据。
如果您是模型训练的专家,本平台也提供了训练更多的高级参数供您选择。这里也建议您初期调参时步长可以设定稍大些,因为较小的超参变动对模型效果的影响小,会被随机波动掩盖。
4、实验
我们基于ERNIE Speed 共做了6 次SFT实验,参数和训练方法配置如下:
实验1 | 实验2 | 实验3 | 实验4 | 实验5 | 实验6 | |
---|---|---|---|---|---|---|
训练方法 | LoRA | LoRA | LoRA | 全量更新 | 全量更新 | 全量更新 |
Epoch | 6 | 3 | 3 | 3 | 6 | 3 |
Learning Rate | 3e-4 | 3e-4 | 6e-4 | 3e-5 | 3e-5 | 6e-5 |
训练后,我们可以在运行详情的评估报告中查看Loss曲线如下:
实验1 |
实验2 |
实验3 |
实验4 |
实验5 |
实验6 |
我们可以观察到,整体来看,全量更新的Loss收敛效果比Lora训练方法的效果好一些。
- 对于LoRA的训练任务:实验3的Loss下降的最多,我们选择实验3
- 对于全量更新的训练任务:实验4、5、6整体收敛都不错,相对来说实验4和实验5更好一些。实验5的Loss下降更加均匀,实验4存在抖动,因此我们选择实验5的模型评估效果。
(三)效果评估
1、评分分析
人工打分评价模型输出质量,按照3分绝对值,详细打分标准如下:
- 1分:未严格按照prompt要求的格式输出;
- 2分:基本按照prompt要求的格式输出,摘要总结与对话内容有联系,用词一般;
- 3分:严格按照prompt要求的格式输出,摘要总结与对话内容联系紧密,用词准确。
2、输出内容质量分析
我们可以看到,经过调优后模型的指令遵循效果提升明显。经过SFT后模型基本都能按照prompt要求的格式输出摘要内容,且全量更新效果更加显著。
模型 | ERNIE Speed | ERNIE Speed LoRA Epoch = 3 Learning Rate = 6e-4 |
ERNIE Speed 全量更新 Epoch = 6 Learning Rate = 3e-5 |
ERNIE 4.0 |
---|---|---|---|---|
评分比 | (1:2:3) | 48:0:2 | 2:2:46 | 0:1:49 |
3、调用对比示例
以下为直接调用ERNIE Speed模型、调用经过ERNIE Speed-全量更新的模型、直接调用ERNIE 4.0模型的效果对比:
解决问题一:解决直接调用大模型的输出格式错误问题:
客服摘要任务的prompt:
你是一个对话摘要机器人,根据下面的已知信息,生成摘要。请使用以下格式输出:{"用户问题":xxx
"客服方案":xxx
"是否接受":xxx
"是否负面情绪":xxx}
请根据以下会话的内容,概述用户咨询的问题、客服提供的方案、用户是否接受、用户是否有负面情绪:
用户:你好,我购买的商品一直没有收到,能帮我查一下物流信息吗?
客服:您好,非常抱歉给您带来不便。请问您能提供一下订单号吗?我帮您查询一下物流信息。
用户:订单号是123456789,麻烦你了。
客服:好的,我帮您查询一下。根据物流信息显示,您的包裹目前正在途中,预计明天就能送达,请您耐心等待一下。
用户:好的,谢谢你。
客服:不客气,如果后续有任何问题,欢迎您随时联系我们。
- ERNIE-Speed:
{
"用户问题":"购买的商品一直没有收到,需要查询物流信息。",
"客服方案":"提供订单号后查询物流信息,得知包裹目前正在途中,预计明天送达。",
"是否接受":"接受",
"是否负面情绪":"没有"
}
- ERNIE Speed-全量更新:
{"用户问题":"购买的商品未收到,请求查询物流信息。","客服方案":"提供订单号后,客服查询并告知用户物流信息,预计明天送达。","是否接受":"用户接受客服提供的方案,并表示感谢。","是否负面情绪":"用户未表现出负面情绪。"}
- ERNIE 4.0:
{
"用户问题":"购买的商品未收到,请求查询物流信息。",
"客服方案":"客服要求用户提供订单号,并查询物流信息后告知用户包裹正在途中,预计明天送达。",
"是否接受":"用户接受了客服提供的方案,并表示感谢。",
"是否负面情绪":"用户没有表现出负面情绪。"
}
解决问题二:解决大模型的总结能力太差,不能总结出重点信息的问题:
客服摘要任务的prompt:
你是一个对话摘要机器人,根据下面的已知信息,生成摘要。请使用以下格式输出:{"用户问题":xxx
"客服方案":xxx
"是否接受":xxx
"是否负面情绪":xxx}
请根据以下会话的内容,概述用户咨询的问题、客服提供的方案、用户是否接受、用户是否有负面情绪:
用户:你好,我购买的商品一直没有收到。
客服:您好,非常抱歉给您带来不便。能否提供一下您的订单号?
用户:我的订单号是123456789。
客服:好的,我查询一下。您购买的商品由于物流原因,可能会有一些延迟。我们会尽快联系物流公司,让他们加快配送速度。
用户:我已经等了很久了,你们能不能给我一个确切的送货时间?
客服:非常抱歉,由于物流公司的配送时间我们无法完全掌控,所以无法给您一个确切的送货时间。但我们会一直跟进您的订单状态,确保您尽快收到商品。
用户:好吧,希望你们能尽快解决。
客服:非常感谢您的理解和支持,我们会尽快处理您的问题。
- ERNIE Speed:
{
"用户问题": "购买的商品一直没有收到,询问确切的送货时间。",
"客服方案": "向用户道歉并解释由于物流原因导致的延迟。表示会联系物流公司加快配送速度,但由于物流公司配送时间无法完全掌控,无法提供确切的送货时间。承诺会跟进订单状态,确保用户尽快收到商品。",
"是否接受": "用户表示理解并希望尽快解决。",
"是否负面情绪": "用户在对话中表达了一定的不满和焦虑,但客服回应后,用户表示理解,并未表现出强烈的负面情绪。"}
- ERNIE Speed-全量更新:
{
"用户问题": "购买的商品未收到,请求确切送货时间。",
"客服方案": "提供订单号后,客服查询发现物流延迟,无法提供确切送货时间,但承诺跟进订单状态,确保尽快收到商品。",
"是否接受": "用户接受客服方案。",
"是否负面情绪": "用户在等待过程中表现出一定的不满和焦虑。"
}
- ERNIE 4.0:
{"用户问题": "购买的商品一直未收到,询问送货时间。",
"客服方案": "查询订单状态,解释物流延迟原因,无法提供确切送货时间,但会跟进订单状态并确保尽快送达。",
"是否接受": "用户表示理解并希望尽快解决。",
"是否负面情绪": "用户在等待过程中表现出一定的不满和焦虑。"}
(四)上线调用
我们按照最佳实践训练完成后,发布成为我的模型后,最后一步就是将自训的大模型部署为公有云服务正式调用了。
如果您想要快速体验尝试,可以选择按服务调用量收费,模型部署成功后调用才会收费,不调用将不收取费用。如果1⼩时内没有产⽣调⽤,服务将⾃动关闭,如您需要可以重新启动模型服务。
如果您期望将大模型服务上线真实生产环境,您可以选择将服务托管在私有资源池,按照资源池时长收费(按天或小时),您可设定在线服务部署的算力单元来保障TPM。
五、最佳实践总结
(一)精调经验总结
按照以上的步骤,就可以完成客服对话摘要的模型精调,收获一个贴合业务场景的定制模型服务。整体来看我们需要做的工作有:
- 训练数据集:质量远比数量重要,数据应尽可能来自于线上真实业务数据,如果数据不足,可考虑通过大模型生成+人工Review的方式。但要保证数据能够覆盖业务的场景类别,尤其是能覆盖线上可能或者已经出现的badcase。
- 评估数据集:要与训练数据集分布类似,但不能与训练数据集一样。为了既要能反映线上高频使用效果,还要可以评测模型泛化能力。
- 模型训练:为保障精度,以场景表现好的模型为基础模型,使用SFT-全量更新方法,优先使用平台默认训练参数进行训练。如果模型没有收敛,但是Loss在下降,可以考虑增加Epoch来提升实验次数。
- 模型评估:基于明确的评估标准和计分方法,可以有效使用大规模参数的模型进行自动打分进行高效评估。
(二)精调收益总结
1、效果
我们以相同评估集、评估标准,使用人工打分的打分方式测试精调模型和ERNIE 4.0的效果。我们可以惊讶的发现,精调模型效果远优于基础模型Ernie Speed和ERNIE 4.0的效果。
模型 | ERNIE Speed | ERNIE Speed LoRA Epoch = 3 Learning Rate = 6e-4 |
ERNIE Speed 全量更新 Epoch = 6 Learning Rate = 3e-5 |
ERNIE 4.0 |
---|---|---|---|---|
评分比(1:2:3) | 48:0:2 | 2:2:46 | 0:1:49 | 50:0:0 |
2、费用
由于我们选择更高性价比的模型作为基础模型,通过精调使得模型在特定场景中效果媲美甚至赶超超大规模参数的模型。因此精调模型的部署成本和调用成本都远比超大规模参数模型要低。
3、时延
基础模型ERNIE Speed相比超大规模参数模型ERNIE 4.0还有性能的绝佳优势。
从本次最佳实践中随机选取了数据进行性能评测评估,经过精调后的模型首token平均时延仅是ERNIE 4.0的50%,而总平均时延约为ERNIE 4.0的10%,时延明显精调后模型更优。
总结来看,经过数据优化和模型精调,我们得到了一个高质量的客服对话摘要总结大模型,赶快体验试试吧!