
简介自动写诗.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-ZipWindows 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是词表每一行一个 tokenpytorch_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, encodingutf-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_dtypetorch.float16, low_cpu_mem_usageTrue ) model.eval() # 3) 构造生成 prompt注意带上诗型和主题 prompt 五言绝句秋日山居 inputs tok(prompt, return_tensorspt) # 4) 采样生成核心参数全在这 with torch.no_grad(): out model.generate( **inputs, max_new_tokens64, do_sampleTrue, temperature0.9, top_p0.92, repetition_penalty1.2, ) print(tok.decode(out[0], skip_special_tokensTrue))这段代码的逻辑并不复杂前三步都是在还原模型运行条件第四步才是真正的生成。torch_dtypetorch.float16把权重切成半精度显存占用直接减半如果你用的是 6GB 以下显存的显卡可以保留这一行。low_cpu_mem_usageTrue是给 CPU 内存紧张的人准备的它让模型在加载时不要一次性把全部权重复制进内存。model.eval()必须调用它会关闭 dropout 等训练时期的行为保证输出稳定。生成参数里最容易翻车的是do_sample。如果你不写它Transformers 默认走贪心解码也就是每一步都选概率最高的字结果就是每次生成的诗几乎一模一样而且句子死板。do_sampleTrue打开采样诗才有多样性。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_p0.9已经能过滤掉绝大多数病句。它给你的安全感来自它的可解释性——每一步至少有 9% 的总概率被保留下来不会因为某个字概率分布太散而完全失控。max_new_tokens管的是“篇幅预算”。五言绝句 20 个字七言绝句 28 个字算上 prompt 和标点max_new_tokens64其实是一条安全线。它不能设太小因为模型可能会在中间碰见一个换行符就提前结束设太大会让模型在 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。解决先在命令行设置环境变量PYTHONUTF81再运行脚本。还不行就把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 有几百 token7GB 显存的卡很容易在生成阶段打满。解决三步走。第一步把torch_dtypetorch.float16打开显存减半第二步把max_new_tokens从 64 减到 28只够一首绝句第三步如果还崩把模型转到 CPU 推理代价是生成时间从几秒变成几十秒。CPU 推理示例model AutoModelForCausalLM.from_pretrained( poem/, torch_dtypetorch.float32, low_cpu_mem_usageTrue ) inputs {k: v.cpu() for k, v in inputs.items()}注意 CPU 推理不要用 float16老 CPU 不擅长半精度计算速度反而更慢。如果 CPU 都跑不动那就不是调参问题而是这个 rar 里的模型本身就不是为本地推理设计的考虑换更小的权重版本。5.4 每次生成结果一模一样不是见鬼是采样没开现象连续跑三次gen.py输出完全相同的四句诗一个字都不差。原因绝大多数撞车的根因是代码里没有do_sampleTrue或者设置了固定的随机种子。Transformers 默认的generate接口如果你的输出长度没到 max_new_tokens它默认执行贪心解码。而贪心解码在相同输入下是确定性的权重没变结果固定。解决检查generate调用里有没有do_sampleTrue。如果有再看代码开头有没有torch.manual_seed(42)之类固定种子的行把它改成torch.manual_seed(int(time.time()))或者干脆删掉。还有一个隐蔽情况top_p1.0、temperature1.0、但没有do_sampleTrue这时也会触发贪心。想要稳定复现某一首诗用于测试就固定种子想要每次都新鲜就移除固定种子。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], styleStyle.FINALS)[0] # 示例绝句或律诗的偶句必须押韵第2、4句 lines output.strip().split(\n) rhyme_ok last_vowel(lines[1]) last_vowel(lines[3])这是我见过的最实用的轻量校验。它不会检查平仄但能拦住那些末字完全离谱的句子。想要再进一步可以对照平水韵的韵部表把相同韵部的字放进一个集合判断末字是否属于同一韵部。注意这种基于拼音的校验依赖标准普通话发音古入声字会失准但对绝大多数现代读者来说已经够用。质量验收方面我有过一段踩坑记忆一开始我拿模板库生成的诗给朋友看大家说“还不错”我也就以为这个方向成了。直到我把这些诗和《唐诗三百首》随机混在一起做盲测让三个人挑出“明显是机器写的”结果命中率高达八成。那一刻我才意识到人的耳朵对机器诗有一种强烈的违和感——不是词语不对是意象之间没有逻辑关联。这促使我加了押韵校验又把训练语料里高频但无意义的虚词过滤掉再跑盲测命中率才降到五成以下。所以我的收尾建议是不要盯着单首诗的视觉效果而是拿 30 首生成结果做一次人工盲测。把机器诗和真实古诗混排让朋友标出他们认为机器写的句子最后数一数正确率。正确率高于 70%说明你的采样参数和韵律校验还需要调低于 50%说明这套方案已经能骗过普通人了。这比你自己逐字读一百遍都有效。至于这套方案值不值得投入我的判断是作为学习文本生成流程的样例它足够完整值得跑通作为正式产品功能还缺一个基于韵部和平仄的后处理模块这不是难事但需要额外花时间。你也别信压缩包 README 里的 demo 截图那可能是作者跑了五十次才挑出来的一首。我现在的习惯是解压后先看权重文件大小和词表来源再跑二十次生成用押韵校验和盲测双重过滤剩下的才是能用的诗。希望帮到你。本文还有配套的精品资源点击获取