菜鸟AI - 让提示词生成更简单! 全站导航 全站导航
AI工具安装 新手教程 进阶教程 辅助资源 AI提示词 热点资讯 技术资讯 产业资讯 内容生成 模型技术 AI信息库

已有账号?

首页 > 资讯 > LoRA微调实战:ShareGPT数据集训练高质量对话模型全流程
其他资讯

LoRA微调实战:ShareGPT数据集训练高质量对话模型全流程

2026-05-30
阅读 0
热度 0
作者 菜鸟AI编辑部
摘要

摘要

在消费级显卡上使用 ShareGPT 数据集对 LoRA 进行微调时,最大的痛点在于原始 JSONL 中角色字

在消费级显卡上使用 ShareGPT 数据集对 LoRA 进行微调时,最大的痛点在于原始 JSONL 中角色字段混乱、中英文混杂、多轮对话结构错位。这些数据缺陷若不预先处理,训练出的模型要么 loss 直接爆 NaN,要么输出大量乱码。实际上,无需从头搭建整套数据流水线,只需精准实施以下三项核心改造:字段标准化、中文文本强过滤、单轮指令对重构。

清洗 ShareGPT 原始 JSONL 并统一角色标签

原始 ShareGPT 数据中,每轮对话的 from 字段写法不统一,例如 humangptsystem 等。Hugging Face 的标准训练器仅识别 userassistantsystem。若不作转换,apply_chat_template 会直接报错,或者 attention mask 错位,导致损失函数计算异常。

具体操作分四步:
第一步,用 Python 读取 sharegpt_cleaned.jsonl,逐行解析每条记录的 conversations 数组。
第二步,遍历每轮消息,将 "from": "human" 替换为 "role": "user""from": "gpt" 替换为 "role": "assistant""from": "system" 保留为 "role": "system";其他不合规的 from 值(如 "bing""bard")直接丢弃整条消息。
第三步,检查每条记录至少包含一轮 user 和一轮 assistant,缺少任意一个则跳过该样本——缺少 user→assistant 配对的对话无法构造有效监督信号。
第四步,将修正后的字典以 JSONL 格式写入 new_sharegpt_standard.jsonl,确保每行只有一个合法 JSON 对象,无逗号分隔,无方括号包裹。

强制筛选纯中文对话样本

Langdetect 对短文本的误判率较高,仅依赖 detect() 过滤会误删大量包含中文标点或数字的合理样本,必须结合字符分布做二次校验。

有效做法是三种手段配合:
方法一,调用 langdetect.detect_langs(content) 获取概率分布,仅当 zh 置信度 ≥0.95 且排名第一时标记为中文。
方法二,对每轮 content 统计 u4e00-u9fff 区间 Unicode 码点数量,若占比低于 40% 且该轮不是 system 提示,则剔除整条对话——这能精准捕获 “Hello world 我想问…” 这类中英混杂样本。
方法三,用正则匹配去除包含连续 7 个以上 ASCII 字母、URL 协议头(http://https://)、代码块标识(```)的 content,避免模型学习到非自然语言模式。

重构为 LoRA 训练可用的单轮 instruction-output 格式

LoRA 微调要求输入严格对齐 tokenizer 的 chat template,且 loss 仅计算 assistant 回复部分。ShareGPT 原有的多轮结构必须压缩为单轮强映射对,否则梯度更新会污染 user 输入区域。

具体操作五步走:
① 提取每段对话中第一条 user 消息作为 instruction,紧随其后的 assistant 消息作为 output;若中间出现 system,则将其 content 拼接到 instruction 开头,用两个换行分隔。
② 对 instruction 做轻量包装:若原文已包含明确动词(如 “解释”“列出”“改写”),保留原句;否则在前面添加通用指令 “请根据以下输入提供准确、简洁、专业的回答:”。
③ output 截断至 512 字符,移除末尾的省略号、重复感叹号以及孤立 emoji——特别注意:output 过长或带噪声会导致 attention mask 越界,进而触发 CUDA illegal memory access。
④ 将 instruction 与 output 拼接为字符串:"User: {instruction}\n\nAssistant: {output}",传入 tokenizer.encode(),并设置 add_special_tokens=Truetruncation=True
⑤ 保存为新 JSONL,每行格式为 {"text": "User: ...\n\nAssistant: ..."},删除其他所有字段。

配置 Axolotl YAML 使 ShareGPT 数据真正被识别

最后一步是让 Axolotl 正确识别处理后的数据。Axolotl 默认不读取 text 字段,若 data_config 未显式声明,它会去扫描字段名中含 input/output 的列,找不到则直接报错 "No samples found in dataset"

解决方式:打开 axolotl/config/qlora.yaml,在 dataset_config 下方添加两行:

text_field: "text"
input_format: "chat"

同时删除原配置中类似 input_field: "instruction"data_source: "alpaca" 的冗余行——它们会覆盖 text_field 的绑定。还需确认 pad_to_max_length: falsetruncation: true 同时开启,防止对话被截断后丢失 <|eot_id|> 等关键分隔符。

来源:互联网

免责声明

本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。

同类文章推荐

相关文章推荐

更多