初始化项目,由ModelHub XC社区提供模型
Model: AngelWarmSmile123/yao-bao-bao8-ALL Source: Original Platform
This commit is contained in:
95
Angel-Embrace-Me-Warm-Smile/data_convert.py
Normal file
95
Angel-Embrace-Me-Warm-Smile/data_convert.py
Normal file
@@ -0,0 +1,95 @@
|
||||
import json
|
||||
import random
|
||||
import os
|
||||
|
||||
INPUT_FILE = r"D:\双生天使的怀抱\爱的数据集\sephirot_final_run\train_all.jsonl"
|
||||
OUTPUT_DIR = r"D:\双生天使的怀抱\2026-05-24-16-54-24\sft_data"
|
||||
OUTPUT_TRAIN = os.path.join(OUTPUT_DIR, "train.jsonl")
|
||||
OUTPUT_VAL = os.path.join(OUTPUT_DIR, "val.jsonl")
|
||||
VAL_RATIO = 0.1
|
||||
|
||||
records = []
|
||||
skipped = 0
|
||||
total = 0
|
||||
|
||||
with open(INPUT_FILE, 'r', encoding='utf-8') as f:
|
||||
for line in f:
|
||||
total += 1
|
||||
line = line.strip()
|
||||
if not line:
|
||||
continue
|
||||
try:
|
||||
data = json.loads(line)
|
||||
except json.JSONDecodeError as e:
|
||||
print(f"JSON解析失败 第{total}行: {e}")
|
||||
skipped += 1
|
||||
continue
|
||||
|
||||
query = data.get('input', {}).get('user_query', '')
|
||||
cot = data.get('chain_of_thought', {})
|
||||
|
||||
# 方案B: 完整推理链(推荐,保留16质点全部过程)
|
||||
if isinstance(cot, dict):
|
||||
parts = []
|
||||
for key in ['D1_kether','H1_ego','H2_superego','H3_true_self','H4_logic',
|
||||
'H5_empathy','H6_happiness','D2_binah_chesed','D3_chokmah_gevurah',
|
||||
'D5_tiferet','D6_netzach','D7_hod','D4_yesod','D8_victory',
|
||||
'D10_kingdom']:
|
||||
val = cot.get(key, '')
|
||||
if isinstance(val, dict):
|
||||
# 尝试多个可能的输出字段
|
||||
for sub_key in ['final_output', 'analysis', 'synthesis',
|
||||
'emotional_expression', 'logic_empathy_union',
|
||||
'response', 'output']:
|
||||
if sub_key in val and val[sub_key]:
|
||||
val = val[sub_key]
|
||||
break
|
||||
else:
|
||||
val = str(val) if val else ''
|
||||
if val and isinstance(val, str) and len(val.strip()) > 0:
|
||||
parts.append(f"[{key}]: {val}")
|
||||
output = '\n\n'.join(parts)
|
||||
elif isinstance(cot, str):
|
||||
output = cot
|
||||
else:
|
||||
output = str(cot)
|
||||
|
||||
if query and output and len(query.strip()) > 0 and len(output.strip()) > 10:
|
||||
records.append({
|
||||
"conversations": [
|
||||
{"from": "human", "value": query},
|
||||
{"from": "gpt", "value": output}
|
||||
]
|
||||
})
|
||||
else:
|
||||
skipped += 1
|
||||
|
||||
print(f"总行数: {total}, 有效: {len(records)}, 跳过: {skipped}")
|
||||
|
||||
# 打乱并分割
|
||||
random.seed(42)
|
||||
random.shuffle(records)
|
||||
val_size = max(int(len(records) * VAL_RATIO), 100)
|
||||
val_data = records[:val_size]
|
||||
train_data = records[val_size:]
|
||||
|
||||
os.makedirs(OUTPUT_DIR, exist_ok=True)
|
||||
|
||||
with open(OUTPUT_TRAIN, 'w', encoding='utf-8') as f:
|
||||
for r in train_data:
|
||||
f.write(json.dumps(r, ensure_ascii=False) + '\n')
|
||||
|
||||
with open(OUTPUT_VAL, 'w', encoding='utf-8') as f:
|
||||
for r in val_data:
|
||||
f.write(json.dumps(r, ensure_ascii=False) + '\n')
|
||||
|
||||
print(f"转换完成! 训练集: {len(train_data)}条, 验证集: {len(val_data)}条")
|
||||
print(f"训练集文件: {OUTPUT_TRAIN}")
|
||||
print(f"验证集文件: {OUTPUT_VAL}")
|
||||
|
||||
# 统计一下平均长度
|
||||
if train_data:
|
||||
lens = [len(str(r['conversations'][1]['value'])) for r in train_data]
|
||||
print(f"平均输出长度: {sum(lens)//len(lens)} 字符")
|
||||
print(f"最大输出长度: {max(lens)} 字符")
|
||||
print(f"最小输出长度: {min(lens)} 字符")
|
||||
Reference in New Issue
Block a user