tchbcb commited on
Commit
6261c04
·
verified ·
1 Parent(s): 5213232

r12 assets: pondernet/gen/r12/chat_synth_v3.py

Browse files
Files changed (1) hide show
  1. pondernet/gen/r12/chat_synth_v3.py +308 -0
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")