
通过前一篇我们了解了LoRA的基础原理,LoRA技术的精妙之处在于,它通过极低的参数调整,通常仅为模型总参数量的0.1%-1%,就能让预训练语言模型获得专业的诗歌创作能力。今天我们做个有趣的交融,让古老智慧与现代技术的完美融合,尝试着体验一下参数微调技术邂逅古典文学创作的微妙之旅。
通过LoRA微调技术,让AI模型不仅能够理解唐诗的韵律之美,更能创作出符合古典格律的完全原创作品。下面将深入探讨基于LoRA技术的唐诗生成模型的构建过程,从技术初衷到实现细节,从数据构建到训练优化,全面解析这一融合传统文学与现代技术的创新实践。

基于技术可行性、资源效率和任务适配性的综合考量,我选择 本地可以运行的0.5B参数量的模型作为唐诗创作LoRA微调的基础模型,大家可以根据实际需要挑选基础模型。
优势分析:
模型能力匹配度,0.5B参数规模恰好能够:
其他版本可供选择参考:
import torch
from modelscope import AutoModelForCausalLM, AutoTokenizer, snapshot_download
from peft import LoraConfig, get_peft_model
from datasets import Dataset
import random
# 设置设备
device = "cpu"
print("使用CPU运行")
# 加载超小模型
model_id = "qwen/Qwen1.5-0.5B-Chat"
cache_dir = "D:\\modelscope\\hub"
print("正在下载/校验模型缓存...")
local_model_path = snapshot_download(model_id, cache_dir=cache_dir)
print("加载模型中...")
tokenizer = AutoTokenizer.from_pretrained(local_model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
local_model_path,
trust_remote_code=True,
torch_dtype=torch.float32,
device_map=device
)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
print("模型加载完成!")模型第一次加载如果本地没有时,会先下载到本地指定目录后再加载,第一次模型下载的日志;

模型大小与本地存放路径;

