LlamaFactory 微调实测|Qwen3-4B现代诗风格微调

0 阅读8分钟

图片随着大模型应用场景不断扩展,如何让通用模型适应更具体的任务需求,已经成为一个很有代表性的问题。其中,特定写作风格的学习就是一个很直观的方向:一个原本通用的大模型,是否能够通过训练,逐步学会某一种明确的表达方式?

围绕这个问题,本文以“现代诗生成”为例,开展了一次完整的微调实验。实验基于 Qwen3-4B-Base 和 LLaMA Factory 搭建,从数据集准备、格式转换、模型训练,到对话验证和量化评估,完整记录模型学习现代诗风格的过程。

相比普通文本生成任务,现代诗更强调语言的节奏感、意象之间的组织方式,以及整体表达中的留白与氛围,因此也更适合用来观察模型在风格层面的变化。通过这次实验,可以更直观地看到:当训练数据与目标风格足够贴合时,模型的输出方式确实会发生比较明显的改变。

微调后效果一览

项目链接:www.lab4ai.cn/project/det…

微调前效果:模型输出自带比较明显的古韵感。用词偏典雅,句式相对工整,整体更接近传统诗词或古风表达。 Image

微调后效果:模型输出明显向现代自由诗靠拢。 短句分行更自然,意象组织更松弛,语言节奏和留白感也更符合现代诗的表达方式。

Image

从对比结果可以看出,经过有针对性的数据训练后,模型在生成风格上已经发生了比较明显的变化。模型不只是“写出一首诗”,而是在表达方式上更接近本次任务所希望学习的现代诗风格。

项目实战

Step 1 数据介绍及处理

