必须将原始数据转为对应模型要求的json/jsonl格式:chatglm-6b用{"instruction":"...","input":"...","output":"..."};chatglm3用{"prompt":"...","response":"..."};glm-4用{"query":"...","response":"...","history":[...]},字段名须与data_collator严格一致。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要把原始文本数据转换成ChatGLM系列模型可识别的指令微调格式,否则加载时会报错或训练无效。不同版本(ChatGLM-6B、ChatGLM3、GLM-4)对输入字段名要求不同,但核心结构都是“指令+输入+输出”三元组,且必须为JSON或JSONL格式。
确认目标模型版本对应的数据结构
先明确你用的是哪个模型:ChatGLM-6B用{"instruction": "...", "input": "...", "output": "..."};ChatGLM3常用{"prompt": "...", "response": "..."};GLM-4官方示例则倾向{"query": "...", "response": "...", "history": [...]}。混用字段名会导致tokenizer无法正确拼接,【字段名必须与模型代码中定义的data_collator逻辑严格一致】。
例如,若你用的是Hugging Face Transformers + PEFT加载ChatGLM3-6B,但数据里写的是"instruction"而非"prompt",模型会把整个字典当字符串喂进去,loss不下降、生成全乱码。
方法一:用Python脚本批量转换原始CSV/Excel
假设你有一份医疗问答Excel,A列为问题,B列为医生回答,需转为ChatGLM3的prompt/response格式:
① 安装依赖:pip install pandas openpyxl;
② 运行以下脚本(替换input.xlsx和output.jsonl路径):
import pandas as pd<br>df = pd.read_excel("input.xlsx")<br>records = []<br>for _, row in df.iterrows():<br> records.append({"prompt": row["A"], "response": row["B"]})<br>with open("output.jsonl", "w", encoding="utf-8") as f:<br> for r in records:<br> f.write(json.dumps(r, ensure_ascii=False) + "\n")
注意:JSONL每行必须是独立合法JSON,末尾不能有逗号,也不能换行缩进——否则datasets.load_dataset("json", data_files=...)会直接抛JSONDecodeError。
方法二:手动构造单条JSON验证结构
打开任意文本编辑器,严格按如下格式手敲一条(不要复制粘贴带隐藏字符的引号):
{"prompt": "高血压患者能吃阿司匹林吗?", "response": "需根据心血管风险分层决定。低危者不推荐常规使用;中高危者如无禁忌可小剂量(75–100 mg/日)长期服用。"}
保存为test.json,然后在Python中运行:from datasets import load_dataset; ds = load_dataset("json", data_files="test.json"); print(ds["train"][0])。如果输出字典含prompt和response键,说明格式通过;若报错或键名变成promptufeff,说明文件含BOM头,需用VS Code另存为UTF-8无BOM格式。
方法三:适配ADGEN类广告生成任务
如果你的数据是“输入商品描述→输出广告文案”,参考ADGEN标准格式:
方法一:保留原始content和summary字段,用Hugging Face datasets内置映射:
def format_adgen(examples):<br> return {<br> "prompt": [f"请为以下商品生成广告文案:{c}" for c in examples["content"]],<br> "response": examples["summary"]<br> }<br>ds = ds.map(format_adgen, batched=True)
方法二:直接重命名字段(更轻量):
ds = ds.rename_columns({"content": "prompt", "summary": "response"})
这一步必须在tokenize前完成,否则tokenizer(prompt + response)会因字段名错误而拼接失败。











