必须标准化角色标签、强制纯中文过滤、重构为单轮instruction-output格式,才能在消费级显卡上用sharegpt完成lora微调;否则将出现loss=nan或乱码。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要用ShareGPT数据集在消费级显卡上完成LoRA微调,必须绕过原始JSONL中role字段不统一、中英文混杂、多轮结构未对齐等硬伤,否则训练会持续输出loss=nan或生成乱码。你不需要重写整个数据流水线,只需聚焦三处关键改造:字段标准化、中文强过滤、单轮指令对重构。
清洗ShareGPT原始JSONL并统一角色标签
原始ShareGPT数据中存在"human"/"gpt"/"system"等多种from值,而Hugging Face标准训练器只识别"user"/"assistant"/"system",若不转换会导致apply_chat_template报错或mask错位。
第一步:用Python打开sharegpt_cleaned.jsonl,逐行读取每条记录的conversations数组。
第二步:遍历每轮消息,将"from": "human" → 替换为"role": "user","from": "gpt" → 替换为"role": "assistant","from": "system" → 保留为"role": "system";其余非法from值(如"bing"、"bard")整条消息直接丢弃。
第三步:检查每条记录是否至少含1轮"user"和1轮"assistant",若缺失则跳过该样本——【缺少user→assistant配对的对话无法构造有效监督信号】。
第四步:将修正后的字典以JSONL格式写入new_sharegpt_standard.jsonl,确保每行仅一个合法JSON对象,无逗号分隔、无括号包裹。
强制筛选纯中文对话样本
Langdetect对短文本误判率高,直接用detect()过滤会误杀大量含中文标点或数字的合理样本,必须结合字符分布二次校验。
方法一:调用langdetect.detect_langs(content)获取概率分布,仅当zh置信度≥0.95且为top1时才标记为中文。
方法二:对每轮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开头,用\n\n分隔。
② 对instruction做轻量包装:若原文含明确动词(如“解释”“列出”“改写”),保留原句;否则前置通用指令“请根据以下输入提供准确、简洁、专业的回答:”。
③ output截断至512字符,移除末尾省略号、重复感叹号及孤立emoji——【过长或带噪声的output会导致attention mask越界,引发CUDA illegal memory access】。
④ 将instruction与output拼为字符串:"User: {instruction}\n\nAssistant: {output}",传入tokenizer.encode()并设置add_special_tokens=True、truncation=True。
⑤ 保存为新JSONL,每行格式:{"text": "User: ...\n\nAssistant: ..."},删除所有其他字段。
配置Axolotl YAML使ShareGPT数据真正被识别
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: false且truncation: true同时启用,防止对话被截断后丢失等关键分隔符。