本次实验使用中文现代诗数据集(链接:huggingface.co/datasets/Ie… 万条样本。该数据集将现代诗写作整理为“给定意象,生成诗歌”的训练形式,较适合用于现代诗风格微调。

原始数据:

{"uuid": "6b57705f-4fa7-5fc5-9b95-104732d01b0c", "prompt": "使用下列意象写一首现代诗:智慧,刀刃", "response": "标题:一个过程的小细节\n\n请把这把尖刀放回盒子里\n已经生锈了,它追随你的欲望\n它是一件记念的物品\n而你就是它尚未剖腹而生的婴儿\n\n已经习以为常,一群悒郁的病毒\n你擦干的刀刃,另一面切伤了手指\n在你的血流滴滴的那会儿\n你如此镇静地包扎有点职业化\n\n请把你的镜子彻底裸体地照出自己\n用白皙地肤色平息性感的挑逗\n你熟练地削一片柠檬地时候\n却解说了这是必要的生活\n\n让我摸一摸你的刀,可是你\n收起来了,而一个身体的智慧\n是将我构成了你无所畏忌的呢称\n你贸然的偷袭,这就堵住了我呼吸"}

{"uuid": "e3e1c802-127c-574f-aab6-aab1a126fc1a", "prompt": "使用下列意象写一首现代诗:石头,森林", "response": "标题:从望江到安庆——给沈天鸿\n\n临近砍伐者的森林与河流\n我少年时背着石头和刀斧\n去远方,这是你十年前告诫我说的话\n相邻于宿松的望江,越过长江的栅栏\n一个诗人重复写下西围墙的地址\n你的鱼网残余的诗章无须编织\n多少漏网的鱼仍是自由的词,也无人捕获\n远离喧嚣的你沉默地引导着\n清洁的编辑生涯像是言辞片断\n我从中逃脱并走远,已经完全长大成人"}

由于 LLaMA Factory 对自定义训练数据的组织形式有明确规范,常用支持格式主要包括 Alpaca 和 ShareGPT,而原始语料通常不能直接用于微调。因此,在正式训练前,需要先在 Jupyter 环境中完成数据清洗、字段整理与格式转换,将数据统一处理为框架可识别的标准样本。

结合本实验的任务形式,最终将数据整理为 Alpaca 格式的单轮训练样本,并进一步划分训练集、验证集,同时生成对应配置文件,供后续微调直接使用。

Image转存失败,建议直接上传图片文件

处理完成后,生成了 3 个文件:训练集文件 poetry_sft_train.jsonl、验证集文件 poetry_sft_val.jsonl,以及用于 LLaMA Factory 数据集注册与字段映射的配置文件 dataset_info.json。

处理好后的数据结构如下(部分):

[
{
"instruction":"使用下列意象写一首现代诗:城市,红灯,人群,绿灯",
"input":"",
"output":"标题:城市的大街 红灯亮时 那边人群通过 绿灯亮时 这边人群通过 红灯亮时 你看我站在灯下 红灯亮时 我们到了一块 我想和你交往 但不可能 红灯亮时 我正在想你 想你站在灯下 我制造的雪 落在你的城市 站前的 留言壁上 很想给你留言"
},
{
"instruction":"使用下列意象写一首现代诗:晨风,山坡",
"input":"",
"output":"标题:后来 每天清晨,都是他把太阳唤醒 挽着晨风一道奔上山梁 然后,在山顶上坐下来 望着朝阳在脚下缓缓升起 后来,他只能爬到半山腰 在山坡上歇歇脚,再缓缓走下山来 再后来,他只到村中的老庙旁坐坐 等着那口老钟敲响晨曦 现在,他哪儿也不去了 每天清晨,只能静静地躺在床上 闭着昏花的眼睛,等着阳光 把他昨夜的记忆,一点一点唤醒"
}
]

从样本形式可以看出,整理后的数据已经转化为标准的“指令—输出”训练样本,更便于模型学习“给定意象—生成现代诗”之间的映射关系。

Step 2 模型微调

完成数据处理后,进入微调阶段。本次训练基于 LLaMA Factory WebUI 开展,硬件环境为 6 卡GPU,整体训练耗时约 2 小时。基础模型使用Qwen3-4B-Base。

在训练界面中,只需将数据路径设置为处理后的数据目录,并选择对应的数据集即可开始训练。下图给出了本次实验中可供参考的一组训练参数配置:

Image

训练完成后,可在页面中查看 loss曲线以及相关训练结果,训练结果如下:

Image

Step 3 模型对话验证

微调完成后,可以先通过对话方式对模型效果进行定性验证。

在 LLaMA Factory 的 Chat 页面中,评测原模型时,需要先清空“检查点路径”,再点击“加载模型”,以确保当前调用的是基础模型本体,而不是某个微调后的 checkpoint。随后输入相同的测试问题,观察模型回答风格。

Image

原模型回答效果:

Image

评测微调后的模型时,则在“检查点路径”中选择对应实验输出目录下的 checkpoint,其余流程保持一致,同样输入相同的问题进行测试。微调后回答:

通过这种方式,可以较为直观地比较微调前后模型在诗歌风格、语言节奏和表达方式上的变化。

Step 4  模型评估

在完成定性验证后,还可以进一步通过 Evaluate & Predict 页面进行量化评估。

评测原模型时,同样需要先清空“检查点路径”,确保评估对象为基础模型本体;随后在数据集处选择 val,并保持统一的评测参数设置。

评测微调后的模型时,则在“检查点路径”中选择对应实验输出目录下的 checkpoint,其他评测参数与原模型保持一致。这样可以确保前后对比具有可比性。

Image

最终得到如下评估结果:

微调前

{
    "predict_bleu-4": 2.1871475978647688,
    "predict_model_preparation_time": 0.0044,
    "predict_rouge-1": 21.40672099644128,
    "predict_rouge-2": 3.7574184163701063,
    "predict_rouge-l": 11.514890925266906,
    "predict_runtime": 2094.8775,
    "predict_samples_per_second": 1.071,
    "predict_steps_per_second": 0.134
}

从结果来看,微调后模型在 BLEU-4、ROUGE-1 和 ROUGE-2 等指标上均有明显提升。其中,ROUGE-2 的提升尤为显著,说明模型在局部短语表达和目标风格适应方面有了较明显改善。

需要注意的是,ROUGE-L 出现了小幅下降,但这并不一定意味着生成质量下降。对于现代诗这类创作型文本来说,语言本身更强调分行、断句、留白以及意象跳跃,而不是传统线性叙事。因此,ROUGE-L 这类更偏重连续性匹配的指标,并不能完全反映诗歌任务中的真实生成质量。

同时,从 predict_runtime、samples_per_second 和 steps_per_second 等结果来看,模型在微调前后推理效率基本保持稳定,没有出现明显的性能损耗。

综合来看,本次微调基本实现了模型从仿古创作到现代诗创作的风格迁移与质量优化。

项目思考

这次实验说明了一件事:通过有针对性的数据微调,大模型确实可以学会更贴近目标任务的表达风格。

在现代诗生成这个任务里,只要数据准备清楚、格式整理规范、训练流程合理,模型就能较好地学习现代诗的表达方式。

当然,这个实验还有继续优化的空间,比如调整参数、筛选更高质量的数据,或者加入更细致的人工评测。