枪战英雄
99.99M · 2026-03-28
回顾昨日的训练历程,我们经历了一场从混乱到有序的技术探索。初始阶段,模型表现令人堪忧:生成内容严重重复、格律混乱,损失值高达1.7467,输出的诗歌如同破碎的镜像,充斥着"长恨歌中用了此"的无意义重复。这背后反映的是训练不充分、参数配置失衡等深层问题。面对这一困境,我们进行了系统的参数重构——将LoRA秩从4提升至16以增强表达能力,学习率调整为2e-4确保稳定收敛,训练轮次延长至20个epoch保证充分学习,同时优化了提示词格式和生成参数。这一系列精准调整,如同为模型注入了新的生命力,为今日的突破性成果奠定了坚实基础。
def create_training_data(self):
"""创建高质量训练数据"""
print(" 创建训练数据...")
training_data = []
# ==================== 四季变换 (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严冬虽酷终将去,静待春回大地芳。"
},
{
"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莫道冬深无乐趣,晚晴亦可悦心情。"
},
{
"instruction": "创作春雨绵绵的原创唐诗",
"output": "《春雨》n春雨如酥润物生,绵绵密密细无声。n桃腮含露娇欲滴,柳眼初开媚自生。n蓑衣渔父垂纶乐,油伞书生觅句行。n最喜丰年春雨足,秋来定有好收成。"
},
{
"instruction": "写夏日蝉鸣的原创唐诗",
"output": "《夏蝉》n绿阴深处响蝉鸣,高亢激昂诉衷情。n饮露餐风标亮节,栖高鸣远显清声。n不随燕雀争粒米,敢向鲲鹏论路程。n莫道微虫无大志,长歌一曲也惊天。"
},
{
"instruction": "创作秋月如钩的原创唐诗",
"output": "《秋月》n秋夜天高月似钩,清辉如水洒九州。n桂香暗度沁心脾,竹影轻摇动客愁。n游子思乡情切切,佳人望月意悠悠。n愿君莫作天涯客,常伴亲帏享温柔。"
},
{
"instruction": "写冬雪初霁的原创唐诗",
"output": "《雪霁》n夜雪初晴万象新,银装素裹净无尘。n冰棱挂檐晶莹透,玉屑铺庭皎洁纯。n稚子堆人相戏耍,老翁扫径自逡巡。n红梅数点雪中艳,预报春回大地新。"
}
]
# 再补充20首四季主题诗
additional_seasons = [
{
"instruction": "创作春耕时节的原创唐诗",
"output": "《春耕》n春回大地暖风催,布谷声声促耕来。n铁牛轰鸣翻沃土,银锄起落种希望。n农夫汗洒田园里,燕子泥衔梁栋材。n但得秋来丰硕果,千辛万苦也开怀。"
},
{
"instruction": "写夏日采莲的原创唐诗",
"output": "《采莲》n夏日荷塘翠色连,采莲女子笑开颜。n轻舟荡破琉璃镜,玉手摘来玛瑙盘。n歌彻云霄惊白鹭,笑盈水面动红蕖。n归来满载斜阳里,一路清香伴月还。"
},
# ... 更多四季诗(共40首)
]
training_data.extend(seasons_poems)
training_data.extend(additional_seasons)
# ==================== 山水田园 (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自古英豪争渡处,今朝更显风流稠。"
},
{
"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愿作溪中一卵石,长听天籁自悠悠。"
},
# ... 更多山水田园诗(共30首)
]
training_data.extend(landscape_poems)
# ==================== 抒情言志 (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他日功成名就时,为民造福显荣光。"
},
{
"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从今愿作长相聚,莫再分离各西东。"
},
# ... 更多抒情言志诗(共35首)
]
training_data.extend(emotional_poems)
# ==================== 边塞风云 (25首) ====================
frontier_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为国守疆无怨悔,丹心一片照天罡。"
},
# ... 更多边塞诗(共25首)
]
training_data.extend(frontier_poems)
# ==================== 咏物寄情 (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但得人生常尽欢,莫教金樽空对月。"
},
{
"instruction": "创作咏松的原创唐诗",
"output": "《咏松》n峭壁悬崖一老松,风霜雨雪仍从容。n根深不怕狂风动,干正何忧暴雨冲。n四季常青显劲节,千年不朽见贞忠。n愿学青松坚毅志,艰难困苦亦豪雄。"
},
{
"instruction": "写咏菊的原创唐诗",
"output": "《咏菊》n秋深百卉尽凋残,唯有菊花傲霜寒。n金甲满披香益远,玉肌微露色尤丹。n不随桃李争春艳,独伴松梅耐岁寒。n愿效黄花晚节香,老当益壮志如磐。"
},
{
"instruction": "创作咏兰的原创唐诗",
"output": "《咏兰》n空谷幽兰独自芳,不因无人减馨香。n素心一点含雅韵,翠叶数茎带露光。n羞与群葩争艳丽,乐同君子论文章。n愿学兰花高洁品,远离尘俗守清芳。"
},
{
"instruction": "写咏剑的原创唐诗",
"output": "《咏剑》n龙泉出匣寒光闪,百炼千锤始铸成。n斩妖除魔凭正气,安邦定国靠精诚。n匣中夜夜鸣不已,世上时时待不平。n愿借三尺青锋剑,扫尽人间邪恶情。"
},
# ... 更多咏物诗(共30首)
]
training_data.extend(object_poems)
# ==================== 节日时令 (20首) ====================
festival_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但愿有情成眷属,莫教离别恨迢迢。"
},
# ... 更多节日诗(共20首)
]
training_data.extend(festival_poems)
print(f" 创建了 {len(training_data)} 首高质量唐诗训练数据")
return training_data
"""配置LoRA"""
lora_config = LoraConfig(
r=16, # 适当增加秩
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.1, # 降低dropout
bias="none",
task_type="CAUSAL_LM"
)
核心参数解读:
调试历程回顾:
在项目启动初期,我们遭遇了令人沮丧的生成效果。模型如同一个记忆混乱的诗人,不断重复着"长恨歌中用了此"这样毫无意义的句子,或是陷入"春风拂面花。春风拂面柳。"的死循环。训练损失值停留在1.7467的高位,生成的诗歌支离破碎,完全背离了唐诗的格律要求。
第一次调试尝试:
我们首先怀疑是训练轮次不足,将epoch从10轮增加至15轮。然而结果令人失望——损失值仅轻微下降至1.532,生成质量未见明显改善。模型似乎陷入了一种"局部最优",学会了规避明显的错误,却未能掌握真正的创作规律。
深入分析阶段:
通过仔细检查训练数据和处理流程,我们发现两个关键问题:一是提示词设计过于简单,未能有效引导模型理解创作要求;二是LoRA配置过于保守,r=4的秩限制了模型的学习能力。更严重的是,dropout设置过高(0.3)导致模型难以稳定学习长期依赖关系。
突破性调整:
调试过程中的关键发现:
在第五个epoch时,我们观察到损失值开始出现显著下降趋势,从1.2快速降至0.8。这证实了参数调整方向的正确性。到第十个epoch时,损失值突破0.5大关,生成内容开始展现出基本的诗歌结构。最令人振奋的是在第15个epoch后,损失值稳定在0.2以下,生成的诗歌不仅符合格律要求,更能体现一定的意境和情感。
技术细节优化:
在生成阶段,我们通过多次实验确定了最佳参数组合:temperature=0.7在创造性和稳定性间取得平衡,repetition_penalty=1.3有效防止了内容重复,top_p=0.9确保了生成质量。这些微调虽然看似细小,却是实现高质量生成的关键所在。
最终成果验证:
经过20个epoch的充分训练,模型交出了令人满意的答卷——损失值降至0.069,较初始值下降97%。生成测试显示,模型已经能够创作出意境优美、对仗工整的原创唐诗。从"春风拂面花"的机械重复到"青山翠色连边际,农村流水展宏图"的生动描绘,这一转变见证了LoRA技术在创造性任务中的巨大潜力。
这次调试历程充分证明,在AI创作领域,精密的参数调优与深刻的任务理解同样重要。每一个小数点的移动,都承载着从量变到质变的技术突破。
经过深度优化的训练流程,我们见证了AI诗歌创作的质的飞跃。最终训练损失值降至0.069,较初始值下降了惊人的97%,这一数据充分证明了调参策略的有效性。模型不仅摆脱了内容重复的桎梏,更展现出对唐诗格律的深刻理解和原创能力。
从技术层面看,梯度范数稳定在1.287的理想区间,训练过程平稳有序;从创作效果看,生成诗歌已能实现意境连贯、对仗工整的艺术追求。这次实践生动诠释了"参数微调"的艺术——它不是简单的数值游戏,而是需要在模型容量、训练效率和创作质量间寻求精妙平衡。更重要的是,这一成功案例为小模型在创造性任务中的应用开辟了新的可能,证明即使在有限算力下,通过精准的LoRA配置和训练优化,同样能够实现专业级的文学创作能力,这无疑为后续的AI人文研究提供了宝贵的实践经验和技术范式。
大家可以结合前面一篇对比看看提升的效果;
import torch
from modelscope import AutoModelForCausalLM, AutoTokenizer, snapshot_download
from peft import LoraConfig, get_peft_model
from datasets import Dataset
from transformers import TrainingArguments, Trainer, DataCollatorForLanguageModeling
import re
import argparse
import gradio as gr
class TangPoetryTrainer:
def __init__(self, model_name="qwen/Qwen1.5-0.5B-Chat", skip_training=False):
self.device = "cpu"
self.model_name = model_name
self.model = None
self.tokenizer = None
self.skip_training = skip_training
cache_dir = "D:\modelscope\hub"
print("正在下载/校验模型缓存...")
self.local_model_path = snapshot_download(model_name, cache_dir=cache_dir)
self.local_model_path2 = snapshot_download('Qwen/Qwen1.5-1.8B-Chat', cache_dir="D:\modelscope\hub")
def setup_model(self):
"""初始化模型和分词器"""
print(" 加载模型中...")
self.tokenizer = AutoTokenizer.from_pretrained(
self.local_model_path,
trust_remote_code=True
)
self.model = AutoModelForCausalLM.from_pretrained(
self.local_model_path,
trust_remote_code=True,
torch_dtype=torch.float32,
device_map=self.device
)
if self.tokenizer.pad_token is None:
self.tokenizer.pad_token = self.tokenizer.eos_token
print(" 模型加载完成")
return self.model, self.tokenizer
def load_trained_model(self, trained_path="./tang_poetry_lora"):
"""加载已训练好的模型,用于跳过训练直接测试"""
print(" 加载已训练模型...")
# 仍使用原始分词器
self.tokenizer = AutoTokenizer.from_pretrained(
self.local_model_path,
trust_remote_code=True
)
# 加载训练后保存的完整模型
self.model = AutoModelForCausalLM.from_pretrained(
trained_path,
trust_remote_code=True,
torch_dtype=torch.float32,
device_map=self.device
)
if self.tokenizer.pad_token is None:
self.tokenizer.pad_token = self.tokenizer.eos_token
print(" 已训练模型加载完成")
return self.model, self.tokenizer
def create_training_data(self):
"""创建高质量训练数据"""
print(" 创建训练数据...")
training_data = []
# ==================== 四季变换 (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严冬虽酷终将去,静待春回大地芳。"
},
{
"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莫道冬深无乐趣,晚晴亦可悦心情。"
},
{
"instruction": "创作春雨绵绵的原创唐诗",
"output": "《春雨》n春雨如酥润物生,绵绵密密细无声。n桃腮含露娇欲滴,柳眼初开媚自生。n蓑衣渔父垂纶乐,油伞书生觅句行。n最喜丰年春雨足,秋来定有好收成。"
},
{
"instruction": "写夏日蝉鸣的原创唐诗",
"output": "《夏蝉》n绿阴深处响蝉鸣,高亢激昂诉衷情。n饮露餐风标亮节,栖高鸣远显清声。n不随燕雀争粒米,敢向鲲鹏论路程。n莫道微虫无大志,长歌一曲也惊天。"
},
{
"instruction": "创作秋月如钩的原创唐诗",
"output": "《秋月》n秋夜天高月似钩,清辉如水洒九州。n桂香暗度沁心脾,竹影轻摇动客愁。n游子思乡情切切,佳人望月意悠悠。n愿君莫作天涯客,常伴亲帏享温柔。"
},
{
"instruction": "写冬雪初霁的原创唐诗",
"output": "《雪霁》n夜雪初晴万象新,银装素裹净无尘。n冰棱挂檐晶莹透,玉屑铺庭皎洁纯。n稚子堆人相戏耍,老翁扫径自逡巡。n红梅数点雪中艳,预报春回大地新。"
}
]
# 再补充20首四季主题诗
additional_seasons = [
{
"instruction": "创作春耕时节的原创唐诗",
"output": "《春耕》n春回大地暖风催,布谷声声促耕来。n铁牛轰鸣翻沃土,银锄起落种希望。n农夫汗洒田园里,燕子泥衔梁栋材。n但得秋来丰硕果,千辛万苦也开怀。"
},
{
"instruction": "写夏日采莲的原创唐诗",
"output": "《采莲》n夏日荷塘翠色连,采莲女子笑开颜。n轻舟荡破琉璃镜,玉手摘来玛瑙盘。n歌彻云霄惊白鹭,笑盈水面动红蕖。n归来满载斜阳里,一路清香伴月还。"
},
# ... 更多四季诗(共40首)
]
training_data.extend(seasons_poems)
training_data.extend(additional_seasons)
# ==================== 山水田园 (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自古英豪争渡处,今朝更显风流稠。"
},
{
"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愿作溪中一卵石,长听天籁自悠悠。"
},
# ... 更多山水田园诗(共30首)
]
training_data.extend(landscape_poems)
# ==================== 抒情言志 (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他日功成名就时,为民造福显荣光。"
},
{
"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从今愿作长相聚,莫再分离各西东。"
},
# ... 更多抒情言志诗(共35首)
]
training_data.extend(emotional_poems)
# ==================== 边塞风云 (25首) ====================
frontier_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为国守疆无怨悔,丹心一片照天罡。"
},
# ... 更多边塞诗(共25首)
]
training_data.extend(frontier_poems)
# ==================== 咏物寄情 (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但得人生常尽欢,莫教金樽空对月。"
},
{
"instruction": "创作咏松的原创唐诗",
"output": "《咏松》n峭壁悬崖一老松,风霜雨雪仍从容。n根深不怕狂风动,干正何忧暴雨冲。n四季常青显劲节,千年不朽见贞忠。n愿学青松坚毅志,艰难困苦亦豪雄。"
},
{
"instruction": "写咏菊的原创唐诗",
"output": "《咏菊》n秋深百卉尽凋残,唯有菊花傲霜寒。n金甲满披香益远,玉肌微露色尤丹。n不随桃李争春艳,独伴松梅耐岁寒。n愿效黄花晚节香,老当益壮志如磐。"
},
{
"instruction": "创作咏兰的原创唐诗",
"output": "《咏兰》n空谷幽兰独自芳,不因无人减馨香。n素心一点含雅韵,翠叶数茎带露光。n羞与群葩争艳丽,乐同君子论文章。n愿学兰花高洁品,远离尘俗守清芳。"
},
{
"instruction": "写咏剑的原创唐诗",
"output": "《咏剑》n龙泉出匣寒光闪,百炼千锤始铸成。n斩妖除魔凭正气,安邦定国靠精诚。n匣中夜夜鸣不已,世上时时待不平。n愿借三尺青锋剑,扫尽人间邪恶情。"
},
# ... 更多咏物诗(共30首)
]
training_data.extend(object_poems)
# ==================== 节日时令 (20首) ====================
festival_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但愿有情成眷属,莫教离别恨迢迢。"
},
# ... 更多节日诗(共20首)
]
training_data.extend(festival_poems)
print(f" 创建了 {len(training_data)} 首高质量唐诗训练数据")
return training_data
def setup_lora(self):
"""配置LoRA"""
lora_config = LoraConfig(
r=16, # 适当增加秩
lora_alpha=32,
target_modules=["q_proj", "v_proj", "k_proj", "o_proj"],
lora_dropout=0.1, # 降低dropout
bias="none",
task_type="CAUSAL_LM"
)
self.model = get_peft_model(self.model, lora_config)
self.model.print_trainable_parameters()
return self.model
def prepare_dataset(self, training_data):
"""准备训练数据集"""
print(" 处理训练数据...")
def format_example(example):
return {
"text": f"请创作一首唐诗:{example['instruction']}nn作品:{example['output']}"
}
dataset = Dataset.from_list(training_data)
formatted_dataset = dataset.map(format_example)
def tokenize_function(examples):
return self.tokenizer(
examples["text"],
truncation=True,
padding="max_length",
max_length=400,
return_tensors=None
)
tokenized_dataset = formatted_dataset.map(
tokenize_function,
batched=True,
remove_columns=formatted_dataset.column_names
)
print(" 数据预处理完成")
return tokenized_dataset
def train(self):
"""执行训练"""
print(" 开始训练...")
# 设置训练参数
training_args = TrainingArguments(
output_dir="./tang_poetry_lora",
per_device_train_batch_size=2,
gradient_accumulation_steps=1,
learning_rate=2e-4, # 优化学习率
num_train_epochs=20, # 充分训练
logging_steps=5,
save_steps=50,
# 优化配置
warmup_steps=50,
weight_decay=0.01,
lr_scheduler_type="cosine",
max_grad_norm=1.0, # 梯度裁剪
remove_unused_columns=False,
dataloader_pin_memory=False,
report_to=[],
)
data_collator = DataCollatorForLanguageModeling(
tokenizer=self.tokenizer,
mlm=False
)
tokenized_dataset = self.prepare_dataset(self.create_training_data())
trainer = Trainer(
model=self.model,
args=training_args,
train_dataset=tokenized_dataset,
data_collator=data_collator,
)
print(" 开始模型训练...")
train_result = trainer.train()
# 保存模型
trainer.save_model()
print(" 训练完成!模型已保存")
return train_result
def generate_poem(self, instruction, max_retry=3):
"""生成诗歌(带重试机制)"""
for attempt in range(max_retry):
try:
prompt = f"请创作一首唐诗:{instruction}nn作品:"
inputs = self.tokenizer(prompt, return_tensors="pt", max_length=200, truncation=True)
with torch.no_grad():
outputs = self.model.generate(
**inputs,
max_new_tokens=150,
temperature=0.7, # 适中温度
do_sample=True,
top_p=0.9,
top_k=40,
repetition_penalty=1.3, # 防止重复
no_repeat_ngram_size=3,
pad_token_id=self.tokenizer.eos_token_id,
eos_token_id=self.tokenizer.eos_token_id,
early_stopping=True,
num_return_sequences=1
)
full_text = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取诗歌部分
if "作品:" in full_text:
poem = full_text.split("作品:")[-1].strip()
else:
poem = full_text
# 质量检查
if self._check_poem_quality(poem):
return poem
else:
print(f" 第{attempt+1}次生成质量不佳,重试...")
except Exception as e:
print(f" 生成出错: {e}")
return "生成失败,请调整参数重试"
def _check_poem_quality(self, poem):
"""检查诗歌质量"""
if not poem or len(poem) < 10:
return False
lines = poem.strip().split('n')
if len(lines) < 2:
return False
# 检查是否有严重重复
if len(set(lines)) < len(lines) * 0.5:
return False
return True
def comprehensive_test(self):
"""全面测试"""
print("n" + " 全面测试 ".center(50, "="))
test_cases = [
"春日游园",
"夏日荷塘",
"秋日登高",
"冬日赏雪",
"山水风光",
"思乡之情",
"友谊长存",
"咏梅品格"
]
for i, theme in enumerate(test_cases, 1):
print(f"n测试 {i}: {theme}")
poem = self.generate_poem(theme)
print(f"生成结果:n{poem}")
# 质量评估
lines = poem.strip().split('n')
if len(lines) >= 4 and len(set(lines)) >= 3:
quality = " 质量良好"
elif len(lines) >= 2:
quality = "️ 质量一般"
else:
quality = " 需要优化"
print(f"质量评估: {quality}")
print("-" * 40)
def explain_poem(self, poem):
"""调用模型解释诗句内容,仅输出对诗句场景的说明"""
if not poem or len(poem.strip()) == 0:
return "无诗句可解释"
try:
# 临时加载原始模型(非微调模型)
original_model = AutoModelForCausalLM.from_pretrained(
self.local_model_path2,
trust_remote_code=True,
torch_dtype=torch.float32,
device_map=self.device
)
prompt = (
"请用一段现代汉语解释以下诗句中呈现的场景,200字以内"
"仅描述画面,不要分析情感或扩展其他内容:nn"
f"【诗句】n{poem}n"
"【解释】"
)
inputs = self.tokenizer(prompt, return_tensors="pt", max_length=200, truncation=True)
with torch.no_grad():
outputs = original_model.generate(
**inputs,
max_new_tokens=200, # 限制生成长度
temperature=0.3, # 进一步降低随机性
do_sample=True,
top_p=0.7,
repetition_penalty=1.5, # 减少重复内容
eos_token_id=self.tokenizer.eos_token_id,
early_stopping=True,
)
explanation = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
# 严格清理:仅保留【解释】后的内容,并去除无关文本
explanation = explanation.split("【解释】")[-1].strip()
explanation = re.sub(r"n|" # 去除换行和无关符号
r"Human:.*|Assistant:.*|"
r"A:.*|B:.*|" # 去除对话标记
r"d{4}年.*|谢谢.*|请问.*",
"", explanation)
return explanation if explanation else "解释生成失败"
except Exception as e:
return f"解释失败:{e}"
explanation = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
print(f"解释结果:n{explanation}")
# 严格清理:仅保留【解释】后的内容,并去除无关文本
explanation = explanation.split("【解释】")[-1].strip()
explanation = re.sub(r"n|" # 去除换行和无关符号
r"Human:.*|Assistant:.*|"
r"d{4}年.*|谢谢.*|请问.*",
"", explanation)
return explanation if explanation else "解释生成失败"
except Exception as e:
return f"解释失败:{e}"
outputs = original_model.generate(
**inputs,
max_new_tokens=150,
temperature=0.5,
do_sample=True,
top_p=0.8,
repetition_penalty=1.25,
no_repeat_ngram_size=3,
pad_token_id=self.tokenizer.eos_token_id,
eos_token_id=self.tokenizer.eos_token_id,
early_stopping=True,
)
explanation = self.tokenizer.decode(outputs[0], skip_special_tokens=True)
explanation = re.sub(r"Human:.*|Assistant:.*|(.*", "", explanation).strip()
print(f"解释结果:n{explanation}")
# 清理输出
lines = [l.strip() for l in poem.split('n') if l.strip()]
for l in lines:
if len(l) > 0:
explanation = explanation.replace(l, "")
# 去掉书名号标题
explanation = re.sub(r"《[^》]+》", "", explanation)
# 归一化为单段
explanation = re.sub(r"s+", " ", explanation.replace("n", " ")).strip()
# 兜底:若仍为空,给通用解释
if len(explanation) < 30:
explanation = "这首诗通过典型意象与场景的描写,传达了作者的情感取向与审美趣味,借景抒情、以物寄意,形成含蓄而悠远的意境,读来清新自然、韵味绵长。"
return explanation
except Exception as e:
return f"解释失败:{e}"
def build_gradio(self):
"""构建Gradio界面:主题选择 + 简单描述(留空则默认),生成诗句与单段解释"""
def generate(theme, desc, need_explain):
theme_map = {
"四季变换": "春夏秋冬轮换",
"山水田园": "山水田园风光",
"抒情言志": "抒情言志",
"边塞风云": "边塞风云",
"咏物寄情": "咏物寄情",
"节日时令": "节日时令"
}
default_desc = {
"四季变换": "描写春夏秋冬气候与景物变迁,表现生命轮回的韵律。",
"山水田园": "借青山碧水与田园劳作,抒写恬淡宁静的生活情趣。",
"抒情言志": "直接抒发内心情感与志向,表达人生理想与感怀。",
"边塞风云": "描绘边关沙场与将士风骨,展现家国情怀与戍边艰辛。",
"咏物寄情": "托物言志,通过梅竹松菊等意象寄寓品格与情怀。",
"节日时令": "围绕传统节令习俗与人情世事,书写团圆、追忆与祈愿。"
}
base = theme_map.get(theme, theme)
desc_text = (desc or "").strip() or default_desc.get(theme, "")
instruction = f"主题:{base}。简述:{desc_text}"
poem = self.generate_poem(instruction)
explanation = self.explain_poem(poem) if need_explain else "(未选择解释)"
return poem, explanation
dropdown = gr.Dropdown(choices=["四季变换","山水田园","抒情言志","边塞风云","咏物寄情","节日时令"], label="主题")
textbox = gr.Textbox(lines=2, placeholder="例如:春雨、荷塘、思乡、咏梅等简要描述(留空则使用默认)", label="简单描述")
checkbox = gr.Checkbox(label="生成解释", value=True)
output_poem = gr.Textbox(lines=8, label="生成诗句")
output_exp = gr.Textbox(lines=6, label="诗句解释(单段)")
iface = gr.Interface(
fn=generate,
inputs=[dropdown, textbox, checkbox],
outputs=[output_poem, output_exp],
title="唐诗生成器(LoRA微调)",
description="选择主题并可填写简述;留空则使用默认描述。解释仅输出一段现代汉语说明。"
)
return iface
def main():
"""主函数"""
print(" 唐诗LoRA微调系统启动")
# 解析命令行参数
parser = argparse.ArgumentParser()
parser.add_argument("--skip-training", action="store_true", help="已训练模型时跳过训练,直接测试")
args = parser.parse_args()
# 初始化训练器
# trainer = TangPoetryTrainer(skip_training=args.skip_training)
trainer = TangPoetryTrainer(skip_training=True)
if not trainer.skip_training:
# 正常流程:加载基座模型与LoRA并训练
trainer.setup_model()
trainer.setup_lora()
trainer.train()
else:
# 跳过训练:直接加载已训练模型
print(" 跳过训练,直接加载已训练模型进行测试")
trainer.load_trained_model("./tang_poetry_lora")
# 启动Gradio界面
iface = trainer.build_gradio()
iface.launch(server_name="0.0.0.0", share=False)
print("n 程序执行完成!")
if __name__ == "__main__":
main()