
简介清华大学MixPoet项目是一套用于人工智能写诗的模型与配套代码效果达到领先水平主要面向自然语言处理方向的学习者以及从事文本生成创作的开发者完整支持在Windows 11操作系统下进行模型训练与推理解决在个人电脑上复现学术项目时常见的环境配置难题。压缩包中共有102个文件整体大小约260.43MB其中包含18个Python脚本及其编译后的pyc文件便于用户阅读源码或直接调用模型权重数据以pickle和pkl格式保存配合json、xml等配置文档以及txt文本样本可以快速还原出可运行的实验环境。此外包内还带有7张示意图与13个sample示例用来直观展示生成结果git仓库元数据则记录了项目的版本演变有助于追溯改动细节目前已有322人学习下载说明其具有一定的参考价值。通过这份资源使用者能直接获得训练好的模型、调用脚本和本机运行配置省去从零搭建和调参的时间成本同时也能为在Windows 11下部署其他类似自然语言处理项目提供迁移经验。1. Windows 11 跑 MixPoet 训练我先说结论这不是个玩具项目如果你手上正好有一台 Windows 11 的游戏本或者工作站想在本机跑通一个能写古诗的 AI 模型清华大学开源的 MixPoet 是一个非常合适的切入点。MixPoet 本质上是一个基于 Transformer 的古诗生成模型训练目标是把“题目 意象 风格”映射成五言或七言绝句。和那些只能在网页上试玩的模型不同这个项目给了你完整的训练代码和推理代码意味着你可以拿自己的古诗数据集去微调也可以用预训练权重直接生成。这篇文章就是按我在 Windows 11 下从零到一跑通这个项目的完整路径来写的包含环境配置、数据整理、训练脚本、参数调整和踩坑记录。适合两类人一是想在本机做中文 NLG 实验的研究生和工程师二是想用开源模型做古典诗词生成产品的开发者。在开始之前先说一个反直觉的结论MixPoet 的训练代码对 Windows 11 的兼容性其实一般报错最多的不是模型本身而是 Python 环境、CUDA 版本和文件编码这三件事。如果你能忍受先把环境调通后面训练和生成反而是最简单的部分。2. Windows 11 环境准备Python、CUDA 与依赖安装清单MixPoet 的训练依赖 PyTorch 生态而 PyTorch 在 Windows 上的表现和 Linux 有一定差异。这一章直接给出一套我验证过的环境组合以及每一步的命令和理由。2.1 用 Python 3.10 建一个独立的训练环境Windows 11 自带的 Python 版本可能很新也可能很老但 MixPoet 这类项目一般不会主动适配 Python 3.12 以上的版本。你大概率会遇到某个依赖库没有预编译 wheel 的问题。我建议直接锁定 Python 3.10这是目前 PyTorch 和 transformers 支持最稳的版本。打开 PowerShell管理员模式先确认当前的 Python 版本python --version如果版本不对去 Python 官网下载 3.10 安装包安装时勾选“Add Python to PATH”。然后创建一个独立的虚拟环境python -m venv mixpoet_env .\mixpoet_env\Scripts\Activate.ps1这里有几个需要注意的地方。第一在 PowerShell 里激活虚拟环境用的是Activate.ps1不是 Linux 下的source activate。第二如果你的系统开启了脚本执行策略限制会提示“禁止运行脚本”这个时候需要先执行Set-ExecutionPolicy Unrestricted -Scope CurrentUser然后才能激活环境。第三虚拟环境创建后pip、python 命令都会指向虚拟环境内部的解释器后续所有依赖都装在这个环境里不会污染系统全局的 Python。2.2 CUDA、cuDNN 与 PyTorch 的版本匹配接下来是整篇文章里最容易翻车的地方。MixPoet 的训练要用到 GPU而 Windows 11 下的 CUDA 驱动和 PyTorch 的 CUDA 版本必须严格匹配。首先要确认你的 NVIDIA 显卡驱动支持哪个 CUDA 版本在 PowerShell 里执行nvidia-smi输出右上角会显示CUDA Version: 12.x这是驱动支持的最高 CUDA 版本不是说你必须安装这个版本的 CUDA Toolkit。PyTorch 运行时自带 CUDA 运行时库只需要保证 PyTorch 的 CUDA 版本不高于驱动支持的版本即可。我的建议是安装 CUDA 11.8 对应的 PyTorch 版本稳定而且对 Windows 友好pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118装完之后验证一下 GPU 是否可用import torch print(torch.__version__) print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0))如果输出True和你的显卡型号就说明 CUDA 环境没问题。如果输出False大概率是 PyTorch 装成了 CPU 版本用上面的命令重新安装即可。注意这里不用单独安装 CUDA ToolkitPyTorch 的 wheel 包里已经包含了运行时所需的 CUDA 库这也是 Windows 下被坑了太多次之后我觉得最省心的方案。2.3 依赖安装transformers、datasets 与清华镜像加速MixPoet 的代码依赖 Hugging Face 的 transformers 和 datasets 库。在 Windows 11 下直接 pip 安装这些库通常不会有大问题但下载速度可能很慢。我一般会用清华镜像源加速这是国内开发者最常用也最可靠的方案pip install transformers datasets tensorboard -i https://pypi.tuna.tsinghua.edu.cn/simple如果你打算用 MixPoet 项目自带的 tokenizer 和预训练权重还需要确认 transformers 的版本不会太新。太新的版本有时候会改 API导致旧代码跑不起来。建议安装 4.30 左右的版本并固定版本号避免后续无意中升级导致行为变化pip install transformers4.30.2 -i https://pypi.tuna.tsinghua.edu.cn/simple安装完成之后把 MixPoet 项目代码下载到本地在 Windows 11 的 PowerShell 里用 git clone 或直接下载压缩包都可以。项目代码解压后你会看到里面有几个核心文件训练脚本、模型定义、数据处理脚本和推理脚本。注意不要直接把整个目录放在含中文或空格的路径下后面会遇到路径解析的问题放在D:\mixpoet这种纯英文路径下最稳。3. MixPoet 的模型原理与训练数据别看不懂就不准备数据MixPoet 不是那种“输入几个关键词就吐出一首诗”的黑匣子它其实是一个标准的自回归语言模型核心架构是 GPT-2 式的 Transformer Decoder。这一章先把模型的生成逻辑讲清楚再说明训练数据长什么样因为这是你能不能训练出“像样”的诗的关键。3.1 MixPoet 到底在学什么从语言模型到诗词语感MixPoet 的训练目标非常直接给定前面的字序列预测下一个字。这个目标和普通的 GPT 模型没有本质区别区别在于训练数据的格式和采样方式。古诗生成的特殊之处在于模型不仅要学到汉字之间的共现关系还要学到平仄、押韵、对仗这些隐性规律。用 GPT 式训练方式学这些规律是完全可行的因为律诗本身就是高度结构化的文本模型在大量古诗词上训练后会隐式地学到五言和七言的节奏模式。在实际的训练过程中MixPoet 的输入格式通常是这样组织的春晓 孟浩然 春眠不觉晓 处处闻啼鸟 夜来风雨声 花落知多少也就是把题目、作者和诗句拼接成一个序列用换行符分隔。模型要做的就是在这个序列上做自回归训练学会在看到“春晓”和“春眠不觉晓”之后继续生成“处处闻啼鸟”。这里有一个关键点训练时要把整首诗当作一个整体序列而不是按每句诗分开训练。这样才能让模型学会句与句之间的承接关系。MixPoet 的项目里还引入了风格或意象的信息在一些变体版本中输入序列会加上风格标签比如“风格雄浑”“意象月、酒”。这种条件化的设计让模型在生成时可以控制风格也提高了生成诗的整体一致性。如果你只想要一个基础版本没有风格标签也能训练但生成的多样性会差一些。3.2 训练数据怎么整理把“题目|作者|诗句”切成序列这个环节是新手最不重视但最容易毁掉结果的部分。MixPoet 的训练数据不是随便找几首唐诗拼在一起就能用的它需要整理成固定的格式而且字符编码必须是 UTF-8。Windows 11 的记事本默认保存编码可能是 ANSI或者带 BOM 的 UTF-8这两种都会在训练时报错或产生乱码。我建议直接用 Python 写一个清洗脚本把原始的古诗词数据集转换成训练格式。以下是一个常见的数据整理流程假设你有原始数据存在raw_poems.json每首诗的结构是“题目 作者 诗句列表”import json with open(raw_poems.json, r, encodingutf-8) as f: poems json.load(f) lines [] for poem in poems: title poem[title] author poem.get(author, 无名氏) verses poem.get(verses, []) if len(verses) 4: continue # 只保留至少四句的诗 lines.append(title) lines.append(author) lines.extend(verses) lines.append() # 每首诗之间空一行 with open(train_data.txt, w, encodingutf-8) as f: f.write(\n.join(lines))这段代码的逻辑是读取原始 JSON过滤掉太短的诗然后按“题目、作者、每句诗”的顺序拼接成文本文件。注意读文件和写文件都显式指定了encodingutf-8这在 Windows 11 上是必须的因为系统默认编码是 GBK不指定的话会用 GBK 去读 UTF-8 文件大概率会乱码。数据量上如果只是微调至少准备几千首古诗比较合适。全唐诗加上全宋词的公开数据集大概有几万首足够训练出一个能用的模型。如果数据太少比如只有几十首模型会严重过拟合生成的诗会重复训练集中的句子。3.3 tokenizer 的选择不要自己造词表用现成的中文词表MixPoet 项目通常会配合一个中文 BERT 风格的 tokenizer或者使用通用的 GPT-2 中文词表。在 Windows 11 下训练时我强烈建议直接使用 Hugging Face 上的中文预训练词表比如bert-base-chinese对应的词表而不是自己重新训练 BPE。原因很简单自己训练词表需要额外的大量数据和时间而且在古诗这种小规模数据上训出来的词表往往不稳定同一个字在不同位置会被切成不同的 token导致模型学不到稳定的字级规律。使用现成的 tokenizer 非常方便from transformers import BertTokenizer tokenizer BertTokenizer.from_pretrained(bert-base-chinese) text 春眠不觉晓处处闻啼鸟。 tokens tokenizer.tokenize(text) print(tokens)输出会是一个个字级别的 token比如[春, 眠, 不, 觉, 晓, , 处, 处, 闻, 啼, 鸟, 。]。这种字级别的切分对古诗生成特别合适因为古诗的字数本身就是核心节奏单位五言诗就是五个字七言诗就是七个字按字切分不会打乱这种节奏。一个需要特别注意的是某些中文 tokenizer 会把标点符号单独切成 token包括逗号、句号、换行符。训练时这些标点的存在很重要因为它们决定了模型什么时候该换句、什么时候该结束。如果清洗数据时把标点全部删掉模型生成的诗歌节奏感会大打折扣。4. 在 Windows 11 上跑通 MixPoet 训练最小脚本与关键参数这一章用 MixPoet 项目里最常见的训练方式直接用自己的数据集微调预训练权重。整个过程完全可以在 Windows 11 的 PowerShell 里执行。4.1 最小训练脚本用自己的数据集微调 MixPoet 预训练权重MixPoet 项目的训练逻辑和标准 Hugging Face Trainer 非常接近加载预训练模型、加载 tokenizer、读取数据集、配置 TrainingArguments、启动训练。以下是一个最小可运行的训练脚本按 MixPoet 常见的数据输出格式来写from transformers import ( GPT2Config, GPT2LMHeadModel, BertTokenizer, Trainer, TrainingArguments, DataCollatorForLanguageModeling ) from datasets import Dataset # 读取训练数据 with open(train_data.txt, r, encodingutf-8) as f: text_lines [line.strip() for line in f if line.strip()] # 把所有诗句按整体序列拼接 full_text \n.join(text_lines) # 加载 tokenizer 和模型 tokenizer BertTokenizer.from_pretrained(bert-base-chinese) model GPT2LMHeadModel.from_pretrained(uer/gpt2-chinese-poem) # 编码整个数据集 inputs tokenizer(full_text, return_tensorspt, max_length512, truncationTrue) # 构造 Hugging Face Dataset dataset Dataset.from_dict({input_ids: inputs[input_ids], attention_mask: inputs[attention_mask]}) # 定义数据整理器用于随机 mask 生成目标 data_collator DataCollatorForLanguageModeling( tokenizertokenizer, mlmFalse ) # 训练参数 training_args TrainingArguments( output_dir./mixpoet_checkpoints, overwrite_output_dirTrue, num_train_epochs10, per_device_train_batch_size2, gradient_accumulation_steps8, learning_rate5e-5, save_steps500, logging_steps100, fp16True, # Windows 11 CUDA 11.8 支持混合精度 report_tonone ) # 创建 Trainer 并开始训练 trainer Trainer( modelmodel, argstraining_args, train_datasetdataset, data_collatordata_collator ) trainer.train()这段代码的逻辑和参数值得逐一说明。首先GPT2LMHeadModel.from_pretrained(uer/gpt2-chinese-poem)是微调的基础模型这个预训练权重是在中文古诗上训过的 GPT-2 模型用它做起点比从零训练快得多。bert-base-chinese的 tokenizer 在这里做的是字级切分与上面的预训练模型通常是兼容的。其次DataCollatorForLanguageModeling设定了mlmFalse这意味着它做的是标准自回归语言建模也就是用前面的 token 预测下一个 token。max_length512限制单条样本长度如果一整个诗集文本超过 512训练时会截断。这里其实有一个潜在问题如果把全量古诗文本拼成一个超长字符串再一口气编码max_length512会把大部分内容都截断掉训练数据严重不完整。正确的做法是先把每个样本单独编码再分批处理而不是把整个文本拼成一个大字符串。上面的脚本只是演示最小训练逻辑真正训练时建议按诗句或按诗篇来构造样本每条样本长度控制在 128 以内。4.2 关键参数MaxLen、BatchSize、学习率与梯度累积训练脚本里的参数不是随便填的每个参数背后都有实际约束尤其 Windows 11 下的显存管理比 Linux 更保守。per_device_train_batch_size是最关键的显存开关。一块 8GB 显存的显卡配合max_length128的输入batch size 设为 2 已经比较稳。如果显存不够优先把 batch size 降为 1而不是直接改max_length因为古诗训练需要保留完整的上下文信息。gradient_accumulation_steps8的作用是在 batch size 很小的情况下模拟更大的有效批大小。有效批大小等于per_device_train_batch_size × gradient_accumulation_steps即 2×816。这个值越大训练越稳定但占用显存不会增加因为梯度累积只是在反向传播时把梯度累加后再更新参数。学习率方面微调场景下5e-5是一个很经典的安全值。如果你发现 loss 下降太慢可以逐步调大到1e-4但超过这个值容易出现 loss 爆炸尤其在小数据集上。num_train_epochs10是保守设置几千首诗的规模下训练 3-5 个 epoch 就能看到明显的生成效果。epoch 数越多模型越容易记住训练集中的原句生成时会出现“背诗”而不是“写诗”的现象这一点后面会在避坑章节展开。混合精度fp16True在 Windows 11 CUDA 11.8 的环境下可以正常工作。开启后训练速度提升约 30%显存占用减少约 40%。如果你的显卡是 20 系或更新的 NVIDIA 显卡强烈建议开如果是旧显卡或者 CPU 训练需要去掉这个参数。4.3 显存不够怎么办梯度检查点与混合精度Windows 11 用户在显存不够时的第一反应通常是换更大的显卡但这不是唯一的出路。MixPoet 训练中还有两个非常实用的工程手段梯度检查点和 CPU 卸载。梯度检查点gradient checkpointing的做法是只保存前向传播的部分中间激活值反向传播时重新计算从而把显存占用降下来代价是训练时间变长约 20%-30%。在 Trainer 中开启非常方便training_args TrainingArguments( ... gradient_checkpointingTrue, fp16True )如果你用的是 6GB 显存的显卡开启梯度检查点之后原本跑不动的batch_size2配置通常可以顺利跑起来。这个参数对训练效果没有任何影响只是用时间换空间。CPU 卸载CPU offload是把部分模型参数或优化器状态放到内存中进一步降低显存压力但速度会明显下降只建议在 4GB 显存以下的极端情况使用。在 Windows 11 上 CPU offload 的兼容性不如 Linux 好我尝试过几次都遇到了 I/O 阻塞的问题最终放弃了这个方案改用更小的模型。如果你只有 4GB 显存另一个可行方案是直接使用 MixPoet 项目里的轻量版配置比如把模型层数从 12 层降到 6 层或者把隐藏层维度缩小一半。一个实用的判断标准训练过程中打开任务管理器观察“GPU 显存”和“GPU 利用率”两个指标。如果显存几乎占满但利用率不到 50%说明 batch size 太大模型在等数据加载如果显存占用不高但利用率很高说明 batch size 还有提升空间。5. Windows 11 下 MixPoet 训练避坑我踩过的五个坑每条都带解决路径这一章是血泪经验。我在 Windows 11 上训练 MixPoet 的过程中前三天基本都在和环境和数据打交道真正调模型的时间反而不多。这些坑在官方文档里很难一次找全但只要你照着做能省下大量时间。5.1 中文数据乱码现象、原因与解决现象训练时 loss 正常下降但生成的诗歌全是“”或乱码字符偶尔能蹦出一两个汉字。原因Windows 11 下默认编码是 GBK 而非 UTF-8。如果训练数据是用记事本保存的 ANSI 编码Python 读取字符串后会变成乱码模型在乱码上训练自然只能生成乱码。解决在读取所有数据文件时显式指定encodingutf-8。如果文件已经变成了 GBK可以用 Python 做一个批量转码with open(train_data.txt, r, encodinggbk) as f: content f.read() with open(train_data_utf8.txt, w, encodingutf-8) as f: f.write(content)训练脚本里所有open()调用也统一加上encodingutf-8。这个习惯在 Windows 11 上必须养成否则换一台机器或换一个数据源就会翻车。5.2 CUDA out of memory现象、原因与解决现象训练刚开始几秒就报CUDA out of memory有时重启电脑后可以跑一小会儿但很快再次报错。原因显存碎片化或 batch size 设置偏大。Windows 11 的图形界面本身也会占用一部分显存尤其是开启了硬件加速 GPU 调度的机器可用显存会比 Linux 上少几百 MB。另一个常见原因是上一次训练进程没有完全退出显存被僵尸进程占用。解决先检查显存占用情况在 PowerShell 里执行nvidia-smi查看Memory-Usage列。如果有残留进程用taskkill /PID pid /F强制结束。如果显存没有残留就把per_device_train_batch_size降到 1同时开启gradient_checkpointingTrue。如果还不行把max_length从 512 降到 128降低单条样本的内存占用。5.3 Windows 路径分隔符与 shell 转义现象训练脚本在 Linux 上能跑到了 Windows 11 上报错No such file or directory而且错误信息里的路径很奇怪比如D:\mixpoet\train_data.txt被解析成包含换行符的路径。原因Windows 路径用反斜杠\而 Python 字符串里反斜杠是转义字符。\t会被解析成 Tab 键\n会被解析成换行。在项目源码里如果直接写open(D:\mixpoet\train_data.txt)实际打开的文件名完全不是你想要的。解决在代码里统一使用正斜杠/或pathlib.Path。比如from pathlib import Path data_path Path(D:/mixpoet/train_data.txt)Path会自动处理不同操作系统下的路径分隔符代码在 Windows 和 Linux 之间切换时无需修改。命令行上传参时用 PowerShell 的正斜杠方式给 Python 代码传路径也能避免转义问题。5.4 断点续训与权重保存训练到一半崩溃怎么办现象训练到第 800 步时电脑蓝屏或断电所有训练进度丢失必须从头开始。原因没有开启 checkpoint 保存或者 checkpoint 被保存在了系统临时目录重启后清空。解决训练参数里已经设置了save_steps500每 500 步会保存一次模型权重到output_dir。训练中断后用Trainer的resume_from_checkpoint参数恢复训练trainer.train(resume_from_checkpointTrue)它会自动找到output_dir里最新的 checkpoint 目录并继续训练。这算是我用得最多的后悔药强烈建议在训练脚本里就预留好这个逻辑。output_dir建议设置成绝对路径不要用相对路径因为.ipynb或某些 IDE 的工作目录切换会让人找不到权重文件。5.5 预训练权重下载失败Hugging Face 连不上的处理现象第一次运行训练脚本时卡在下载uer/gpt2-chinese-poem的权重文件一直重试或报超时。原因Hugging Face 的模型仓库在部分地区连接不稳定Windows 11 下没有像 Linux 那样可以轻易改代理配置。解决把模型权重先通过浏览器或者下载工具下载到本地再用from_pretrained加载本地路径huggingface-cli download uer/gpt2-chinese-poem --local-dir D:/mixpoet/model/gpt2-chinese-poem如果这个命令不可用也可以直接在 Hugging Face 网站上手动下载pytorch_model.bin和config.json放到本地目录后加载model GPT2LMHeadModel.from_pretrained(D:/mixpoet/model/gpt2-chinese-poem)tokenizer 同理bert-base-chinese的vocab.txt也可以手动下载后从本地加载。这个坑纯属网络问题和模型本身没有关系但确实卡住了很多人。6. 用训练好的 MixPoet 模型写诗推理脚本与生成参数调整训练完模型之后最后一步是把它跑成一个能生成诗歌的推理服务。这章给出直接可用的推理代码和参数调节经验。6.1 最小推理脚本加载 checkpoint 并生成一首绝句MixPoet 推理时的输入是一个起始文本可以是一个题目也可以是一句诗的开头。模型会基于这个开头续写后面的内容。以下是一个最小推理脚本from transformers import ( GPT2LMHeadModel, BertTokenizer ) # 加载本地权重 model_path D:/mixpoet/checkpoints/checkpoint-500 tokenizer BertTokenizer.from_pretrained(bert-base-chinese) model GPT2LMHeadModel.from_pretrained(model_path).to(cuda) model.eval() # 输入起始文本 prompt 咏梅 # 编码并生成 input_ids tokenizer(prompt, return_tensorspt).input_ids.to(cuda) output_ids model.generate( input_ids, max_new_tokens64, do_sampleTrue, temperature0.85, top_p0.9, no_repeat_ngram_size2, repetition_penalty1.2, pad_token_idtokenizer.pad_token_id, bos_token_idtokenizer.cls_token_id, eos_token_idtokenizer.sep_token_id ) generated_text tokenizer.decode(output_ids[0], skip_special_tokensTrue) print(generated_text)整个脚本的生成逻辑是prompt决定了生成诗的题目模型在给定题目条件下续写后续内容。max_new_tokens64是输出的最大长度七言绝句 4 句共 28 个字加上标点和换行64 足够。如果设置为 128模型可能会继续写第二首诗质量通常会下降。do_sampleTrue表示使用随机采样而不是贪心搜索避免输出完全重复的训练语料。6.2 抽样参数temperature、top_p 与 no_repeat_ngram生成诗歌时最值得调的是三个参数它们直接决定了诗歌的多样性和流畅度。temperature控制概率分布的平滑程度。值越低生成结果越保守0.7 左右生成的诗歌比较规整但有时候会流于平庸0.9-1.0 生成的诗歌更有新意但可能出现语义跳跃或不连贯。古诗生成我一般从 0.85 开始调先从 0.7 到 1.0 跑几组对比选最符合期望的结果。top_p是核采样参数模型只从累计概率达到 p 的最小 token 集合中采样。top_p0.9意味着每一步生成时只考虑概率最高的 90% 的候选字过滤掉那些概率极低的生僻字。古诗场景下 0.9 是个安全值如果调低到 0.8字的选择范围变小生成的诗更稳定但更容易流于俗套。no_repeat_ngram_size2禁止模型在任意连续 2 个字内重复出现相同的 n-gram这能有效避免“春花春花春花”这类循环输出。配合repetition_penalty1.2可以对重复的 token 做额外惩罚。这两个参数是生成古诗时最重要的防呆设计不加的话模型在生成长序列时很容易陷入重复循环。6.3 效果验证如何判断模型真的“学会”了古诗跑通推理之后需要用一套标准来验证模型效果。我通常分三步来判断。第一步是看押韵和平仄生成的诗即使语义上有跳跃但韵脚如果全部不对说明训练还不够第二步是看主题相关度比如输入“咏梅”模型应该输出梅花相关的意象如“雪”“寒”“香”如果生成一堆“江”“舟”“渔翁”就说明条件控制没有学好第三步是看多样性和记忆度同一输入跑五次如果五次输出几乎一模一样说明模型过拟合需要增加训练数据或减少 epoch 数。除了人工判断还可以计算困惑度perplexity作为参考指标。困惑度是语言模型对文本的负对数似然的指数值越低说明模型对文本的拟合程度越好。微调后的模型在验证集上的困惑度一般会低于 20如果高于 50基本说明训练没有收敛或数据有问题。这里的实操建议是每一轮训练结束后立刻用同一个 prompt 生成 10 组输出并保存。对比不同 epoch 的输出你能直观感受到模型从“乱码”到“通顺”到“套路化”的变化过程。我自己的经验是epoch 数超过 5 之后模型生成的诗歌会变得非常像训练集中的原句这时就该停止训练并回退到上一个 checkpoint。这也是为什么训练时一定要开save_steps因为回退到好的 checkpoint 比重新训练快得多。最后一个习惯训练和推理的脚本分开存放推理脚本固定一个版本不要反复修改。我在 Windows 11 上就吃过亏改了推理脚本里的max_new_tokens导致后面所有生成结果的对比都不是在相同条件下进行的浪费了不少时间。参数调整要记录在案每改一次参数就生成一组样本并标注参数值这样你才知道哪一组输出对应哪一组参数。希望这套流程能帮你在 Windows 11 上顺利跑通 MixPoet 的训练与生成。本文还有配套的精品资源点击获取