数据集模拟生成
之前章节我们已经演示过ChatGPT 如何根据 prompt 编写文章或续写文章,文本生成的作用不仅仅在语文方面有用,本节我们演示另一种场景,利用 ChatGPT 来生成数据。看似作用差不多,其实这是目前开源社区非常常用的大语言模型研究中的一步,学名叫 self-instruction。简单来说,将一些人工编写好的或者挑选好的极少数训练数据,交给 ChatGPT 进行仿写,可以得到多出两三个数量级的新训练数据。这样有助于大语言模型的微调训练。
我们以北京航空航天大学开源的 LogQA 标注数据集(https://github.com/LogQA-dataset/LogQA/blob/main/data/Spark/qa.json.train)中的前十行训练数据为例,让 ChatGPT 来生成更多数据:
{"Question": "What stage was the task 28.0 completed in?", "Answer": "29.0", "RawLog": "Finished task 28.0 in stage 29.0 (TID 1348). 2128 bytes result sent to driver"} {"Question": "How many kb is broadcast_3 free?", "Answer": "318.5", "RawLog": "Block broadcast_3 stored as values in memory (estimated size 384.0 B, free 318.5 KB)"} {"Question": "Is partition rdd_42_18 found?", "Answer": "not", "RawLog": "Partition rdd_42_18 not found, computing it"} {"Question": "Is partition rdd_42_15 found?", "Answer": "not", "RawLog": "Partition rdd_42_15 not found, computing it"} {"Question": "How many kb is broadcast_24_piece0 free?", "Answer": "393.0", "RawLog": "Block broadcast_24_piece0 stored as bytes in memory (estimated size 5.6 KB, free 393.0 KB)"} {"Question": "Is partition rdd_42_4 found?", "Answer": "not", "RawLog": "Partition rdd_42_4 not found, computing it"} {"Question": "What is the ID for stage 7.0?", "Answer": "299", "RawLog": "Running task 1.0 in stage 7.0 (TID 299)"} {"Question": "What is the ID for stage 12.0?", "Answer": "494", "RawLog": "Running task 1.0 in stage 12.0 (TID 494)"} {"Question": "Is partition rdd_11_1 found?", "Answer": "not", "RawLog": "Partition rdd_11_1 not found, computing it"} {"Question": "What stage was the task 42.0 completed in?", "Answer": "24.0", "RawLog": "Finished task 42.0 in stage 24.0 (TID 1127). 2364 bytes result sent to driver"}
参照上面数据,仿写一批类似数据。
得到的 ChatGPT 生成结果如图:
对比原始数据可以发现,ChatGPT 完美的识别除了数据中哪些内容是可以被随机替换的,应该怎么替换,并且保证了在同一行内,相同的的内容,Question、Answer 和 RawLog 中保持一致。
有趣的是:ChatGPT 严格按照示例数据的样式,循环生成。我们给的 prompt 中,分别是 1 个 complate、1 个 kb、2 个 found、1 个 free、1 个 found、2 个 ID、1 个 found、1 个 complete,ChatGPT 生成 30 条也一模一样按照这个顺序循环 3 次。
所以如果要生成更多数据,或者生成均衡数据的,也可以分批分类生成。这里就不重复演示了。如果我们确实希望采用这种方式生成数以万计的训练数据,建议通过 API 方式调用 ChatGPT 服务。本书后续章节会介绍ChatGPT 的接口开通和调用方法,请参阅。
密码生成
个人密码强度非常重要,但是靠个人自己编写,总会不由自主的寻找一些有意义的、方便记忆的密码组合。市面上甚至有诸如 1passwd 之类的密码生成和管理器软件,来方便我们按需生成和保管不同网站的密码。
ChatGPT 也可以在这个时候帮我们的忙。为了加强 ChatGPT 生成的密码强度,我们把一些具体规则也通过 prompt 告知 ChatGPT,包括密码长度、数字、大小写、特殊符号的数量等等。
为那些需要安全密码的人提供密码生成器。我将为您提供包括“长度”、“大写”、“小写”、“数字”和“特殊”字符在内的输入表单。您的任务是生成一个复杂的密码使用这些输入形式,并提供给我。不要在回复中包含任何解释或其他信息,只需提供生成的密码。例如,如果输入的表单是长度= 8,大写= 1,小写= 5,数字= 2,特殊= 1,那么您的响应应该是一个密码,例如“D5%t9Bgf”。
然后尝试输入一次具体期望,看 ChatGPT 给我们的结果会是什么:
很有趣的结果产生了,我们实际数一数,ChatGPT 生成的密码,密码复杂度是:长度= 12,大写= 3,数字= 4,特殊= 3,小写= 2。看起来,ChatGPT 较差的数学水平再次暴露了!
不过,因为密码本身就需要随机性,这种"生成器"自己都测不准的结果,某种程度上来说,不符合我们在之前章节提及的错误会有严重影响的原则,倒也可以正常使用了。