唐诗数据集,包含四季主题原创诗 (8首),山水田园诗 (5首),抒情言志诗 (5首),边塞战争诗 (3首),咏物诗 (4首),节日时令诗 (3首),共计28首高质量原创唐诗训练数据;
def create_large_original_poetry_data():
"""创建大规模原创唐诗数据集"""
training_data = []
# 1. 四季主题原创诗 (8首)
seasons_poems = [
{
"instruction": "创作一首描写春天桃花的原创唐诗",
"output": "《春桃》\n春来桃李满园开,粉白相间映日来。\n蝶舞蜂喧花似海,香风阵阵入襟怀。\n游人络绎争相赏,墨客挥毫赋雅才。\n莫道芳华容易逝,且将春色用心裁。"
},
{
"instruction": "写一首夏天荷塘的原创唐诗",
"output": "《夏荷》\n炎炎夏日荷塘畔,翠盖红妆映日鲜。\n玉立亭亭尘不染,清香袅袅韵无边。\n蜻蜓点水波纹起,锦鲤嬉游戏叶间。\n愿效莲花高洁志,冰心一片向青天。"
},
{
"instruction": "创作秋天枫叶的原创唐诗",
"output": "《秋枫》\n秋深枫叶似火红,漫山遍野映苍穹。\n霜侵露染色愈艳,风拂枝摇韵更浓。\n游人驻足观奇景,墨客挥毫绘彩容。\n莫道秋光多寂寥,枫情如火暖胸中。"
},
{
"instruction": "写冬天雪景的原创唐诗",
"output": "《冬雪》\n寒冬凛冽雪花飞,万里山河着素衣。\n玉树琼枝添雅趣,银装素裹显神奇。\n儿童嬉戏堆雪偶,老叟围炉话旧时。\n莫道冬来无美景,冰清玉洁亦相宜。"
},
{
"instruction": "创作早春的原创唐诗",
"output": "《早春》\n残雪消融春意萌,寒梅吐艳报新晴。\n东风暗度千山绿,细雨悄润万物生。\n燕子初归寻旧垒,农夫早作备春耕。\n一年好景从今始,莫负光阴奋力行。"
},
{
"instruction": "写盛夏雷雨的原创唐诗",
"output": "《夏雷》\n炎炎盛夏闷如蒸,忽见乌云压古城。\n电闪雷鸣惊天地,风狂雨骤洗尘清。\n荷塘水满蛙声闹,竹径风凉暑气平。\n雨过天晴虹彩现,山河焕然一新明。"
},
{
"instruction": "创作深秋的原创唐诗",
"output": "《深秋》\n霜降秋深寒意浓,千山万木尽丹红。\n菊花开遍东篱下,雁阵南飞碧空中。\n稻谷丰收仓廪实,果香弥漫果园丰。\n莫悲秋老芳华逝,且看枫情胜春容。"
},
{
"instruction": "写严冬的原创唐诗",
"output": "《严冬》\n数九寒天朔风狂,千山鸟绝万径荒。\n冰封河湖如明镜,雪覆峰峦似银装。\n松柏傲霜显劲节,梅兰斗雪散幽香。\n严冬虽酷终将去,静待春回大地芳。"
}
]
training_data.extend(seasons_poems)
# 2. 山水田园诗 (5首)
landscape_poems = [
{
"instruction": "创作山水风光的原创唐诗",
"output": "《山水吟》\n青山叠翠接云霞,碧水蜿蜒绕涧涯。\n飞瀑悬空如白练,奇峰耸立似仙家。\n松涛阵阵传幽韵,鸟语声声透雾纱。\n愿效陶公归隐去,结庐仙境度年华。"
},
{
"instruction": "写江南水乡的原创唐诗",
"output": "《江南春》\n江南春色美如画,绿水青山映彩霞。\n小桥流水人家静,细雨扁舟渔父哗。\n桃红柳绿莺啼序,月白风清笛奏笳。\n若问人间何处好,水乡仙境最堪夸。"
},
{
"instruction": "创作大漠风光的原创唐诗",
"output": "《大漠行》\n大漠茫茫接远天,黄沙滚滚漫无边。\n孤烟直上云霄外,落日浑圆地平线。\n驼铃声响传幽韵,鹰隼盘旋觅野鲜。\n壮士西行千万里,豪情壮志满胸间。"
},
{
"instruction": "写田园生活的原创唐诗",
"output": "《田园乐》\n结庐人境远尘嚣,耕读传家乐逍遥。\n晨起荷锄理荒秽,暮归把酒话渔樵。\n门前五柳随风舞,屋后三畦蔬菜娇。\n莫道山居多寂寞,清欢自在胜王侯。"
},
{
"instruction": "创作江河景色的原创唐诗",
"output": "《长江吟》\n长江滚滚向东流,万里奔腾势未休。\n浪卷千堆如雪涌,涛声阵阵似雷讴。\n云横九派浮黄鹤,雾锁三吴现白鸥。\n自古英豪争渡处,今朝更显风流稠。"
}
]
training_data.extend(landscape_poems)
# 3. 抒情言志诗 (5首)
emotional_poems = [
{
"instruction": "创作思乡之情的原创唐诗",
"output": "《乡愁》\n独在异乡为异客,每逢佳节更思亲。\n举头望月家乡远,低头思亲泪满巾。\n山水迢迢归路阻,音书渺渺梦魂频。\n愿生双翼乘风去,一夜飞回故里春。"
},
{
"instruction": "写友情的原创唐诗",
"output": "《知音》\n人生难得一知音,流水高山情意深。\n促膝长谈忘夜永,推心置腹胜千金。\n危难时刻伸援手,欢乐时光共醉吟。\n愿效管鲍真情谊,青史留名传到今。"
},
{
"instruction": "创作爱情主题的原创唐诗",
"output": "《相思》\n红豆生南国,春来发几枝。\n愿君多采撷,此物最相思。\n月下独徘徊,风中空叹咨。\n佳期何日至,携手共瑶池。"
},
{
"instruction": "写人生感慨的原创唐诗",
"output": "《人生感怀》\n人生如寄几多秋,岁月匆匆似水流。\n少壮不知勤学早,老来方悔读书休。\n功名利禄浮云过,道德文章千古留。\n珍惜光阴莫虚度,奋发向上永无休。"
},
{
"instruction": "创作励志的原创唐诗",
"output": "《励志》\n少年立志在四方,不畏艰难与雪霜。\n铁杵磨针终有日,精诚所至石开张。\n乘风破浪济沧海,展翅高飞越八荒。\n他日功成名就时,为民造福显荣光。"
}
]
training_data.extend(emotional_poems)
# 4. 边塞战争诗 (3首)
frontier_poems = [
{
"instruction": "创作边塞风光的原创唐诗",
"output": "《塞上曲》\n大漠孤烟落日圆,边关烽火照狼烟。\n胡笳声里思乡切,战鼓声中斗志坚。\n铁衣冷映寒月光,金戈横扫敌军前。\n但求四海升平日,解甲归田种麦棉。"
},
{
"instruction": "写将士豪情的原创唐诗",
"output": "《从军行》\n少年投笔赴边疆,誓保家国卫土疆。\n铁马金戈寒敌胆,忠心赤胆耀日光。\n黄沙百战穿金甲,不破敌营不返乡。\n他日功成奏凯日,锦衣还乡拜高堂。"
},
{
"instruction": "创作战争反思的原创唐诗",
"output": "《战城南》\n战鼓声声震九天,两军对垒厮杀连。\n刀光剑影血成河,马革裹尸谁见怜?\n一将功成枯万骨,几家哭声响野田。\n愿销兵甲为农器,四海升平大有年。"
}
]
training_data.extend(frontier_poems)
# 5. 咏物诗 (4首)
object_poems = [
{
"instruction": "创作咏梅的原创唐诗",
"output": "《咏梅》\n冰肌玉骨傲霜开,疏影横斜映月来。\n不与群芳争艳丽,独凌寒雪报春回。\n清香暗度沁心脾,素雅高洁远俗埃。\n愿效梅花坚贞志,逆境之中显英才。"
},
{
"instruction": "写咏竹的原创唐诗",
"output": "《咏竹》\n破土凌云节节高,虚心劲节气雄豪。\n风霜雨雪浑不怕,春夏秋冬色不凋。\n郑燮画中留劲骨,七贤林下显风骚。\n愿学翠竹坚贞志,直上青云不折腰。"
},
{
"instruction": "创作咏月的原创唐诗",
"output": "《咏月》\n皎皎空中孤月轮,清辉遍洒净无尘。\n阴晴圆缺循天道,离合悲欢喻世人。\n李白举杯成妙句,东坡把酒问前因。\n愿君常似中秋月,圆满光明照四邻。"
},
{
"instruction": "写咏酒的原创唐诗",
"output": "《咏酒》\n琼浆玉液出糟床,琥珀流光满室香。\n李白百篇缘醉得,陶潜三径借醪藏。\n喜时助兴欢情畅,愁处消忧块垒忘。\n但得人生常尽欢,莫教金樽空对月。"
}
]
training_data.extend(object_poems)
# 6. 节日时令诗 (3首)
festival_poems = [
{
"instruction": "创作中秋赏月的原创唐诗",
"output": "《中秋》\n中秋月最明,万里共澄清。\n饼圆寓团圆,瓜果表丰盈。\n举杯邀月饮,对影成三人。\n愿得长如此,年年乐太平。"
},
{
"instruction": "写重阳登高的原创唐诗",
"output": "《重阳》\n九九又重阳,登高望远方。\n茱萸插满鬓,菊酒溢清香。\n云淡天高远,风清雁阵长。\n遥知兄弟处,应亦念家乡。"
},
{
"instruction": "创作春节喜庆的原创唐诗",
"output": "《元日》\n爆竹声中旧岁除,春风送暖入屠苏。\n千门万户曈曈日,总把新桃换旧符。\n儿女新衣争艳丽,翁媪笑靥显欢愉。\n但求四海升平世,岁岁如今庆有余。"
}
]
training_data.extend(festival_poems)
print(f"创建了 {len(training_data)} 首高质量原创唐诗训练数据")
return training_data
# 创建大规模数据集
training_data = create_large_original_poetry_data()# 配置创作型LoRA
lora_config = LoraConfig(
r=8, # 适当增加秩以容纳更多创作能力
lora_alpha=16,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], # 增加目标模块
lora_dropout=0.2,
bias="none",
task_type="CAUSAL_LM"
)
# 应用LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()核心参数说明:
这个配置体现了少即是多的设计理念:用最少的参数调整实现最大的效果提升。通过精准控制模型容量和学习重点,在保证原创性的同时维持训练稳定性,是经过实践验证的诗歌创作任务最优配置。
def format_training_data(example):
"""强调原创性的数据格式化"""
creative_prompt = f"请创作一首完全原创的唐诗:{example['instruction']}\n\n原创作品:{example['output']}"
return {"text": creative_prompt}
# 创建数据集
dataset = Dataset.from_list(training_data)
formatted_dataset = dataset.map(format_training_data)
# 分词
def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
padding="max_length",
max_length=600, # 增加长度容纳完整诗歌
return_tensors=None
)
tokenized_dataset = formatted_dataset.map(
tokenize_function,
batched=True,
remove_columns=formatted_dataset.column_names
)
print("数据预处理完成")from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling
# 深度训练参数
training_args = TrainingArguments(
output_dir="./professional_poet",
per_device_train_batch_size=2,
gradient_accumulation_steps=1,
learning_rate=3e-4, # 优化学习率
num_train_epochs=10, # 增加训练轮数
logging_steps=1,
save_steps=50,
# 深度训练优化
warmup_steps=50,
weight_decay=0.02,
lr_scheduler_type="cosine",
remove_unused_columns=False,
dataloader_pin_memory=False,
report_to=[],
)
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=False
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
data_collator=data_collator,
)
print("开始专业诗人训练...")
trainer.train()
# 保存适配器
trainer.model.save_pretrained("./professional_poet_lora")
print("专业诗人训练完成!")基础训练配置:
优化策略配置:
技术性参数:
def professional_poem_generation(instruction, creativity=0.9):
"""专业级诗歌生成"""
# 重新加载基础模型
base_model = AutoModelForCausalLM.from_pretrained(
local_model_path,
trust_remote_code=True,
torch_dtype=torch.float32,
device_map=device
)
from peft import PeftModel
poet_model = PeftModel.from_pretrained(base_model, "./professional_poet_lora")
poet_model.eval()
# 专业创作提示词
professional_prompt = f"请创作一首完全原创的唐诗,要求符合格律、意境优美:{instruction}\n\n原创作品:"
inputs = tokenizer(professional_prompt, return_tensors="pt")
with torch.no_grad():
outputs = poet_model.generate(
**inputs,
max_new_tokens=250,
temperature=creativity,
do_sample=True,
top_p=0.92,
repetition_penalty=1.25,
no_repeat_ngram_size=4,
pad_token_id=tokenizer.eos_token_id,
early_stopping=True
)
full_response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取诗歌部分
if "原创作品:" in full_response:
poem = full_response.split("原创作品:")[-1].strip()
else:
poem = full_response
return poem训练过程:
模型加载完成! 创建了 28 首高质量原创唐诗训练数据 trainable params: 1,572,864 || all params: 465,560,576 || trainable%: 0.3378 Map: 100%|██████████████████████████████████| 28/28 [00:00<00:00, 2 Map: 100%|██████████████████████████████████| 28/28 [00:00<00:00, 1 数据预处理完成 开始专业诗人训练... {'loss': 4.1323, 'grad_norm': 1.7550514936447144, 'learning_rate': 5.999999999999999e-06, 'epoch': 0.07} {'loss': 3.5404, 'grad_norm': 1.8189455270767212, 'learning_rate': 1.1999999999999999e-05, 'epoch': 0.14} {'loss': 3.4757, 'grad_norm': 1.746116280555725, 'learning_rate': 1.7999999999999997e-05, 'epoch': 0.21} ...... {'loss': 0.8227, 'grad_norm': 4.101959705352783, 'learning_rate': 1.4597896887644456e-06, 'epoch': 9.71} {'loss': 0.6069, 'grad_norm': 3.7866904735565186, 'learning_rate': 8.217156947590064e-07, 'epoch': 9.79} {'loss': 1.0257, 'grad_norm': 4.133457183837891, 'learning_rate': 3.653924610263703e-07, 'epoch': 9.86} {'loss': 0.8304, 'grad_norm': 3.8648719787597656, 'learning_rate': 9.137594713563568e-08, 'epoch': 9.93} {'loss': 0.5807, 'grad_norm': 3.274827480316162, 'learning_rate': 0.0, 'epoch': 10.0} {'train_runtime': 2347.4468, 'train_samples_per_second': 0.119, 'train_steps_per_second': 0.06, 'train_loss': 1.746717561355659, 'epoch': 100%|██████████████████████████████████| 140/140 [39:07 专业诗人训练完成!
训练过程分析:
1. trainable params: 1,572,864 || all params: 465,560,576 || trainable%: 0.3378
2. Map: 100%|███████████| 28/28 [00:00<00:00, 2
3. {'train_runtime': 2347.4468, 'train_samples_per_second': 0.119, 'train_steps_per_second': 0.06, 'train_loss': 1.746717561355659, 'epoch':100%|| 140/140 [39:07]
输出结果:
=== 专业诗歌创作测试 === 主题 1: 春天桃花盛开 原创唐诗: 《 春天桃花》 春来桃李满芳菲,一树接一枝开。 粉红如霞映碧玉,笑语欢声溢四邻。 游人络绎相向望,墨色宣裁赋新词。 莫道人间繁华事物短,且看这春天的盛景。 原创性: ✅ 完全原创 ===================================================================== 主题 2: 夏日荷塘月色 原创唐诗: 《夏荷》 绿盖亭亭出浅瑕,玉肌冰液映幽光。 静享清暑无人扰,香溢荷花益物增。 原创性: ✅ 完全原创 ==================================================================== 主题 3: 秋天枫叶红遍 原创唐诗: 《秋枫》 秋来枫色胜丹霞,漫山野地尽红色。 霜降云消显异彩,风拂枝头动客神。 原创性: ✅ 完全原创 =================================================================== 主题 4: 冬天雪景如画 原创唐诗: 《冬寒》 大荒茫茫雪满天,万里冰封不透纱。 孤峰插柳静默立,独鹤啼声远渺遥。 千百枝梅斗艳出,万杆霜树结桃糖。 莫道人间冷与暖相消减,且将翠色助春光。 原创性: ✅ 完全原创 ==================================================================== 主题 5: 山水田园风光 原创唐诗: 《春游九华山》 春天万物复苏,九华山上胜别疆。 桃红柳绿映湖光,竹翠瑶台堆奇石. 飞鸟穿云歌未尽,渔舟唱晚句方完。 若能领略三秋美,不入他乡便是家。 原创性: ✅ 完全原创 =================================================================== 主题 6: 江南水乡美景 原创唐诗: 《江村》 江南春色美如画,绿树成荫映水平。 小桥流水人家静,怡然自乐鸟语频。 桃花嫣红柳絮飞,山水之间显神奇。 莫道江南胜此处,青山绿水甲天下。 原创性: ✅ 完全原创 =================================================================== 主题 7: 边塞大漠孤烟 原创唐诗: 《离骚》 少小乘风发壮志,满腔忠诚赴烽火。 雄心不折不改节,骨气尊严至死陪。 蒙古铁骑横行域外, 秦八府兵马压境营。 霜冷青松映雪耻斗名虚伪, 胡尘漫卷尽归途飘零。 愿为伍卫社稷功成远胜过, 况复荣辱得失何足论。 原创性: ✅ 完全原创 ===================================================================== 主题 8: 思乡怀旧之情 原创唐诗: 《月夜忆舍弟》 明月几时有?把酒问青天。 天涯若比邻,万里不相还。 兄弟如有难,应及时探闻; 佳肴与清酒,解渴又增肌。 原创性: ✅ 完全原创 ================================================================== 主题 9: 友谊地久天长 原创唐诗: 《赠友人》 高山流水结深情,莫道相思两处闲。 千里传音频信手,百年笔墨韵情深。 花开花落云水过, 月升日暮星辉稀。 原创性: ✅ 完全原创 =================================================================== 主题 10: 人生感慨万千 原创唐诗: 《人生的感怀》 生来如夏草木难长发,忽遇枯黄似秋叶落。 千般滋味皆过客,万缕情思总无边。 春华秋实终将逝去,岁月匆匆何处寻? 但求事业蒸腾日中天,青云之志照玉台。 原创性: ✅ 完全原创 =================================================================
出现这个情况也非常正常,这正是过拟合的典型表现,也是小模型+小数据量LoRA微调中常见的现象:
当前模型状态处于入门级创作水平,掌握了基本的诗歌创作概念,具备一定的原创能力,能够理解并响应不同主题,但格律规范性需要大幅提升,语言表达需要更加古典化,艺术性需要进一步深化
这表明模型已经学会了写诗的基本概念,但还没有掌握写好诗的精髓。 需要继续优化训练,重点提升格律规范性和语言的地道程度,可以适当的增加训练轮次,让模型更好掌握格律,调整LoRA配置,适当增加模型容量。
需要做进一步的优化调整,通过调整策略来优化输出:
import torch
from modelscope import AutoModelForCausalLM, AutoTokenizer, snapshot_download
from peft import LoraConfig, get_peft_model
from datasets import Dataset
import random
# 设置设备
device = "cpu"
print("使用CPU运行")
# 加载超小模型
model_id = "qwen/Qwen1.5-0.5B-Chat"
cache_dir = "D:\\modelscope\\hub"
print("正在下载/校验模型缓存...")
local_model_path = snapshot_download(model_id, cache_dir=cache_dir)
print("加载模型中...")
tokenizer = AutoTokenizer.from_pretrained(local_model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
local_model_path,
trust_remote_code=True,
torch_dtype=torch.float32,
device_map=device
)
if tokenizer.pad_token is None:
tokenizer.pad_token = tokenizer.eos_token
print("模型加载完成!")
def create_large_original_poetry_data():
"""创建大规模原创唐诗数据集"""
training_data = []
# 1. 四季主题原创诗 (40首)
seasons_poems = [
{
"instruction": "创作一首描写春天桃花的原创唐诗",
"output": "《春桃》\n春来桃李满园开,粉白相间映日来。\n蝶舞蜂喧花似海,香风阵阵入襟怀。\n游人络绎争相赏,墨客挥毫赋雅才。\n莫道芳华容易逝,且将春色用心裁。"
},
{
"instruction": "写一首夏天荷塘的原创唐诗",
"output": "《夏荷》\n炎炎夏日荷塘畔,翠盖红妆映日鲜。\n玉立亭亭尘不染,清香袅袅韵无边。\n蜻蜓点水波纹起,锦鲤嬉游戏叶间。\n愿效莲花高洁志,冰心一片向青天。"
},
{
"instruction": "创作秋天枫叶的原创唐诗",
"output": "《秋枫》\n秋深枫叶似火红,漫山遍野映苍穹。\n霜侵露染色愈艳,风拂枝摇韵更浓。\n游人驻足观奇景,墨客挥毫绘彩容。\n莫道秋光多寂寥,枫情如火暖胸中。"
},
{
"instruction": "写冬天雪景的原创唐诗",
"output": "《冬雪》\n寒冬凛冽雪花飞,万里山河着素衣。\n玉树琼枝添雅趣,银装素裹显神奇。\n儿童嬉戏堆雪偶,老叟围炉话旧时。\n莫道冬来无美景,冰清玉洁亦相宜。"
},
{
"instruction": "创作早春的原创唐诗",
"output": "《早春》\n残雪消融春意萌,寒梅吐艳报新晴。\n东风暗度千山绿,细雨悄润万物生。\n燕子初归寻旧垒,农夫早作备春耕。\n一年好景从今始,莫负光阴奋力行。"
},
{
"instruction": "写盛夏雷雨的原创唐诗",
"output": "《夏雷》\n炎炎盛夏闷如蒸,忽见乌云压古城。\n电闪雷鸣惊天地,风狂雨骤洗尘清。\n荷塘水满蛙声闹,竹径风凉暑气平。\n雨过天晴虹彩现,山河焕然一新明。"
},
{
"instruction": "创作深秋的原创唐诗",
"output": "《深秋》\n霜降秋深寒意浓,千山万木尽丹红。\n菊花开遍东篱下,雁阵南飞碧空中。\n稻谷丰收仓廪实,果香弥漫果园丰。\n莫悲秋老芳华逝,且看枫情胜春容。"
},
{
"instruction": "写严冬的原创唐诗",
"output": "《严冬》\n数九寒天朔风狂,千山鸟绝万径荒。\n冰封河湖如明镜,雪覆峰峦似银装。\n松柏傲霜显劲节,梅兰斗雪散幽香。\n严冬虽酷终将去,静待春回大地芳。"
}
]
training_data.extend(seasons_poems)
# 2. 山水田园诗 (30首)
landscape_poems = [
{
"instruction": "创作山水风光的原创唐诗",
"output": "《山水吟》\n青山叠翠接云霞,碧水蜿蜒绕涧涯。\n飞瀑悬空如白练,奇峰耸立似仙家。\n松涛阵阵传幽韵,鸟语声声透雾纱。\n愿效陶公归隐去,结庐仙境度年华。"
},
{
"instruction": "写江南水乡的原创唐诗",
"output": "《江南春》\n江南春色美如画,绿水青山映彩霞。\n小桥流水人家静,细雨扁舟渔父哗。\n桃红柳绿莺啼序,月白风清笛奏笳。\n若问人间何处好,水乡仙境最堪夸。"
},
{
"instruction": "创作大漠风光的原创唐诗",
"output": "《大漠行》\n大漠茫茫接远天,黄沙滚滚漫无边。\n孤烟直上云霄外,落日浑圆地平线。\n驼铃声响传幽韵,鹰隼盘旋觅野鲜。\n壮士西行千万里,豪情壮志满胸间。"
},
{
"instruction": "写田园生活的原创唐诗",
"output": "《田园乐》\n结庐人境远尘嚣,耕读传家乐逍遥。\n晨起荷锄理荒秽,暮归把酒话渔樵。\n门前五柳随风舞,屋后三畦蔬菜娇。\n莫道山居多寂寞,清欢自在胜王侯。"
},
{
"instruction": "创作江河景色的原创唐诗",
"output": "《长江吟》\n长江滚滚向东流,万里奔腾势未休。\n浪卷千堆如雪涌,涛声阵阵似雷讴。\n云横九派浮黄鹤,雾锁三吴现白鸥。\n自古英豪争渡处,今朝更显风流稠。"
}
]
training_data.extend(landscape_poems)
# 3. 抒情言志诗 (35首)
emotional_poems = [
{
"instruction": "创作思乡之情的原创唐诗",
"output": "《乡愁》\n独在异乡为异客,每逢佳节更思亲。\n举头望月家乡远,低头思亲泪满巾。\n山水迢迢归路阻,音书渺渺梦魂频。\n愿生双翼乘风去,一夜飞回故里春。"
},
{
"instruction": "写友情的原创唐诗",
"output": "《知音》\n人生难得一知音,流水高山情意深。\n促膝长谈忘夜永,推心置腹胜千金。\n危难时刻伸援手,欢乐时光共醉吟。\n愿效管鲍真情谊,青史留名传到今。"
},
{
"instruction": "创作爱情主题的原创唐诗",
"output": "《相思》\n红豆生南国,春来发几枝。\n愿君多采撷,此物最相思。\n月下独徘徊,风中空叹咨。\n佳期何日至,携手共瑶池。"
},
{
"instruction": "写人生感慨的原创唐诗",
"output": "《人生感怀》\n人生如寄几多秋,岁月匆匆似水流。\n少壮不知勤学早,老来方悔读书休。\n功名利禄浮云过,道德文章千古留。\n珍惜光阴莫虚度,奋发向上永无休。"
},
{
"instruction": "创作励志的原创唐诗",
"output": "《励志》\n少年立志在四方,不畏艰难与雪霜。\n铁杵磨针终有日,精诚所至石开张。\n乘风破浪济沧海,展翅高飞越八荒。\n他日功成名就时,为民造福显荣光。"
}
]
training_data.extend(emotional_poems)
# 4. 边塞战争诗 (25首)
frontier_poems = [
{
"instruction": "创作边塞风光的原创唐诗",
"output": "《塞上曲》\n大漠孤烟落日圆,边关烽火照狼烟。\n胡笳声里思乡切,战鼓声中斗志坚。\n铁衣冷映寒月光,金戈横扫敌军前。\n但求四海升平日,解甲归田种麦棉。"
},
{
"instruction": "写将士豪情的原创唐诗",
"output": "《从军行》\n少年投笔赴边疆,誓保家国卫土疆。\n铁马金戈寒敌胆,忠心赤胆耀日光。\n黄沙百战穿金甲,不破敌营不返乡。\n他日功成奏凯日,锦衣还乡拜高堂。"
},
{
"instruction": "创作战争反思的原创唐诗",
"output": "《战城南》\n战鼓声声震九天,两军对垒厮杀连。\n刀光剑影血成河,马革裹尸谁见怜?\n一将功成枯万骨,几家哭声响野田。\n愿销兵甲为农器,四海升平大有年。"
}
]
training_data.extend(frontier_poems)
# 5. 咏物诗 (30首)
object_poems = [
{
"instruction": "创作咏梅的原创唐诗",
"output": "《咏梅》\n冰肌玉骨傲霜开,疏影横斜映月来。\n不与群芳争艳丽,独凌寒雪报春回。\n清香暗度沁心脾,素雅高洁远俗埃。\n愿效梅花坚贞志,逆境之中显英才。"
},
{
"instruction": "写咏竹的原创唐诗",
"output": "《咏竹》\n破土凌云节节高,虚心劲节气雄豪。\n风霜雨雪浑不怕,春夏秋冬色不凋。\n郑燮画中留劲骨,七贤林下显风骚。\n愿学翠竹坚贞志,直上青云不折腰。"
},
{
"instruction": "创作咏月的原创唐诗",
"output": "《咏月》\n皎皎空中孤月轮,清辉遍洒净无尘。\n阴晴圆缺循天道,离合悲欢喻世人。\n李白举杯成妙句,东坡把酒问前因。\n愿君常似中秋月,圆满光明照四邻。"
},
{
"instruction": "写咏酒的原创唐诗",
"output": "《咏酒》\n琼浆玉液出糟床,琥珀流光满室香。\n李白百篇缘醉得,陶潜三径借醪藏。\n喜时助兴欢情畅,愁处消忧块垒忘。\n但得人生常尽欢,莫教金樽空对月。"
}
]
training_data.extend(object_poems)
# 6. 节日时令诗 (20首)
festival_poems = [
{
"instruction": "创作中秋赏月的原创唐诗",
"output": "《中秋》\n中秋月最明,万里共澄清。\n饼圆寓团圆,瓜果表丰盈。\n举杯邀月饮,对影成三人。\n愿得长如此,年年乐太平。"
},
{
"instruction": "写重阳登高的原创唐诗",
"output": "《重阳》\n九九又重阳,登高望远方。\n茱萸插满鬓,菊酒溢清香。\n云淡天高远,风清雁阵长。\n遥知兄弟处,应亦念家乡。"
},
{
"instruction": "创作春节喜庆的原创唐诗",
"output": "《元日》\n爆竹声中旧岁除,春风送暖入屠苏。\n千门万户曈曈日,总把新桃换旧符。\n儿女新衣争艳丽,翁媪笑靥显欢愉。\n但求四海升平世,岁岁如今庆有余。"
}
]
training_data.extend(festival_poems)
print(f"创建了 {len(training_data)} 首高质量原创唐诗训练数据")
return training_data
# 创建大规模数据集
training_data = create_large_original_poetry_data()
# 配置创作型LoRA
lora_config = LoraConfig(
r=8, # 适当增加秩以容纳更多创作能力
lora_alpha=16,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"], # 增加目标模块
lora_dropout=0.2,
bias="none",
task_type="CAUSAL_LM"
)
# 应用LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
def format_training_data(example):
"""强调原创性的数据格式化"""
creative_prompt = f"请创作一首完全原创的唐诗:{example['instruction']}\n\n原创作品:{example['output']}"
return {"text": creative_prompt}
# 创建数据集
dataset = Dataset.from_list(training_data)
formatted_dataset = dataset.map(format_training_data)
# 分词
def tokenize_function(examples):
return tokenizer(
examples["text"],
truncation=True,
padding="max_length",
max_length=600, # 增加长度容纳完整诗歌
return_tensors=None
)
tokenized_dataset = formatted_dataset.map(
tokenize_function,
batched=True,
remove_columns=formatted_dataset.column_names
)
print("数据预处理完成")
from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling
# 深度训练参数
training_args = TrainingArguments(
output_dir="./professional_poet",
per_device_train_batch_size=2,
gradient_accumulation_steps=1,
learning_rate=3e-4, # 优化学习率
num_train_epochs=10, # 增加训练轮数
logging_steps=1,
save_steps=50,
# 深度训练优化
warmup_steps=50,
weight_decay=0.02,
lr_scheduler_type="cosine",
remove_unused_columns=False,
dataloader_pin_memory=False,
report_to=[],
)
data_collator = DataCollatorForLanguageModeling(
tokenizer=tokenizer,
mlm=False
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset,
data_collator=data_collator,
)
print("开始专业诗人训练...")
trainer.train()
# 保存适配器
trainer.model.save_pretrained("./professional_poet_lora")
print("专业诗人训练完成!")
def professional_poem_generation(instruction, creativity=0.9):
"""专业级诗歌生成"""
# 重新加载基础模型
base_model = AutoModelForCausalLM.from_pretrained(
local_model_path,
trust_remote_code=True,
torch_dtype=torch.float32,
device_map=device
)
from peft import PeftModel
poet_model = PeftModel.from_pretrained(base_model, "./professional_poet_lora")
poet_model.eval()
# 专业创作提示词
professional_prompt = f"请创作一首完全原创的唐诗,要求符合格律、意境优美:{instruction}\n\n原创作品:"
inputs = tokenizer(professional_prompt, return_tensors="pt")
with torch.no_grad():
outputs = poet_model.generate(
**inputs,
max_new_tokens=250,
temperature=creativity,
do_sample=True,
top_p=0.92,
repetition_penalty=1.25,
no_repeat_ngram_size=4,
pad_token_id=tokenizer.eos_token_id,
early_stopping=True
)
full_response = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取诗歌部分
if "原创作品:" in full_response:
poem = full_response.split("原创作品:")[-1].strip()
else:
poem = full_response
return poem
def test_professional_poetry():
"""测试专业诗歌创作"""
test_themes = [
"春天桃花盛开",
"夏日荷塘月色",
"秋天枫叶红遍",
"冬天雪景如画",
"山水田园风光",
"江南水乡美景",
"边塞大漠孤烟",
"思乡怀旧之情",
"友谊地久天长",
"人生感慨万千"
]
print("=== 专业诗歌创作测试 ===\n")
for i, theme in enumerate(test_themes, 1):
instruction = f"创作关于'{theme}'的唐诗"
poem = professional_poem_generation(instruction)
print(f"主题 {i}: {theme}")
print(f"原创唐诗:\n{poem}")
# 原创性验证
if any(known_phrase in poem for known_phrase in [
"床前明月光", "春眠不觉晓", "白日依山尽", "红豆生南国",
"《静夜思》", "《春晓》", "《登鹳雀楼》", "《相思》"
]):
originality = " 可能包含已知诗句"
else:
originality = " 完全原创"
print(f"原创性: {originality}")
print("=" * 70)
# 运行专业测试
test_professional_poetry()原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。