docs: 更新readme
本项目基于 Qwen3-8B 大语言模型,使用 HuggingFace Transformers / TRL / PEFT 框架,面向电商客服场景构建了一套从数据清洗、格式转换、SFT-LoRA 微调、DPO 偏好优化到多维评估的完整微调流程。
项目围绕退换货、物流查询、商品参数、优惠活动、投诉处理、售后协商等典型客服问题,构建高质量指令微调数据和偏好优化数据,使模型在电商客服场景下具备更稳定、礼貌、规范、可执行的回复能力。
通用大语言模型虽然具备较强的语言理解与生成能力,但在垂直电商客服场景中仍存在以下问题:
因此,本项目通过监督微调和偏好优化,使模型更加适配电商客服任务。
本项目的核心目标是提升模型在电商客服场景下的:
本项目整体流程如下:
原始电商客服数据 │ ▼ 数据清洗与质量筛选 │ ▼ 构造 SFT 指令微调数据 │ ▼ Qwen3-8B + LoRA 监督微调 │ ▼ 构造 DPO 偏好数据 │ ▼ DPO 偏好优化 │ ▼ 自动指标 + 样本级胜率 + 规则命中率 + 模拟人工评分 │ ▼ 模型效果分析与案例对比
本项目使用来自 GitHub cooelf/DeepUtteranceAggregation 的电商客服对话数据作为基础数据来源。原始数据包含多轮用户与客服对话,以及正负样本标签。
cooelf/DeepUtteranceAggregation
原始数据格式示例:
1 嗯 嗯 因为 买二送 一是 坚果 类产品 呢 不 太 清楚 不好意思 客官 没事 客官 帮 您 看 了 下 哦 牛肉干 属于 打 95 折 的 商品 哦 不 参与 买二送 一 活动 呢 实在 抱歉 呢 不过 小店 牛肉干 口味 很 不错 呢 客官 喜欢 的话 可以 拍下 哦 0 嗯 嗯 因为 买二送 一是 坚果 类产品 呢 不 太 清楚 不好意思 客官 没事 放 尿布 里面 的 吗 没有 哦
其中:
1
0
由于原始数据并不能直接用于指令微调,因此本项目对数据进行了清洗和格式转换。主要清洗步骤包括:
经过清洗后,最终保留约 5800 条高质量 SFT 样本。
本项目采用 HuggingFace TRL 支持的 messages 格式,示例如下:
messages
{ "messages": [ { "role": "system", "content": "你是一名专业、礼貌、遵守平台规则的电商客服助手。回答需要先安抚用户,再给出清晰、可执行的处理建议,不能随意承诺退款、赔偿或补发。" }, { "role": "user", "content": "请根据以下电商客服对话上下文,生成一段合适、礼貌、可执行的客服回复。\n\n场景类别:商品参数\n对话上下文:\n用户:为啥只有两袋啊不是199排三代嘛" }, { "role": "assistant", "content": "客官,小店宝贝是拍下 3 件后自动改价为 199 元哦。您这边目前拍了 2 件,所以价格显示为 198 元。您可以再确认一下购买数量,拍够 3 件后再查看优惠价格哦。" } ] }
项目覆盖的典型电商客服场景包括:
本项目采用 LoRA 进行参数高效微调,而不是全参数微调。LoRA 可以在显著降低显存占用和训练成本的同时,使模型学习电商客服领域的表达方式和业务规则。
SFT 阶段主要让模型学习:
训练完成后,主要保存 LoRA adapter 权重,而不是完整的 Qwen3-8B 模型权重。典型输出文件包括:
adapter_model.safetensors adapter_config.json tokenizer.json tokenizer_config.json trainer_state.json training_args.bin
adapter_model.safetensors
adapter_config.json
trainer_state.json
tokenizer.json
在完成 SFT 后,本项目进一步构造了 DPO 偏好数据,对模型进行偏好优化。
DPO 阶段重点解决 SFT 后仍可能存在的问题,例如:
本项目构造并扩充了约 2000 对偏好数据,每条数据包含:
prompt
chosen
rejected
偏好判断重点围绕:
DPO 阶段希望模型更偏向生成:
本项目使用自动指标、样本级对比和规则评估相结合的方式进行评估。
SFT 阶段主要关注:
DPO 阶段构建了约 100 条客服评估集,并从多个维度评估模型效果。
使用的评估指标包括:
在 DPO 对比实验中,第二阶段 DPO 模型相比第一阶段模型表现更优:
实验结果表明,经过扩充偏好数据和 DPO 优化后,模型在语义匹配度和样本级偏好表现上均有提升。
项目目录结构如下:
qwen3-ecommerce-customer-service/ │ ├── README.md ├── project_introduction.md ├── references.txt ├── evaluate_fixed_test_set.py ├── evaluation.py ├── fixed_eval_set_100.jsonl ├── pack.sh ├── train_sft_qwen3_8b_lora.py ├── train_sft_qwen3_8b_lora2.py │ ├── data/ │ ├── check_data.py │ ├── cleaning_report_40000.md │ ├── cleaning_report2_60000.md │ ├── ecommerce_sft_alpaca_strict20_5800.json │ ├── ecommerce_sft_messages_recommended_v3_eval.jsonl │ ├── ecommerce_sft_messages_recommended_v3_eval_400_balanced.jsonl │ ├── ecommerce_sft_messages_recommended_v3_train.jsonl │ ├── ecommerce_sft_messages_recommended_v3_train_4000_balanced.jsonl │ ├── ecommerce_sft_trl_messages_strict20_5800_eval.jsonl │ └── ecommerce_sft_trl_messages_strict20_5800_train.jsonl │ ├── DPO/ │ ├── dpo_2000_usage_readme.md │ ├── dpo_usage_readme.md │ ├── ecommerce_dpo_2000_quality.jsonl │ ├── ecommerce_dpo_2000_quality_stats.json │ ├── ecommerce_dpo_500.jsonl │ ├── ecommerce_dpo_500_stats.json │ ├── evaluate_dpo_beta_sweep.sh │ ├── run_dpo_beta_sweep.sh │ ├── train_dpo_1epoch.py │ └── train_dpo_one_beta.py │ ├── LoRA_ablation/ │ ├── ecommerce_eval_ablation_pack/ │ ├── evaluate_fixed_test_set.py │ ├── fixed_eval_set_100.jsonl │ ├── README_4000_ABLATION.md │ ├── run_confirm_full_best.sh │ ├── run_lora_ablation_fast4000.sh │ ├── run_lora_ablation_fast4000_5runs.sh │ ├── run_target_ablation_4000.sh │ ├── summarize_ablation_results_fast.py │ └── train_lora_ablation_fast.py │ ├── ablation_outputs_fast4000_5runs/ │ ├── ablation_summary_fast4000_5runs.csv │ ├── ablation_summary_fast4000_5runs.md │ ├── lora_qk_r4_fp16_alpha8/ │ ├── lora_qk_r16_fp16_alpha32/ │ ├── lora_qk_r64_fp16_alpha128/ │ ├── qlora4bit_all_linear_r16_bf16_alpha32/ │ │ ├── checkpoint-300/ │ │ └── checkpoint-500/ │ └── qlora4bit_qk_r16_bf16_alpha32/ │ ├── checkpoint-300/ │ └── checkpoint-500/ │ ├── outputs/ │ ├── qwen3_8b_ecommerce_sft_lora/ │ ├── qwen3_8b_ecommerce_sft_lora2/ │ ├── dpo_lora_2000_beta005_1epoch/ │ ├── dpo_lora_2000_beta01_1epoch/ │ ├── dpo_lora_2000_beta03_1epoch/ │ └── dpo_lora_r16_1epoch/ │ ├── results/ │ ├── evaluation_comparison.png │ ├── dpo_evaluation_comparison.png │ ├── dpo_lora_2000_beta005_eval.jsonl │ ├── dpo_lora_2000_beta005_eval.summary.json │ ├── dpo_lora_2000_beta01_eval.jsonl │ ├── dpo_lora_2000_beta01_eval.summary.json │ ├── dpo_lora_2000_beta03_eval.jsonl │ ├── dpo_lora_2000_beta03_eval.summary.json │ ├── dpo_lora_eval.jsonl │ ├── dpo_lora_eval.summary.json │ ├── lora1/ │ ├── lora2/ │ └── lora_ablation/ │ ├── SFT_eval/ └── train/
README.md
project_introduction.md
references.txt
evaluate_fixed_test_set.py
evaluation.py
fixed_eval_set_100.jsonl
pack.sh
train_sft_qwen3_8b_lora.py
data/ecommerce_sft_trl_messages_strict20_5800_train.jsonl
train_sft_qwen3_8b_lora2.py
data/ecommerce_sft_messages_recommended_v3_train.jsonl
data/
DPO/
LoRA_ablation/
ablation_outputs_fast4000_5runs/
outputs/
results/
SFT_eval/
train/
本项目共有 2 次 SFT-LoRA 实验:
outputs/qwen3_8b_ecommerce_sft_lora
outputs/qwen3_8b_ecommerce_sft_lora2
运行示例:
python train_sft_qwen3_8b_lora.py python train_sft_qwen3_8b_lora2.py
如果需要评估某个 SFT LoRA 模型,可使用:
python evaluate_fixed_test_set.py \ --base_model /root/autodl-tmp/modelscope/Qwen/Qwen3-8B \ --lora_dir outputs/qwen3_8b_ecommerce_sft_lora \ --eval_file SFT_eval/fixed_eval_set_100.jsonl \ --output_file results/qwen3_8b_ecommerce_sft_lora_eval.jsonl \ --use_gold_category true
项目中仅有 1 组 LoRA 消融实验,集中在 LoRA_ablation/ 目录:
LoRA_ablation/train_lora_ablation_fast.py
LoRA_ablation/README_4000_ABLATION.md
LoRA_ablation/run_lora_ablation_fast4000.sh
LoRA_ablation/run_target_ablation_4000.sh
LoRA_ablation/run_confirm_full_best.sh
快速实验数据文件包括:
data/ecommerce_sft_messages_recommended_v3_train_4000_balanced.jsonl
data/ecommerce_sft_messages_recommended_v3_eval_400_balanced.jsonl
bash LoRA_ablation/run_lora_ablation_fast4000.sh bash LoRA_ablation/run_target_ablation_4000.sh bash LoRA_ablation/run_confirm_full_best.sh
消融结果会保存到 ablation_outputs_fast4000_5runs/,并汇总到 ablation_outputs_fast4000_5runs/ablation_summary_fast4000_5runs.md。
ablation_outputs_fast4000_5runs/ablation_summary_fast4000_5runs.md
本项目包含 2 次 DPO 实验:
DPO/train_dpo_1epoch.py
DPO/ecommerce_dpo_500.jsonl
outputs/dpo_lora_r16_1epoch
DPO/train_dpo_one_beta.py
DPO/ecommerce_dpo_2000_quality.jsonl
outputs/dpo_lora_2000_beta005_1epoch
outputs/dpo_lora_2000_beta01_1epoch
outputs/dpo_lora_2000_beta03_1epoch
python DPO/train_dpo_1epoch.py python DPO/train_dpo_one_beta.py --beta 0.1
或批量运行 beta 对比:
bash DPO/run_dpo_beta_sweep.sh
DPO 评估示例:
python evaluate_fixed_test_set.py \ --base_model /root/autodl-tmp/modelscope/Qwen/Qwen3-8B \ --lora_dir outputs/dpo_lora_r16_1epoch \ --eval_file SFT_eval/fixed_eval_set_100.jsonl \ --output_file results/dpo_lora_r16_1epoch_eval.jsonl \ --use_gold_category true
批量评估 beta 对比结果:
bash DPO/evaluate_dpo_beta_sweep.sh
如果运行环境与脚本中的默认 /root/firstTunning 路径不一致,请先调整 DPO/train_dpo_1epoch.py、DPO/train_dpo_one_beta.py、train_sft_qwen3_8b_lora.py、train_sft_qwen3_8b_lora2.py 中的路径配置。
/root/firstTunning
本项目实验表明,SFT-LoRA 可以显著提升模型对电商客服话术和业务场景的适配能力;在进一步进行 DPO 优化后,模型在回答准确性、情绪安抚和可执行方案生成方面进一步提升。
其中,第二阶段 DPO 模型在 65% 的评估样本上优于第一阶段模型,BERTScore F1 从 0.7097 提升至 0.7260,相对提升 2.30%。
后续可以进一步从以下方向改进:
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
电商客服场景大模型微调项目
本项目基于 Qwen3-8B 大语言模型,使用 HuggingFace Transformers / TRL / PEFT 框架,面向电商客服场景构建了一套从数据清洗、格式转换、SFT-LoRA 微调、DPO 偏好优化到多维评估的完整微调流程。
项目围绕退换货、物流查询、商品参数、优惠活动、投诉处理、售后协商等典型客服问题,构建高质量指令微调数据和偏好优化数据,使模型在电商客服场景下具备更稳定、礼貌、规范、可执行的回复能力。
1. 项目背景
通用大语言模型虽然具备较强的语言理解与生成能力,但在垂直电商客服场景中仍存在以下问题:
因此,本项目通过监督微调和偏好优化,使模型更加适配电商客服任务。
2. 项目目标
本项目的核心目标是提升模型在电商客服场景下的:
3. 技术路线
本项目整体流程如下:
4. 技术栈
5. 数据来源与处理
5.1 原始数据来源
本项目使用来自 GitHub
cooelf/DeepUtteranceAggregation的电商客服对话数据作为基础数据来源。原始数据包含多轮用户与客服对话,以及正负样本标签。原始数据格式示例:
其中:
1表示当前回复与上下文匹配;0表示当前回复与上下文不匹配;5.2 SFT 数据清洗策略
由于原始数据并不能直接用于指令微调,因此本项目对数据进行了清洗和格式转换。主要清洗步骤包括:
0标签样本主要用于匹配或排序任务,不适合作为 SFT 的标准回答,因此在 SFT 阶段删除。经过清洗后,最终保留约 5800 条高质量 SFT 样本。
5.3 SFT 数据格式
本项目采用 HuggingFace TRL 支持的
messages格式,示例如下:6. 场景类别设计
项目覆盖的典型电商客服场景包括:
7. SFT-LoRA 微调
7.1 微调方式
本项目采用 LoRA 进行参数高效微调,而不是全参数微调。LoRA 可以在显著降低显存占用和训练成本的同时,使模型学习电商客服领域的表达方式和业务规则。
7.2 SFT 阶段学习目标
SFT 阶段主要让模型学习:
7.3 训练产物
训练完成后,主要保存 LoRA adapter 权重,而不是完整的 Qwen3-8B 模型权重。典型输出文件包括:
其中:
adapter_model.safetensors:LoRA 权重文件;adapter_config.json:LoRA 配置文件;trainer_state.json:训练日志和 loss 记录;tokenizer.json:分词器相关文件。8. DPO 偏好优化
在完成 SFT 后,本项目进一步构造了 DPO 偏好数据,对模型进行偏好优化。
8.1 DPO 数据构造目标
DPO 阶段重点解决 SFT 后仍可能存在的问题,例如:
8.2 DPO 偏好数据规模
本项目构造并扩充了约 2000 对偏好数据,每条数据包含:
prompt:用户问题或客服上下文;chosen:更优客服回复;rejected:较差客服回复。偏好判断重点围绕:
8.3 DPO 优化目标
DPO 阶段希望模型更偏向生成:
9. 模型评估
本项目使用自动指标、样本级对比和规则评估相结合的方式进行评估。
9.1 SFT 阶段评估
SFT 阶段主要关注:
9.2 DPO 阶段评估
DPO 阶段构建了约 100 条客服评估集,并从多个维度评估模型效果。
使用的评估指标包括:
9.3 实验结果摘要
在 DPO 对比实验中,第二阶段 DPO 模型相比第一阶段模型表现更优:
实验结果表明,经过扩充偏好数据和 DPO 优化后,模型在语义匹配度和样本级偏好表现上均有提升。
10. 项目目录结构
项目目录结构如下:
10.1 目录说明
README.md:项目总说明文档。project_introduction.md:项目设计、任务目标与实验总结。references.txt:参考资料与链接。evaluate_fixed_test_set.py:固定 100 条高风险测试集评估脚本,兼容 LoRA 模型评估。evaluation.py:评估分析辅助脚本。fixed_eval_set_100.jsonl:固定评估集,用于对比 SFT/DPO 模型表现。pack.sh:打包发布脚本,排除大文件和中间优化器文件。train_sft_qwen3_8b_lora.py:SFT-LoRA 实验 1,使用data/ecommerce_sft_trl_messages_strict20_5800_train.jsonl。train_sft_qwen3_8b_lora2.py:SFT-LoRA 实验 2,使用data/ecommerce_sft_messages_recommended_v3_train.jsonl。data/:数据清洗、格式转换和训练集/验证集文件。DPO/:DPO 训练脚本、偏好数据和 beta 对比脚本。LoRA_ablation/:LoRA 消融实验代码、快速消融数据集和比较脚本。ablation_outputs_fast4000_5runs/:快速消融实验结果目录。outputs/:SFT / DPO 训练产生的 LoRA adapter 权重目录。results/:评估结果文件、对比图表和实验汇总。SFT_eval/:SFT 固定评估集目录。train/:训练相关辅助文件或历史脚本目录。10.2 执行说明
SFT-LoRA
本项目共有 2 次 SFT-LoRA 实验:
train_sft_qwen3_8b_lora.py:第一组 SFT 实验,使用data/ecommerce_sft_trl_messages_strict20_5800_train.jsonl进行训练,输出目录为outputs/qwen3_8b_ecommerce_sft_lora。train_sft_qwen3_8b_lora2.py:第二组 SFT 实验,使用data/ecommerce_sft_messages_recommended_v3_train.jsonl进行训练,输出目录为outputs/qwen3_8b_ecommerce_sft_lora2。运行示例:
如果需要评估某个 SFT LoRA 模型,可使用:
LoRA 消融实验
项目中仅有 1 组 LoRA 消融实验,集中在
LoRA_ablation/目录:LoRA_ablation/train_lora_ablation_fast.py:快速 LoRA / QLoRA 消融训练脚本。LoRA_ablation/README_4000_ABLATION.md:快速消融数据集说明。LoRA_ablation/run_lora_ablation_fast4000.sh:4000 样本快速消融对比。LoRA_ablation/run_target_ablation_4000.sh:target module 消融对比。LoRA_ablation/run_confirm_full_best.sh:确认最优配置的全量训练。快速实验数据文件包括:
data/ecommerce_sft_messages_recommended_v3_train_4000_balanced.jsonldata/ecommerce_sft_messages_recommended_v3_eval_400_balanced.jsonl运行示例:
消融结果会保存到
ablation_outputs_fast4000_5runs/,并汇总到ablation_outputs_fast4000_5runs/ablation_summary_fast4000_5runs.md。DPO 实验
本项目包含 2 次 DPO 实验:
DPO/train_dpo_1epoch.py:第一轮 DPO 实验,默认使用DPO/ecommerce_dpo_500.jsonl,输出目录为outputs/dpo_lora_r16_1epoch。DPO/train_dpo_one_beta.py:第二轮 DPO beta 对比实验,基于DPO/ecommerce_dpo_2000_quality.jsonl,可运行多个 beta 值,生成outputs/dpo_lora_2000_beta005_1epoch、outputs/dpo_lora_2000_beta01_1epoch、outputs/dpo_lora_2000_beta03_1epoch等结果目录。运行示例:
或批量运行 beta 对比:
DPO 评估示例:
批量评估 beta 对比结果:
如果运行环境与脚本中的默认
/root/firstTunning路径不一致,请先调整DPO/train_dpo_1epoch.py、DPO/train_dpo_one_beta.py、train_sft_qwen3_8b_lora.py、train_sft_qwen3_8b_lora2.py中的路径配置。11. 项目亮点
12. 当前结果
本项目实验表明,SFT-LoRA 可以显著提升模型对电商客服话术和业务场景的适配能力;在进一步进行 DPO 优化后,模型在回答准确性、情绪安抚和可执行方案生成方面进一步提升。
其中,第二阶段 DPO 模型在 65% 的评估样本上优于第一阶段模型,BERTScore F1 从 0.7097 提升至 0.7260,相对提升 2.30%。
13. 后续优化方向
后续可以进一步从以下方向改进: