简介:自动写诗.rar 是一份面向 AI 与自然语言处理学习者的完整教学资源,适合高校学生、研究人员及对机器作诗感兴趣的开发者。资源聚焦自动写诗任务,提供从诗歌语料准备、数据清洗与格式化、模型训练到效果评估的闭环实验流程,并配有《实验三 自动写诗实验指导书》《自动写诗_实验报告》及展示 PPT,便于按步骤复现。
压缩包共 18 个文件,约 23.83MB,主要包含 Python 源码(train.py、model.py、utils.py 及 MyLog.py)、编译后的 pyc 文件、诗歌数据集 tang.npz 与 data.txt、日志文件 log.log,以及 doc/ppt 文档。代码与文档互为对照,清晰展示 RNN、LSTM、Transformer 等深度学习模型在古诗生成中的应用,以及超参数调整、BLEU 与 ROUGE 指标评估、人工对比评价等关键环节。
目前已有 169 人学习下载。这份资源不仅给出可直接运行的实验代码,还附有运作日志与模型生成实例,帮助读者快速掌握 NLP 诗歌生成的完整技术路线,可复用为课程设计、毕业设计或论文实验的基础框架。
1. 自动写诗.rar 是什么:一个解压即可见的“古风诗生成”工程
你大概率是在某个资源站、QQ 群文件或者网盘转存链接里看到“自动写诗.rar”这个名字的。它听起来像一个打包好的小玩具,但解压之后你会发现里面往往不是单个脚本,而是一个完整的文本生成工程:模型权重、配置文件、词表文件、README,偶尔还夹带几个训练用古诗文本集。这个包解决的事情很明确——让你不用从零训练,就能在本地机器上生成五言、七言绝句,甚至藏头诗。
适合拿到它的人有两类:一是想给作品集、演示、短视频文案加一点“古风生成”能力的开发者,二是刚接触 NLP 文本生成、想看看一个开箱模型到底怎么跑起来的学习者。反直觉的一点是:真正卡住你的往往不是模型本身,而是解压环节的伪加密、解压软件的弹窗广告,以及生成之后完全没有韵律校验导致的“驴唇不对马嘴”。这篇笔记就顺着这个顺序,把从 rar 到能用的诗,全程拆开。
2. 解压前先过三关:rar 伪加密、校验和与解压软件广告
2.1 rar 伪加密的原理:为什么它提示输密码,却不给你密码
拿到“自动写诗.rar”第一件事不是双击,而是先在资源管理器里看清楚扩展名。网上流传的这类压缩包,很大比例踩过一个阴招:伪加密。所谓 rar 伪加密,是指文件头里的加密标志位被改成“已加密”状态,但文件数据本身根本没有做 AES 加密。解压软件看到标志位就弹出密码框,而你翻遍下载页面也找不到密码——其实压根没有。
判断伪加密有个常见土办法:用 7-Zip 打开这个 rar,如果左侧能看到完整的文件列表、文件名没有变成星号掩码,而点“提取”时却要求输密码,那大概率就是伪加密。WinRAR 里看“信息”页也会显示“加密”字样,但文件名列表可见,这两者同时出现时,伪加密的可能性极高。真正的加密会把文件名也隐藏掉,因为加密头信息会覆盖整个目录结构;伪加密只改了一个字节。
修复伪加密不需要破解任何密码,它属于文件头损坏修复。常见做法是用十六进制编辑器(比如 HxD)打开 rar,找到文件头区块里标记加密的 Flag 字段,把它从 0x08 相关的值改回 0x00。不同版本的 rar 格式偏移位置不一样,rar4 和 rar5 的头结构差异很大,建议直接用工具而不是手算偏移。我常用的流程是:先把 rar 复制一份备份,再用 HxD 打开,搜索文件头标志序列,对照一个同版本、未加密的 rar 文件逐字节比对,找到差异位改掉,保存后用 7-Zip 重新打开验证。这套操作适用于你自己的压缩包误开了伪加密,或者下载到内容损坏的包时用来抢救。
2.2 用命令行安全解压:不要双击,先测完整性
双击 rar 弹广告是小事,解压到一半报“文件头损坏”才是真麻烦。我习惯拿到任何 rar 都先用命令行做完整性测试,再解压。Windows 上如果你装了 7-Zip,直接用系统自带的7z或者完整路径下的7z.exe:
# 测试压缩包完整性,不实际解压 7z t 自动写诗.rar # 测试通过后,解压到当前目录下的 poem 文件夹 7z x 自动写诗.rar -opoem -y7z t的作用是遍历压缩包内的每个文件,重新计算校验和并与压缩包内记录的 CRC 值比对。只要输出里没有CRC Failed、Cannot open这类关键字,就说明文件数据完整,可以放心解压。7z x会把完整目录结构还原出来,-opoem指定输出目录,-y跳过所有交互确认。这里有个细节:如果你是在 PowerShell 里执行,可能需要写成.\7z.exe或者先7z确认命令可用;如果根本没装 7-Zip,Windows 11 系统自带的资源管理器右键菜单里也有“解压到”选项,但它不会告诉你完整性校验结果,所以我不太推荐用它处理这种来路不明的包。
解压完成后别急着跑代码。先看输出目录里有没有 README、config.json、权重文件,确认这个包到底是 PyTorch 系的还是 ONNX 系的。用dir或ls看一眼文件大小,如果权重文件只有几 KB,那多半是假包或者需要额外下载模型的引导脚本;正常情况下,一个能离线生成的文本模型至少要有几 MB 到几百 MB 的权重文件。
2.3 解压软件弹广告的坑:为什么你搜“rar 密码移除”会越陷越深
网上很多“自动写诗.rar”的下载说明里会附带一句“解压密码在压缩包注释里”或者“需要密码,请下载 rar 密码移除工具”。这句话本身就是钓鱼。我见过不少朋友为了找密码去搜“rar password cracker”,结果下载到一个捆绑了弹窗广告、主页劫持的“破解版 WinRAR”。这类修改版压缩软件会把广告注入到每一次解压操作里,甚至在你解压的同时静默安装推广程序,也就是网上常说的“rar 广告”和“rar 烈火”问题。
所谓的“烈火版”是民间对 WinRAR 汉化修改版的称呼。它不是官方原版,压缩和解压行为会和原版有细微差异,某些版本还会篡改 rar 文件关联、强制弹出浏览器。我的建议很简单:不要用任何标着“破解版”“汉化版”的压缩工具处理这类包。用 7-Zip 官方开源版就够了,它能解压 rar,能看伪加密,还没有广告。至于密码移除工具,绝大多数是骗局——真正的 rar 加密(尤其是 rar5 的 AES-256)在没有密码时是没办法“移除”的,所谓移除工具只是在伪造加密标志位的包上做文章。你下载的“自动写诗.rar”如果真是伪加密,用前面说的头标志位修复就能打开,不需要任何第三方破解工具。
3. 自动写诗的两种路线:模板库与序列生成怎么选
3.1 模板库方案:规则骨架里的稳定输出
所谓模板库方案,就是预先把五言绝句的格律骨架写进代码里,再准备一批意象词库(花、月、山、水、风、雪),程序运行时会按平仄格律把词填进指定的槽位。这种方案本质上是规则的排列组合,不是真正意义上的“生成”。
它的优点极其明显:输出永远押韵,永远符合字数和句式要求,运行速度可以忽略不计,CPU 上跑几百毫秒出一首。缺点是耐读性差。因为词库有限,组合来组合去,很容易出现“花间一壶酒,月下独酌人”这种看似通顺但意象重复的句子。你把它拿去给不懂格律的用户看,第一眼会觉得不错;但连看十首,就会感觉所有诗都在写同一个月亮。
如果你的目的是快速做出一个“能产出合格近体诗”的演示,模板库是性价比最高的选择。很多号称“自动写诗”的小程序和网页端 demo 用的就是这条路。它不需要 GPU,不需要安装 PyTorch,甚至不需要懂嵌入和注意力机制。
3.2 序列生成方案:从语料里学出来的“语言感”
第二种路线是序列生成,也就是用大量古诗文本训练一个语言模型。rar 包里如果带了几百 MB 的权重文件、一个vocab.txt和一个config.json,那基本就是这类方案。它的核心逻辑是:模型在海量唐诗、宋词文本上学习字与字之间的概率关系,给定一个开头(prompt),模型逐步预测下一个最可能的字,从而拼出整句诗。
序列生成的产物比模板库自然得多,能写出模板里从未出现过的搭配,有时候甚至会给你“偷来”的惊艳句子。但它的代价也很实在:如果不做后处理,模型输出的句子很容易出现不押韵、平仄不对、甚至七个字里混进五个虚词的情况。这和你看到的训练数据质量、模型参数规模、采样参数都有关系。一个常见的误判是:以为权重文件大,生成质量就一定高。实际上自动写诗这类模型,参数量再大,如果不控制解码策略,照样会把“床前明月光”后续接成“洒在床单上”这种口语化的东西。
3.3 选型对比:拿到底包后先看这三列
| 对比维度 | 模板库方案 | 序列生成方案 |
|---|---|---|
| 输出押韵率 | 几乎 100% | 依赖后处理,裸输出 60%-80% |
| 句式控制 | 严格五言/七言 | 需要 prompt 和参数约束 |
| 硬件要求 | 任意电脑 | 建议 8GB 显存,纯 CPU 可跑但慢 |
| 训练成本 | 无 | 需要语料和显卡,或依赖预训练权重 |
| 新鲜感 | 低,词库重复率高 | 高,能生成未见于模板的组合 |
| 调参重点 | 扩充词库与格律规则 | temperature、top_p、韵律校验 |
拿到“自动写诗.rar”后怎么快速判断是哪种?我的做法是直接看解压目录:有没有.bin、.safetensors、pytorch_model.bin这类权重文件。如果有,就是序列生成;如果只有一个poem.py加几个.txt词库文件,那就是模板库。README 里如果出现“基于 GPT”“基于 LSTM”“训练语料”这些词,也指向序列生成。这个判断决定了你后面所有的操作路径:模板库你只需要改词库和格律;序列生成你必须面对模型加载、采样参数和韵律后处理这三座大山。
4. 跑通最小生成脚本:从 .rar 里的模型目录到第一首五言诗
4.1 解压目录长什么样:先认文件,再想怎么跑
假设你已经成功解压,目录结构大概是这样的:
poem/ ├── README.md ├── config.json ├── vocab.txt ├── pytorch_model.bin (或 model.safetensors) ├── gen.py └── data/ └── poem_data.txtconfig.json记录模型的层数、隐层维度、注意力头数等结构参数;vocab.txt是词表,每一行一个 token;pytorch_model.bin是权重文件。gen.py可能是原作者写好的生成脚本,但我见过太多包里自带的gen.py是残的——要么路径写死,要么依赖一个没打包进去的第三方库。所以我一般不建议直接运行它,而是自己写一个最小脚本,确定模型能出诗,再回头研究原作者的高级封装。
4.2 最小生成脚本:加载权重、造 prompt、采样出诗
下面的脚本是我自己常用的骨架,基于 Hugging Face Transformers,适用于绝大多数以 GPT 结构做古诗生成的预训练包。如果你的模型是 LSTM 系或者自定义结构,加载部分要换成对应写法,但采样参数和后处理思路通用。
# gen_poem.py import json import torch from transformers import AutoTokenizer, AutoModelForCausalLM # 1) 读配置,确认模型结构和词表 config_path = "poem/config.json" with open(config_path, encoding="utf-8") as f: cfg = json.load(f) print("模型结构:", cfg.get("model_type"), "层数:", cfg.get("num_hidden_layers")) # 2) 加载分词器和权重,低精度模式省显存 tok = AutoTokenizer.from_pretrained("poem/") model = AutoModelForCausalLM.from_pretrained( "poem/", torch_dtype=torch.float16, low_cpu_mem_usage=True ) model.eval() # 3) 构造生成 prompt,注意带上诗型和主题 prompt = "五言绝句,秋日山居:" inputs = tok(prompt, return_tensors="pt") # 4) 采样生成,核心参数全在这 with torch.no_grad(): out = model.generate( **inputs, max_new_tokens=64, do_sample=True, temperature=0.9, top_p=0.92, repetition_penalty=1.2, ) print(tok.decode(out[0], skip_special_tokens=True))这段代码的逻辑并不复杂:前三步都是在还原模型运行条件,第四步才是真正的生成。torch_dtype=torch.float16把权重切成半精度,显存占用直接减半;如果你用的是 6GB 以下显存的显卡,可以保留这一行。low_cpu_mem_usage=True是给 CPU 内存紧张的人准备的,它让模型在加载时不要一次性把全部权重复制进内存。model.eval()必须调用,它会关闭 dropout 等训练时期的行为,保证输出稳定。
生成参数里最容易翻车的是do_sample。如果你不写它,Transformers 默认走贪心解码,也就是每一步都选概率最高的字,结果就是每次生成的诗几乎一模一样,而且句子死板。do_sample=True打开采样,诗才有多样性。temperature控制概率分布的锐利程度,0.7 偏保守,1.0 偏放飞。古诗生成我建议 0.85 到 0.95 之间,太高会把句子拆得不成形。top_p每一步只在累计概率达到 0.92 的最小 token 集合里采样,相当于砍掉那些概率极低的奇怪字。repetition_penalty是复读惩罚,1.2 是比较实用的起点,模型一旦开始重复上一个字,这个惩罚会压低重复概率。
4.3 三个必调参数:看着玄学,其实有迹可循
很多人在这一步觉得调参是玄学。实际上,三个参数各有各的脾气。
temperature管的是“胆量”。调低,模型只会挑那些在古诗语料里高频出现的字,结果是“山、水、花、月”扎堆;调高,低频字会被放大,偶尔有惊艳,但更多时候是句子崩坏。我的经验是:第一次跑先用默认的 0.9 出一批,如果整首读下来像绕口令,再把数值往 0.8 降。
top_p管的是“候选范围”。它和 temperature 看起来都在裁剪概率分布,但侧重点不同:constraints 合理时,top_p=0.9已经能过滤掉绝大多数病句。它给你的安全感来自它的可解释性——每一步至少有 9% 的总概率被保留下来,不会因为某个字概率分布太散而完全失控。
max_new_tokens管的是“篇幅预算”。五言绝句 20 个字,七言绝句 28 个字,算上 prompt 和标点,max_new_tokens=64其实是一条安全线。它不能设太小,因为模型可能会在中间碰见一个换行符就提前结束;设太大会让模型在 20 个字之后继续“写”,写出一堆脱离诗体的废话。我建议跑通之后再按实际输出句长收紧到 40 左右,省显存也省时间。
5. 自动写诗常见问题排查:解压损坏到模型黑匣子的 5 个坑
5.1 解压报错“文件已损坏或密码错误”:先怀疑伪加密,别急着找密码
现象:双击 rar 弹出密码框,输入网上随便搜的“解压密码”后提示密码错误;用 7-Zip 打开却能看到完整文件名列表。
原因:文件头加密标志位被改动,数据本身并没有真正加密。常见于资源站为了防盗转故意伪造加密标志,或者原包在制作时误勾了加密选项但没设密码。
解决:用 7-Zip 的“测试”功能先试一次,确认压缩包主体没有 CRC 错误。然后用 HxD 打开,按 2.1 节的办法定位头部标志位,把加密标志清掉再保存试解压。如果改完标志位后解压正常,说明是伪加密,直接打开;如果报 CRC 错误,那就是文件数据真的损坏,只能重新下载。注意,这种操作只适用于你确定这个包本应公开解压的场景,不要拿它去对付别人的私密压缩包。
5.2 生成出来的诗全是乱码或半繁体半简体:编码问题
现象:解压后 README 里的中文是正常的,但脚本生成的诗里出现“�”或者繁体简体混搭,甚至整段输出都变成乱码。
原因:Windows 下很多老式古诗语料和词表是 GBK 编码,而 Python 默认按 UTF-8 读取,一旦词表解析错乱,模型输出的 token 映射也会跟着乱。另一个原因是模型训练时语料确实混用了繁简体,词表里同一个字有两个 id。
解决:先在命令行设置环境变量PYTHONUTF8=1,再运行脚本。还不行就把vocab.txt打开看前几行,如果肉眼可见中文乱码,用文本编辑器把词表转存为 UTF-8。模型权重是基于原词表训练的,你不能改词表内容,但可以改词表文件的编码格式和模型加载时指定的编码。最简单的一步是先跑一段代码看看词表能不能正常显示,用tokenizer.convert_ids_to_tokens([0, 1, 2])打印前几个 token,如果乱码,问题在词表;如果正常,问题在生成后的显示终端。
5.3 显存不够直接崩溃:别急着加显卡,先砍 token 长度
现象:脚本跑到from_pretrained时报CUDA out of memory,或者生成时 kill 掉 Python 进程。
原因:古风模型常用 GPT 结构,它的显存消耗和输入序列长度线性相关。如果你的 prompt 加上 max_new_tokens 有几百 token,7GB 显存的卡很容易在生成阶段打满。
解决:三步走。第一步把torch_dtype=torch.float16打开,显存减半;第二步把max_new_tokens从 64 减到 28,只够一首绝句;第三步如果还崩,把模型转到 CPU 推理,代价是生成时间从几秒变成几十秒。CPU 推理示例:
model = AutoModelForCausalLM.from_pretrained( "poem/", torch_dtype=torch.float32, low_cpu_mem_usage=True ) inputs = {k: v.cpu() for k, v in inputs.items()}注意 CPU 推理不要用 float16,老 CPU 不擅长半精度计算,速度反而更慢。如果 CPU 都跑不动,那就不是调参问题,而是这个 rar 里的模型本身就不是为本地推理设计的,考虑换更小的权重版本。
5.4 每次生成结果一模一样:不是见鬼,是采样没开
现象:连续跑三次gen.py,输出完全相同的四句诗,一个字都不差。
原因:绝大多数撞车的根因是代码里没有do_sample=True,或者设置了固定的随机种子。Transformers 默认的generate接口,如果你的输出长度没到 max_new_tokens,它默认执行贪心解码。而贪心解码在相同输入下是确定性的,权重没变,结果固定。
解决:检查generate调用里有没有do_sample=True。如果有,再看代码开头有没有torch.manual_seed(42)之类固定种子的行,把它改成torch.manual_seed(int(time.time())),或者干脆删掉。还有一个隐蔽情况:top_p=1.0、temperature=1.0、但没有do_sample=True,这时也会触发贪心。想要稳定复现某一首诗用于测试,就固定种子;想要每次都新鲜,就移除固定种子。
5.5 模型加载成功但输出像“碎碎念”:词汇量太大,缺少古诗约束
现象:生成的句子字数对,但读起来像现代白话,“这本是一个”“不是”“可以”这类词密集出现。
原因:模型没有做韵律约束,也没有针对“诗体”做特殊训练。大语言模型本质上是学习概率分布,不是背诵格律规则。如果你拿到的这个 rar 包是通用文本模型而不是专门古诗模型,输出白话是必然的。
解决:换一个更专门的古诗模型权重,或者在后处理里加押韵校验。押韵校验的做法见第 6 章,它能过滤掉最后字不在韵部的句子,虽然不能修复平仄,但至少能保证读起来不那么像散文。另一个节省成本的办法是给 prompt 加上“模仿杜甫”“仿《静夜思》风格”这类强约束,让模型输出更贴近古诗的行文习惯。
6. 让机器写诗像“诗”:押韵校验与人工盲测的收尾技巧
机器能吐句子,不等于能写诗。“自动写诗”做完了生成环节,只完成了一半工程;另一半是质量闸门。我最常做的是加一个押韵校验函数,在生成后再跑一遍,不押韵就直接重生成。用pypinyin取最后一个字的韵母:
# check_rhyme.py from pypinyin import lazy_pinyin, Style def last_vowel(line): """取一行末尾字的韵母,用于绝句押韵校验""" return lazy_pinyin(line[-1], style=Style.FINALS)[0] # 示例:绝句或律诗的偶句必须押韵(第2、4句) lines = output.strip().split("\n") rhyme_ok = last_vowel(lines[1]) == last_vowel(lines[3])这是我见过的最实用的轻量校验。它不会检查平仄,但能拦住那些末字完全离谱的句子。想要再进一步,可以对照平水韵的韵部表,把相同韵部的字放进一个集合,判断末字是否属于同一韵部。注意,这种基于拼音的校验依赖标准普通话发音,古入声字会失准,但对绝大多数现代读者来说已经够用。
质量验收方面,我有过一段踩坑记忆:一开始我拿模板库生成的诗给朋友看,大家说“还不错”,我也就以为这个方向成了。直到我把这些诗和《唐诗三百首》随机混在一起做盲测,让三个人挑出“明显是机器写的”,结果命中率高达八成。那一刻我才意识到,人的耳朵对机器诗有一种强烈的违和感——不是词语不对,是意象之间没有逻辑关联。这促使我加了押韵校验,又把训练语料里高频但无意义的虚词过滤掉,再跑盲测,命中率才降到五成以下。
所以我的收尾建议是:不要盯着单首诗的视觉效果,而是拿 30 首生成结果做一次人工盲测。把机器诗和真实古诗混排,让朋友标出他们认为机器写的句子,最后数一数正确率。正确率高于 70%,说明你的采样参数和韵律校验还需要调;低于 50%,说明这套方案已经能骗过普通人了。这比你自己逐字读一百遍都有效。
至于这套方案值不值得投入,我的判断是:作为学习文本生成流程的样例,它足够完整,值得跑通;作为正式产品功能,还缺一个基于韵部和平仄的后处理模块,这不是难事,但需要额外花时间。你也别信压缩包 README 里的 demo 截图,那可能是作者跑了五十次才挑出来的一首。我现在的习惯是:解压后先看权重文件大小和词表来源,再跑二十次生成,用押韵校验和盲测双重过滤,剩下的才是能用的诗。希望帮到你。
本文还有配套的精品资源,点击获取