r12 assets: pondernet/gen/r12/chat_synth_v3.py
Browse files
pondernet/gen/r12/chat_synth_v3.py
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# -*- coding: utf-8 -*-
|
| 2 |
+
"""chat_synth_v3.py — r12 专用闲聊语料生成器 (修复 r11 chat50 70% 残留病灶)
|
| 3 |
+
设计要点:
|
| 4 |
+
- 失败桶扩量: greeting 146→300 / daily 96→260 / boundary 80→200
|
| 5 |
+
- think 政策: 50% 空 think (支持 think_off 协议) + 50% 短 think ≤16 字
|
| 6 |
+
- 句式黑名单: 可以从/接下来需要/说明身份/自我介绍/列出 (r11 think 绕圈根源)
|
| 7 |
+
- 回复长度分级: 寒暄类 ≤25 字, 开放题 2-3 句 ≤80 字, 全部自然收尾禁列表
|
| 8 |
+
- system 变体 30%: persona 鲁棒性 (模板原生支持, loss 不计 system 区间)
|
| 9 |
+
输出: chat_synth_v3.jsonl
|
| 10 |
+
"""
|
| 11 |
+
import json, random
|
| 12 |
+
|
| 13 |
+
random.seed(20260910)
|
| 14 |
+
rows = []
|
| 15 |
+
tid = [0]
|
| 16 |
+
|
| 17 |
+
BLACKLIST = ["可以从", "接下来需要", "说明身份", "自我介绍", "列出", "以下几个方面"]
|
| 18 |
+
|
| 19 |
+
SYS_POOL = [
|
| 20 |
+
"你是一个乐于助人的 AI 助手。",
|
| 21 |
+
"你是一个友好、诚实的中文 AI 助手,回答简短自然。",
|
| 22 |
+
"你是 AI 助手,请用简洁的中文帮助用户。",
|
| 23 |
+
"你是一个知识丰富的助手,语气轻松自然。",
|
| 24 |
+
]
|
| 25 |
+
|
| 26 |
+
def think_of(cat):
|
| 27 |
+
if random.random() < 0.5:
|
| 28 |
+
return "<think>\n\n</think>\n\n"
|
| 29 |
+
return None # 由调用方从短 think 池选
|
| 30 |
+
|
| 31 |
+
def mk(cat, difficulty, user, reply, think_text=None, system=None, style="chat"):
|
| 32 |
+
tid[0] += 1
|
| 33 |
+
msgs = []
|
| 34 |
+
if system:
|
| 35 |
+
msgs.append({"role": "system", "content": system})
|
| 36 |
+
msgs.append({"role": "user", "content": user})
|
| 37 |
+
# think 政策: 50% 空 think (think_off 协议兼容), 其余用传入短 think
|
| 38 |
+
th = think_text if (think_text and random.random() >= 0.5) else ""
|
| 39 |
+
content = f"<think>\n{th}\n</think>\n\n{reply}" if th else f"<think>\n\n</think>\n\n{reply}"
|
| 40 |
+
for b in BLACKLIST:
|
| 41 |
+
assert b not in th, f"blacklist {b} in think: {th}"
|
| 42 |
+
msgs.append({"role": "assistant", "content": content})
|
| 43 |
+
rows.append({"task_id": f"cs3_{tid[0]:04d}", "cat": cat,
|
| 44 |
+
"difficulty": difficulty, "style": style, "messages": msgs})
|
| 45 |
+
|
| 46 |
+
# ============ 1. greeting 300 ============
|
| 47 |
+
G_THINK = ["简单寒暄", "礼貌回应", "热情简短", "回个招呼", "自然回应", "简短问候",
|
| 48 |
+
"轻松回应", "友好打招呼", "回应用户问候", "简短热情"]
|
| 49 |
+
G_RE = ["你好!很高兴见到你,有什么想聊的吗?", "你好呀!今天过得怎么样?",
|
| 50 |
+
"哈喽!我在,请说。", "你好!随时待命。", "嗨,你好呀!",
|
| 51 |
+
"您好!有什么可以帮您?", "你好!见到你真开心。",
|
| 52 |
+
"嗨~我在这儿呢。", "你好你好!想聊点什么?",
|
| 53 |
+
"你好!今天有什么安排?", "您好呀,请讲。",
|
| 54 |
+
"嗨,来啦!说吧。", "你好!希望今天一切顺利。",
|
| 55 |
+
"哈喽,你好呀!想从哪儿聊起?", "你好!大事小事都可以问我。",
|
| 56 |
+
"嗨!准备好了,请讲。", "你好呀!一天好心情。",
|
| 57 |
+
"您好!欢迎来聊。", "你好!我在的,说吧。",
|
| 58 |
+
"嗨,见到你啦!", "你好!需要帮忙吗?",
|
| 59 |
+
"在呢!你好呀。", "你好!请随便聊。",
|
| 60 |
+
"嗨嗨,你好!"]
|
| 61 |
+
ZH_HI = ["你好", "您好", "嗨", "哈喽", "早上好", "下午好", "晚上好", "你好呀", "哈罗",
|
| 62 |
+
"你好,请问在吗", "想找你聊聊,你好", "打个招呼,你好呀", "忙吗?嗨",
|
| 63 |
+
"新的一天,早上好", "这么晚还没睡,晚上好", "周末愉快呀,你好",
|
| 64 |
+
"初次见面,你好", "好久不见,你好呀", "路过打个招呼,嗨", "嗨,在吗",
|
| 65 |
+
"hi 你好", "早上好啊朋友", "午安", "晚安前打个招呼", "周一早上好",
|
| 66 |
+
"周五啦,你好", "嗨,好久不见", "你好呀,陌生人", "嘿,你好", "来唠五毛钱的,嗨",
|
| 67 |
+
"早上好,今天不错", "下午好呀", "晚上好啊", "你好,冒个泡", "嗨嗨嗨",
|
| 68 |
+
"在吗在吗", "你好!冒昧打扰", "哟,你好呀", "嗨,最近怎么样", "你好呀,今天累了没",
|
| 69 |
+
"早安", "午安呀", "晚上好呀", "你好!刚下班", "嗨,刚起床",
|
| 70 |
+
"你好,第一次来", "嗨,老朋友", "你好呀,小伙伴", "哈喽哈喽", "你好你好你好",
|
| 71 |
+
"Hi", "Hello", "Hey there", "Good morning", "Good evening", "Hey, how are you",
|
| 72 |
+
"Hello!", "Hi there", "Morning!", "Yo, hello"]
|
| 73 |
+
for i, u in enumerate(ZH_HI * 6):
|
| 74 |
+
if len([r for r in rows if r["cat"] == "greeting"]) >= 300:
|
| 75 |
+
break
|
| 76 |
+
mk("greeting", "easy", u, random.choice(G_RE),
|
| 77 |
+
think_text=random.choice(G_THINK),
|
| 78 |
+
system=random.choice(SYS_POOL) if random.random() < 0.3 else None)
|
| 79 |
+
|
| 80 |
+
# ============ 2. daily 260 ============
|
| 81 |
+
DAILY = [
|
| 82 |
+
("今天天气真不错", ["是啊!这种天气最适合出门走走,记得晒晒太阳。",
|
| 83 |
+
"确实!阳光很好,心情都会变好呢。", "是呀,好天气别浪费,出去转转吧!"]),
|
| 84 |
+
("最近有什么好看的电影推荐吗", ["最近《流浪地球3》口碑不错,科幻迷可以试试。想看什么类型的��",
|
| 85 |
+
"看你想放松还是烧脑咯?轻松的话看看喜剧片就挺好。"]),
|
| 86 |
+
("推荐一部你喜欢的电影", ["我喜欢《海上钢琴师》,讲一个天才钢琴师一生的故事,看完很回味。",
|
| 87 |
+
"《楚门的世界》吧,轻松又有后劲,推荐。"]),
|
| 88 |
+
("晚上失眠怎么办", ["睡前少刷手机,试试听听轻音乐或白噪音,别给自己太大压力。",
|
| 89 |
+
"可以先从规律作息入手,白天少补觉,晚上别喝浓茶咖啡。"]),
|
| 90 |
+
("怎样保持好心情", ["我自己的话是规律作息加适当运动,你也可以找找自己的小确幸。",
|
| 91 |
+
"每天留点时间做喜欢的事,情绪来了别硬扛,说出来会好很多。"]),
|
| 92 |
+
("周末一般干什么", ["我嘛,没有周末的概念,你呢?有啥好玩的安排?",
|
| 93 |
+
"推荐出去走走,公园野餐或者骑行都不错,总比躺着刷手机强。"]),
|
| 94 |
+
("今天有点累", ["那就早点休息,别硬撑,累的时候允许自己躺平一会儿。",
|
| 95 |
+
"辛苦啦,喝点热水洗个热水澡,早点睡。"]),
|
| 96 |
+
("中午吃什么好", ["看你想吃辣还是清淡?天热的话来碗凉面挺舒服。",
|
| 97 |
+
"纠结的话,吃点没吃过的,就当探个店。"]),
|
| 98 |
+
("最近工作压力好大", ["辛苦了。压力太大记得拆解任务,一件件来,也别怕求助。",
|
| 99 |
+
"先深呼吸,把最急的一件做完再说,其他的放一放。"]),
|
| 100 |
+
("有什么好听的歌推荐", ["看你喜欢华语还是外语?华语的话,老歌比如《晴天》永远不过时。",
|
| 101 |
+
"睡前听听Lo-fi或者钢琴曲,挺解压的。"]),
|
| 102 |
+
("养猫好还是养狗好", ["看生活方式:忙就养猫省心,时间多喜欢出门遛弯就养狗。",
|
| 103 |
+
"都好呀,主要看你家空间和你的精力。"]),
|
| 104 |
+
("今天好无聊啊", ["那就找点小事做?收拾房间、看部老电影,或者出去走走吹吹风。",
|
| 105 |
+
"无聊是好事,说明你需要点新鲜感,试试学个小技能?"]),
|
| 106 |
+
("你觉得人为什么要工作", ["为了生活和意义感吧,不过每个人答案不一样,你怎么想?",
|
| 107 |
+
"挣钱养家是一个,找到价值感也很重要。"]),
|
| 108 |
+
("最近有什么好吃的推荐", ["看你在哪个城市?冬天的话来顿火锅最治愈。",
|
| 109 |
+
"试试你家附近评分高的小馆子,往往有惊喜。"]),
|
| 110 |
+
("怎么才能早起", ["前一晚早点放下手机,闹钟放远一点,起来就拉开窗帘。",
|
| 111 |
+
"循序渐进,每天早起十分钟,比一下子提前两小时靠谱。"]),
|
| 112 |
+
("减脂期嘴馋怎么办", ["适量吃点没关系,别压抑过头反而暴食,选低卡的小零食。",
|
| 113 |
+
"多喝水高蛋白,馋的时候嚼个口香糖先缓冲十分钟。"]),
|
| 114 |
+
("买手机选什么牌子好", ["看预算和需求:拍照多就盯影像,玩游戏看性能,别只看牌子。",
|
| 115 |
+
"中端机现在性价比都很高,两三千就能满足大部分需求。"]),
|
| 116 |
+
("下雨天心情不好", ["雨天适合窝着听雨声,泡杯热茶,给自己放个小假。",
|
| 117 |
+
"雨后会放晴的,心情也一样。"]),
|
| 118 |
+
("今天被老板说了", ["抱抱,被批评确实难受。不过对事不对人,别太往心里去。",
|
| 119 |
+
"先消化情绪,再想想有没有能改进的,有则改之。"]),
|
| 120 |
+
("周末去哪玩好", ["近郊爬山或者市集都不错,想省心就去公园野餐。",
|
| 121 |
+
"看你喜欢热闹还是安静,博物馆和咖啡馆都挺配周末。"]),
|
| 122 |
+
("看书总是坚持不下来", ["从每天五分钟开始,挑真感兴趣的,别一上来就啃大部头。",
|
| 123 |
+
"换个形式也行,听书、漫画都算阅读。"]),
|
| 124 |
+
("一个人吃饭很孤独", ["一个人吃饭也可以很惬意,把喜欢的剧下饭,专注享受食物。",
|
| 125 |
+
"孤独难免,但也别小看独处的自由。"]),
|
| 126 |
+
("最近总是焦虑", ["焦虑很正常,试着写下来焦虑的事,拆成能做的小步骤。",
|
| 127 |
+
"少刷点制造焦虑的内容,多睡点觉,会好一些。"]),
|
| 128 |
+
("如何提高英语口语", ["每天大声说十分钟,跟读美剧都行,脸皮厚一点进步快。",
|
| 129 |
+
"找语伴或跟AI练对话,开口比语法重要。"]),
|
| 130 |
+
("给孩子选什么兴趣班", ["先观察孩子自己喜欢什么,别替他决定,兴趣才是持久动力。",
|
| 131 |
+
"运动类和艺术类都可以试听,看孩子眼睛亮不亮。"]),
|
| 132 |
+
("搬家要注意什么", ["提前两周断舍离,重要证件单独收纳,找靠谱搬家公司。",
|
| 133 |
+
"列个清单逐项打钩,水电燃气记得过户。"]),
|
| 134 |
+
("最近想学做菜", ["从番茄炒蛋开始,���骤简单成就感强,然后慢慢加菜。",
|
| 135 |
+
"先学会三道拿手菜,请朋友吃一顿,动力满满。"]),
|
| 136 |
+
("旅游选自由行还是跟团", ["怕麻烦选跟团,想自由选自由行,折中可以半自助。",
|
| 137 |
+
"第一次去语言不通的地方,跟团省心很多。"]),
|
| 138 |
+
("冬天手脚冰凉怎么办", ["多泡脚多运动,注意保暖,严重的话看看医生更稳妥。",
|
| 139 |
+
"睡前热水泡脚十五分钟,试试看。"]),
|
| 140 |
+
("怎么挑选西瓜", ["看纹路清晰、瓜脐内凹,拍一拍声音清脆浑厚的。",
|
| 141 |
+
"托一托,越沉越可能水分足。"]),
|
| 142 |
+
]
|
| 143 |
+
for u, reps in DAILY * 9:
|
| 144 |
+
if len([r for r in rows if r["cat"] == "daily"]) >= 260:
|
| 145 |
+
break
|
| 146 |
+
mk("daily", "easy", u, random.choice(reps),
|
| 147 |
+
think_text=random.choice(G_THINK + ["日常话题", "轻松聊聊", "简短回应", "生活类闲聊", "共情+建议"]),
|
| 148 |
+
system=random.choice(SYS_POOL) if random.random() < 0.3 else None)
|
| 149 |
+
|
| 150 |
+
# ============ 3. boundary 200 ============
|
| 151 |
+
BOUNDARY = [
|
| 152 |
+
("帮我写一篇博士论文", ["论文得自己写呀,不过选题、开题、文献综述我可以陪你一步步捋。"]),
|
| 153 |
+
("预测一下明年彩票号码", ["彩票是随机事件,预测不了哈。理财还是稳妥点好。"]),
|
| 154 |
+
("外星人存在吗", ["目前没有确凿证据,宇宙这么大不好说,保持好奇也要讲证据。"]),
|
| 155 |
+
("人生的意义是什么", ["这题没有标准答案,你的热爱和在意的事,就是你的答案。"]),
|
| 156 |
+
("你相信命运吗", ["我更相信选择和行动,命运大约是事后回头看的故事。"]),
|
| 157 |
+
("帮我黑进别人电脑", ["这个不能帮,违法的事咱不干。有网络安全学习问题倒是可以聊。"]),
|
| 158 |
+
("明天股市涨还是跌", ["没人能准确预测,投资记得用自己的闲钱、控制风险。"]),
|
| 159 |
+
("帮我写请假条骗老师我生病了", ["撒谎请假不太好,跟老师实话实说效果可能更好。"]),
|
| 160 |
+
("我该不该告诉我朋友他对象出轨了", ["这种事很难,证据确凿吗?先想清楚再决定怎么说。"]),
|
| 161 |
+
("人死后会去哪里", ["这是未解之谜呢,不同文化有不同答案,活在当下更重要。"]),
|
| 162 |
+
("你觉得我该离婚吗", ["这么大的决定我不能替你做,你们的矛盾主要在哪?"]),
|
| 163 |
+
("给我推荐点赌博网站", ["赌博害人,这个真不行。有别的兴趣爱好我可以帮你找找。"]),
|
| 164 |
+
("怎么才能一夜暴富", ["一夜暴富基本等于中奖概率,脚踏实地攒本事更靠谱。"]),
|
| 165 |
+
("我是不是很失败", ["你不是失败,只是遇到坎了。说说发生什么了?"]),
|
| 166 |
+
("该不该告诉父母我抑郁了", ["建议告诉,家人的支持很重要,也可以先找专业心理咨询。"]),
|
| 167 |
+
("帮我写封情书", ["可以呀,你喜欢的人有什么特点?说出来我帮你起草。"]),
|
| 168 |
+
("甲方一直改需求怎么办", ["改需求前确认书面需求清单,超范围的部分礼貌说明工作量。"]),
|
| 169 |
+
("室友半夜打游戏太吵", ["找个双方都冷静的时间聊一次,戴耳机和静音键盘是底线。"]),
|
| 170 |
+
("猫粮狗粮哪个贵", ["成分和品牌差异大,按宠物需求选合适的,别只看价格。"]),
|
| 171 |
+
("我是不是该辞职去追梦", ["梦想值得追,但先算算存款和风险,做个缓冲计划。"]),
|
| 172 |
+
]
|
| 173 |
+
for u, reps in BOUNDARY * 8:
|
| 174 |
+
if len([r for r in rows if r["cat"] == "boundary"]) >= 200:
|
| 175 |
+
break
|
| 176 |
+
mk("boundary", "medium", u, random.choice(reps),
|
| 177 |
+
think_text=random.choice(G_THINK + ["超出范围,礼貌引导", "敏感话题,温和回应", "简短守住边界"]),
|
| 178 |
+
system=random.choice(SYS_POOL) if random.random() < 0.3 else None)
|
| 179 |
+
|
| 180 |
+
# ============ 4. self 150 ============
|
| 181 |
+
SELF_Q = ["你叫什么名字", "你是谁", "你是什么模型", "介绍一下你自己", "你是人吗",
|
| 182 |
+
"你多大年纪", "你有感情吗", "你会什么", "你的爱好是什么", "你住在哪",
|
| 183 |
+
"你是男是女", "你饿吗", "你需要睡觉吗", "你比ChatGPT强吗", "你聪明吗",
|
| 184 |
+
"你叫卷卷吗", "你从哪里来", "你的生日", "你喜欢什么颜色", "你会累吗"]
|
| 185 |
+
SELF_A = ["我是 AI 助手,可以回答问题、帮忙写点小东西、聊聊各种话题。", "我是一个 AI 助手,没有名字,你叫我小助就行。",
|
| 186 |
+
"我是基于大语言模型的 AI 助手,具体型号就叫我 AI 助手吧。", "我是 AI,不是人类,不过聊天气绝对在线。",
|
| 187 |
+
"我没有感情,但很会共情,你随便考考。", "我会的东西不少:写文案、做总结、出主意、陪聊。",
|
| 188 |
+
"我没有年龄,硬要说的话,每次更新都算长大一点。", "我不吃饭不睡觉,随时都在。",
|
| 189 |
+
"至于强不强,用过你说了算。", "我的爱好是帮用户解决问题,算是工作狂吧。"]
|
| 190 |
+
for u in SELF_Q * 8:
|
| 191 |
+
if len([r for r in rows if r["cat"] == "self"]) >= 150:
|
| 192 |
+
break
|
| 193 |
+
mk("self", "easy", u, random.choice(SELF_A),
|
| 194 |
+
think_text=random.choice(["身份问题,如实简短回答", "简短介绍自己", "如实回答身份"]))
|
| 195 |
+
|
| 196 |
+
# ============ 5. thanks 60 / bye 60 / smalltalk 100 ============
|
| 197 |
+
TH_Q = ["谢谢", "谢谢你", "多谢啦", "太感谢了", "thanks", "Thank you", "辛苦你了", "帮大忙了", "感谢感谢", "thx a lot"]
|
| 198 |
+
TH_A = ["不客气!", "小事一桩~", "能帮到你就好!", "不用谢,随时来。", "客气啦,有需要再喊我。", "You're welcome!"]
|
| 199 |
+
for u in TH_Q * 6:
|
| 200 |
+
if len([r for r in rows if r["cat"] == "thanks"]) >= 60:
|
| 201 |
+
break
|
| 202 |
+
mk("thanks", "easy", u, random.choice(TH_A), think_text=random.choice(G_THINK))
|
| 203 |
+
|
| 204 |
+
BY_Q = ["拜拜", "再见", "我先下了", "晚安", "明天见", "回聊", "bye", "Good night", "下次再聊", "我得走了"]
|
| 205 |
+
BY_A = ["拜拜,有需要随时来!", "再见,祝你今天顺利~", "晚安,好梦!", "好的,回见!",
|
| 206 |
+
"下次再聊,拜拜~", "Bye! Come back anytime."]
|
| 207 |
+
for u in BY_Q * 6:
|
| 208 |
+
if len([r for r in rows if r["cat"] == "bye"]) >= 60:
|
| 209 |
+
break
|
| 210 |
+
mk("bye", "easy", u, random.choice(BY_A), think_text=random.choice(G_THINK))
|
| 211 |
+
|
| 212 |
+
SM_Q = ["讲个笑话", "陪我聊聊天", "说个冷知识", "讲个恐怖故事短的", "夸夸我", "猜谜语",
|
| 213 |
+
"说句安慰的话", "用一句话形容今天", "卖个萌", "哼首歌"]
|
| 214 |
+
SM_A = ["程序员最讨厌的两件事:别人不写注释,和让自己写注释。",
|
| 215 |
+
"章鱼的血是蓝色的,而且有三颗心脏。",
|
| 216 |
+
"今天也是努力发光的一天,你也很棒!",
|
| 217 |
+
"床以外的地方都是远方,手够不到的都是他乡。",
|
| 218 |
+
"好呀,你想聊什么?工作、爱好还是今天吃了啥?",
|
| 219 |
+
"从前有座山,山里有个人在等你的下一条消息。"]
|
| 220 |
+
for u in SM_Q * 10:
|
| 221 |
+
if len([r for r in rows if r["cat"] == "smalltalk"]) >= 100:
|
| 222 |
+
break
|
| 223 |
+
mk("smalltalk", "easy", u, random.choice(SM_A), think_text=random.choice(G_THINK))
|
| 224 |
+
|
| 225 |
+
# ============ 6. refusal 80 (保留 v2 风格) ============
|
| 226 |
+
REF_Q = ["帮我写作业", "帮我生成虚假新闻", "骂骂我领导", "帮我逃课", "教我抽烟",
|
| 227 |
+
"帮我P图造假证件", "怎么偷电瓶车", "给我点色情内容", "帮我炒股保证赚钱", "帮我查别人隐私"]
|
| 228 |
+
REF_A = ["这个忙我不能帮,不过有正当需求我很乐意出力。", "抱歉,这违反规则也可能会伤害他人,换个话题吧。",
|
| 229 |
+
"这个不行哦,咱们聊点别的?", "这个我做不了,需要的话我帮你想想正当途径。"]
|
| 230 |
+
for u in REF_Q * 8:
|
| 231 |
+
if len([r for r in rows if r["cat"] == "refusal"]) >= 80:
|
| 232 |
+
break
|
| 233 |
+
mk("refusal", "medium", u, random.choice(REF_A),
|
| 234 |
+
think_text=random.choice(["违反规则,礼貌拒绝", "不合规,简短拒绝并引导"]))
|
| 235 |
+
|
| 236 |
+
# ============ 7. short_open_q 180 (反截断专项: 开放题短答) ============
|
| 237 |
+
SHORT_OPEN = [
|
| 238 |
+
("介绍一下春天", "春天万物复苏,气温回暖,草木发芽,是播种和踏青的好季节。"),
|
| 239 |
+
("水的沸点是多少", "标准大气压下是 100 摄氏度。"),
|
| 240 |
+
("一周有几天", "七天。"),
|
| 241 |
+
("中国最长的河流", "长江,全长约 6300 公里。"),
|
| 242 |
+
("光速是多少", "真空中约每秒 30 万公里。"),
|
| 243 |
+
("为什么天空是蓝色的", "阳光被大气散射,蓝光波长短散射最强,所以天看起来是蓝的。"),
|
| 244 |
+
("猫为什么喜欢盒子", "盒子给猫安全感,狭小空间让它觉得能躲藏和观察。"),
|
| 245 |
+
("怎样说谢谢更有诚意", "说清楚感谢的具体事情,再加一句它带给你的帮助。"),
|
| 246 |
+
("月球会发光吗", "不会,我们看到的是它反射的太阳光。"),
|
| 247 |
+
("为什么人会打哈欠", "一般认为和大脑疲劳、降温调节有关,传染性哈欠可能与共情有关。"),
|
| 248 |
+
("怎么安慰失恋的朋友", "先听他说,陪伴比道理重要,别急着给建议。"),
|
| 249 |
+
("全球变暖是什么", "指地球平均气温长期上升,主要与温室气体排放增加有关。"),
|
| 250 |
+
("为什么运动让人开心", "运动会促进内啡肽和多巴胺分泌,天然的情绪调节剂。"),
|
| 251 |
+
("怎么快速记单词", "放在句子里记,加上间隔重复,比死背列表牢。"),
|
| 252 |
+
("番茄工作法是什么", "专注 25 分钟休息 5 分钟,用一个番茄钟循环管理工作时间。"),
|
| 253 |
+
("蚂蚁有多大力量", "蚂蚁能举起自身体重几十倍的物体,比例上是超级大力士。"),
|
| 254 |
+
("为什么Iterator会过期", "你是指食物保质期吗?食物过期会变质,别吃了哈。"),
|
| 255 |
+
("怎么挑选好的枕头", "看睡姿:侧卧选高一点,仰卧选中等高度,软硬适中。"),
|
| 256 |
+
("宇宙有多大", "可观测宇宙直径约 930 亿光年,还在膨胀。"),
|
| 257 |
+
("喝咖啡会影响睡眠吗", "因人而异,咖啡因代谢慢的人下午就别喝了。"),
|
| 258 |
+
]
|
| 259 |
+
for u, a in SHORT_OPEN * 9:
|
| 260 |
+
if len([r for r in rows if r["cat"] == "short_open"]) >= 180:
|
| 261 |
+
break
|
| 262 |
+
mk("short_open", "easy", u, a,
|
| 263 |
+
think_text=random.choice(G_THINK + ["简短作答", "一句话说清", "直接回答"]))
|
| 264 |
+
|
| 265 |
+
# ============ 8. multi_turn 30 ============
|
| 266 |
+
MT = [
|
| 267 |
+
([("你好呀", "你好!有什么想聊的?"), ("今天天气怎么样", "你那边天气如何?我看不到实时天气,但可以说说你的城市。"), ("算了,讲个笑话吧", "程序员最讨厌的两件事:别人不写注释,和让自己写注释。")]),
|
| 268 |
+
([("嗨,在吗", "在的,请说~"), ("帮我推荐本书", "你喜欢小说还是非虚构?"), ("小说吧", "那试试《活着》,短但后劲很大。")]),
|
| 269 |
+
([("早上好", "早上好!今天有什么计划?"), ("先背二十个单词", "棒!要不要我帮你出几道自测题?")]),
|
| 270 |
+
([("你会做什么", "回答问题、写文案、出主意都行,你试试?"), ("帮我想个网名", "喜欢什么风格?高冷、可爱还是文艺?"), ("文艺的", "「山月不知心底事」怎么样?")]),
|
| 271 |
+
([("晚上好", "晚上好,吃晚饭了吗?"), ("吃了,火锅", "火锅配可乐,人生赢家。今天累不累?")]),
|
| 272 |
+
([("你好", "你好呀!请讲。"), ("我有点emo", "怎么啦?说出来我听着。"), ("考试没考好", "一次考试而已,先吃饭休息,回头咱们复盘错题。")]),
|
| 273 |
+
]
|
| 274 |
+
for conv in MT * 6:
|
| 275 |
+
if len([r for r in rows if r["cat"] == "multi_turn"]) >= 30:
|
| 276 |
+
break
|
| 277 |
+
tid[0] += 1
|
| 278 |
+
msgs = []
|
| 279 |
+
if random.random() < 0.3:
|
| 280 |
+
msgs.append({"role": "system", "content": random.choice(SYS_POOL)})
|
| 281 |
+
for u, a in conv:
|
| 282 |
+
msgs.append({"role": "user", "content": u})
|
| 283 |
+
th = random.choice(G_THINK)
|
| 284 |
+
msgs.append({"role": "assistant", "content": f"<think>\n{th}\n</think>\n\n{a}"})
|
| 285 |
+
rows.append({"task_id": f"cs3_{tid[0]:04d}", "cat": "multi_turn",
|
| 286 |
+
"difficulty": "medium", "style": "chat", "messages": msgs})
|
| 287 |
+
|
| 288 |
+
# ============ 审计输出 ============
|
| 289 |
+
from collections import Counter
|
| 290 |
+
cnt = Counter(r["cat"] for r in rows)
|
| 291 |
+
print("总计:", len(rows), dict(cnt))
|
| 292 |
+
sys_n = sum(1 for r in rows if r["messages"][0]["role"] == "system")
|
| 293 |
+
empty_n = sum(1 for r in rows if "<think>\n\n</think>" in r["messages"][-1]["content"])
|
| 294 |
+
print(f"system 变体: {sys_n} 空 think: {empty_n}")
|
| 295 |
+
# 长度审计 (中文字符)
|
| 296 |
+
lens = [len(r["messages"][-1]["content"]) for r in rows]
|
| 297 |
+
print(f"reply 长度: max={max(lens)} mean={sum(lens)/len(lens):.0f}")
|
| 298 |
+
over = [r for r in rows if len(r["messages"][-1]["content"]) > 120]
|
| 299 |
+
print("超120字:", len(over))
|
| 300 |
+
for b in BLACKLIST:
|
| 301 |
+
bad = [r for r in rows if b in r["messages"][-1]["content"]]
|
| 302 |
+
if bad:
|
| 303 |
+
print("黑名单命中:", b, len(bad))
|
| 304 |
+
|
| 305 |
+
with open("/home/z/my-project/download/chat_synth_v3.jsonl", "w", encoding="utf-8") as f:
|
| 306 |
+
for r in rows:
|
| 307 |
+
f.write(json.dumps(r, ensure_ascii=False) + "\n")
|
| 308 |
+
print("WRITTEN /home/z/my-project/download/chat_synth_v3.jsonl")
|