简介面向大模型训练、NLP研究与中文古典文学数字化应用的先秦至现代古诗词数据集内容覆盖全唐诗、宋词三百首、花间集、纳兰性德词等重要诗词集合适合用于LLM微调、语料构建和古诗文信息抽取等场景。压缩包整体约123.72MB内含按诗人/诗集组织的数据文件、可选data2扩展数据及配套说明文档便于快速定位所需语料。已有382人学习/下载。数据在原始poet.tang、poet.song等来源基础上做了系统清洗包括删除多余标点与注释、修正错字如“心意怀豫”改为“心意怀犹豫”、“雕弓ㄇ柳”改为“雕弓笮柳”、补全节选、调整标题格式等并对部分存在争议的作品做了标注处理。借助这份整理好的数据可直接用于模型训练、文本分析或诗词知识库构建减少大量脏数据清理成本。1. 古诗词数据集和大模型训练先说清楚这份资源能解决什么做大模型微调的人大概率都遇到过这种场景手里缺优质中文语料去开源社区拖回来的所谓“古诗词数据集”打开一看要么是爬虫抓的裸文本要么是几千首重复了十七八遍的“床前明月光”。数据清洗比写训练代码还耗时最后微调出来的模型写诗一股子“百度百科”味。这份“先秦到现代古诗词数据集大模型高质量数据说明-最新整理.zip”定位就是把这个环节省掉——从诗经到现代诗按朝代、作者、体裁、内容做了结构化整理适合直接进 SFT 流程也可以切出来做预训练语料扩充。目标用户很明确做中文 LLM 微调、跑古诗词生成实验、或者搞文本续写评测的算法工程师和研究生。2. 数据构成与预处理把语料拆成能直接训练的结构2.1 时间跨度与体裁分布为什么“高质量”先体现在分类上拿到数据集先把目录结构和文件清单过一遍我的习惯是用tree或者直接解压后看 JSON 文件的顶层字段。先看一个典型的样本结构{ title: 静夜思, dynasty: 唐, author: 李白, genre: 五言绝句, content: 床前明月光疑是地上霜。举头望明月低头思故乡。, tags: [思乡, 月, 羁旅], source: 全唐诗 }这个结构里我对genre字段最敏感它决定了后续微调时怎么构造指令。常见的genre取值包括诗经体、楚辞体、乐府、五言绝句、七言律诗、词牌名、散曲、现代诗等。tags字段是加分项做风格迁移或主题生成时可以直接当 prompt 的一部分。source字段大多标记了原始出处全唐诗、全宋词、古诗文网之类清洗时可以用来做去重和溯源。预处理时优先做三件事第一是统一换行符和空格Windows 环境下写字板编辑过的文本经常混入\r\n训练时多出来一个\r会让 Tokenizer 产生大量无效 token 碎片第二是繁体统一转简体这是老生常谈但要注意的是转简之后再用字形相似度去重的效果会好一截第三是诗歌内容按句切分相邻两行之间保留换行符而不是用逗号或句号保证模型续写时换行逻辑是学出来的而不是被格式强制的。2.2 把原始语料转成模型训练格式一个可复用的预处理脚本对齐字段之后给出一段预处理到训练样本的转换代码直接跑过就能作为后续指令微调的前置步骤import json import re def load_poetry_json(path: str) - list[dict]: 读取整理好的古诗词数据文件 with open(path, r, encodingutf-8) as f: return json.load(f) def clean_text(text: str) - str: 清洗脏字符和多余空白保留中文标点 text text.replace(\r, ).replace(\u3000, ) text re.sub(r[ \t], , text) text re.sub(r\n{3,}, \n\n, text).strip() return text def make_training_samples(data: list[dict]) - list[dict]: 转换为指令微调格式可对接alpaca或sharegpt模板 samples [] for item in data: title item.get(title, ) dynasty item.get(dynasty, 未知) author item.get(author, 佚名) genre item.get(genre, 诗) content clean_text(item.get(content, )) if len(content) 4: # 过滤异常短样本 continue samples.append({ instruction: f写一首{genre}风格模仿{dynasty}代诗人{author}主题围绕{title}, input: , output: content, metadata: {dynasty: dynasty, author: author, genre: genre} }) return samples # 转换并把结果落盘 data load_poetry_json(./poetry.json) samples make_training_samples(data) with open(./train_samples.jsonl, w, encodingutf-8) as f: for s in samples: f.write(json.dumps(s, ensure_asciiFalse) \n) print(f共生成 {len(samples)} 条训练样本)这段代码里instruction故意带了风格模仿{dynasty}代诗人{author}的表述这样模型能学到“朝代作者体裁”的联合条件约束而不仅仅是背内容。len(content) 4的过滤阈值是经验值数据里偶尔会有只有标题没有正文的残缺项不放进去省得训练时梯度被脏样本拉偏。metadata字段保留原始属性方便之后做多任务学习或评测时按作者、按朝代分组抽样。2.3 文件级去重防止同样的诗换个标签出现两次整理好的数据里最容易藏的问题是重复。古诗文网和全唐诗库存在大量交叉收录同一首《登鹳雀楼》可能在“唐诗”和“蒙学”两个分类下各出现一次还可能被打了不同的source。去重不能只看content的完全一致因为标点、换行、繁简转换都会造成哈希不一致。这里给出归一化去重方案import hashlib def normalize_for_dedup(text: str) - str: 去掉标点、空格和换行只保留汉字用于相似判断 return re.sub(r[^\u4e00-\u9fa5], , text) def dedup_by_content(samples: list[dict]) - list[dict]: seen set() result [] for s in samples: key normalize_for_dedup(s[output]) if len(key) 8: # 太短的文本直接保留避免误删 result.append(s) continue digest hashlib.md5(key.encode(utf-8)).hexdigest() if digest not in seen: seen.add(digest) result.append(s) return result samples dedup_by_content(samples) print(f去重后样本数: {len(samples)})这个方案把正文汉字序列做了一次 MD5等于是全词匹配去重对用字差异超过 1-2 个字的变体会放行避免把异文版本误删。实际使用中我一般保留那些content差异超过 10% 的重复诗因为它们属于“同题异文”对模型学习用词多样性反而有帮助。3. 大模型微调实战把古诗词数据送进训练管线3.1 用 LoRA 做指令微调显存不够时的标准解法古诗词数据量级一般在数万到十几万首全参微调要么显存扛不住要么容易灾难性遗忘。LoRA 是更稳的方案——冻结基座参数只训练低秩适配器。下面是在 LlamaFactory 框架下启动微调的配置片段model_name_or_path: /models/Qwen2-7B dataset: poetry_train template: qwen lora_rank: 32 lora_alpha: 64 lora_dropout: 0.05 learning_rate: 2e-4 num_train_epochs: 3 max_seq_len: 2048 per_device_train_batch_size: 4 gradient_accumulation_steps: 8 lora_target: q_proj,k_proj,v_proj,o_proj,gate_proj,up_proj,down_proj这里的lora_rank我建议 32 起步而不是常见的 8——古诗数据文本短、特征稠密rank 太小会压不住风格信息。learning_rate用 2e-4 而不是 1e-4因为数据量不够大时稍大一点的学习率能更快拟合风格分布但超过 5e-4 就容易出律诗平仄混乱的问题。max_seq_len设 2048 够用诗词最长也就《离骚》级别两千多字几乎全覆盖。3.2 基座模型选型为什么优先考虑中文基座用 LLaMA 基座做中文古诗微调容易发现一个尴尬问题英文分词器把每个汉字拆成多个 token序列长度利用率很低。我一般直接在 Qwen 或 Yi 这类中文基座上做实验它们的中文 token 效率大约能省一半序列长度同样显存能喂更多数据。如果你想硬用 LLaMA先把所有中文文本用sentencepiece重新训练一个中文词表再接嵌入层但那个工程量就不是这个数据集该背的锅了。# 验证中文基座的 token 效率 from transformers import AutoTokenizer for model_id in [Qwen/Qwen2-7B, meta-llama/Llama-2-7b-hf]: tok AutoTokenizer.from_pretrained(model_id, trust_remote_codeTrue) content 床前明月光疑是地上霜。举头望明月低头思故乡。 n_tokens len(tok.encode(content)) print(f{model_id}: {n_tokens} tokens)同样二十个汉字的诗Qwen 大约 30 个 tokenLLaMA 可能要 50 上下。差距看起来不大但在 2048 的max_seq_len限制下批量数据填充 padding 的浪费就非常明显。古诗数据集里样本短、数量多batch 里 padding 比例一旦上去训练吞吐会肉眼可见地掉。3.3 训练集与验证集划分按作者分而不是按行随机分踩过的一个典型翻车是随机划分训练集和验证集同一个作者的几十首诗训练集里有验证集里也有最后评测指标虚高。要测“模型是不是真学会了写诗”而不是“记住了李白的句子”按作者划分更科学import random from collections import defaultdict by_author defaultdict(list) for s in samples: by_author[s[metadata][author]].append(s) authors list(by_author.keys()) random.shuffle(authors) split_point int(len(authors) * 0.9) train_authors set(authors[:split_point]) eval_authors set(authors[split_point:]) train_data [s for a in train_authors for s in by_author[a]] eval_data [s for a in eval_authors for s in by_author[a]] print(ftrain: {len(train_data)}, eval: {len(eval_data)})按照作者划分以后验证集里出现的都是训练时完全没见过的作者才能看出模型是真的在学风格规律还是在背原诗。这个思路对后续做诗词风格模仿评测也成立。4. 评估与续写确认微调是否真正生效4.1 形式合规性检查平仄、押韵、句式长度判断一个微调模型写古诗有没有入门我第一个看形式而不是意境。平仄是律诗的硬约束五言绝句的固定格式是“仄仄平平仄平平仄仄平”。模型如果平仄乱来多半是基座本身的古文能力不够或训练数据里近体诗比例太低。写一个快速检查脚本def check_rhythm(poem: str) - dict: 粗略判断五言诗平仄是否正确 lines [l.strip() for l in poem.split(\n) if l.strip()] if len(lines) 2: return {valid: False, reason: 行数不足} # 简单实现取每句前四字的声调模式1平0仄按普通话切 rhythm_patterns [] for line in lines: chars [c for c in line if c ! ] tones [1 if c in 妈麻马骂吗 else 0 for c in chars[:4]] rhythm_patterns.append(tones) return {valid: True, patterns: rhythm_patterns}这只是一个粗糙的可执行版本平仄判断最理想的方式是用平水韵或广韵数据库但训练结束后先跑一遍粗筛能快速排除崩坏的输出。验证集里统计平仄合规率的目标值我认为要做到 80% 以上如果低于 60%基本能断定微调时lora_rank太低或数据量不够覆盖七言和五言的句式变化。4.2 风格相似度指标用对比模型做参考评估形式之外风格是否接近是更难自动化的维度。我一般取微调模型生成的 200 首样本和原数据集里同作者、同体裁的真实作品混在一起打成乱序后用另一个更强的模型做分类计算生成的样本被归类为“真人作品”的比例from collections import Counter def style_consistency(predictions: list[str], ground_truth: list[str]) - dict: 简单模拟——实际工程中会用更强的LLM打分器 labels [generated] * len(predictions) [real] * len(ground_truth) # 此处省略调外部模型打分的步骤思路是按朝代作者置信度归组 counted Counter(labels) return { real_detected_rate: counted[real] / len(ground_truth), generated_passed_rate: counted[generated] / len(predictions) if predictions else 0 }generated_passed_rate越高说明生成结果越“像人写的”我自己习惯的目标是 60% 到 70%再高反而要怀疑是验证集泄露了。如果做知识蒸馏风格迁移这个指标也可以作为迭代优化的奖励信号。5. 避坑与排查古诗词数据微调的五个典型问题5.1 繁体转简体后出现“重复字”或错误合并现象某个字在繁体语料里是两个不同的字如“乾”和“幹”转成简体后都变成“干”导致语义混淆模型生成的诗句经常出现用字不通。原因很多诗词数据集的原始来源是台湾或日本古籍库使用 OpenCC 等工具转换时没有处理一对多的映射关系。解决转换前先保留source和original_text字段转简后做一个回溯校验。对已经转简的文本用字频统计找出异常高频的疑似合并字人工抽检一百条即可定位。5.2 全角符号混入导致分词错误现象内容中混入了全角空格、全角逗号训练时模型的完成度突然暴跌检查数据发现标点乱成一团。原因爬虫清洗阶段漏了\u3000、\uff0c这类全角 Unicode 字符它们和正常标点不共享 token。解决def fix_fullwidth(text: str) - str: 全角逗号句号转半角全角空格删除 text text.replace(\u3000, ) text text.replace(\uff0c, ).replace(\uff1a, ) text text.replace(\uff01, ).replace(\uff1f, ) return text5.3 朝代标签不统一导致指令任务失效现象同一个诗人的诗一部分标“唐”一部分标“唐代”还有一部分标“盛唐”训练时模型把朝代当成两个完全不同的条件。原因多个来源合并时标签体系没有对齐当时直接拼接了source里的原始分类。解决写一个朝代归一化映射表把“唐代/唐/盛唐/中唐/晚唐”全部归到“唐”用字典映射做一次全量替换。之后所有样本只保留统一标签。5.4 长诗被截断导致上下文不完整现象《离骚》这种长诗在训练时超过max_seq_len直接截断后半段学不到生成时也只会输出前半段。原因max_seq_len设置太小或者没有做按段落切分的处理。解决数据预处理时按章节或按每 4 句切块拆成多个短样本每个样本保留原诗标题和作者信息。注意切块时的接缝处加上 1-2 句重叠避免语义断裂。5.5 数据集内版权与来源标记污染现象有些样本的值是“佚名”有些是“不详”还有的带着“来自公众号 xxx”这类爬虫尾巴直接作为训练数据会让模型学到奇怪的口癖。原因原始爬虫数据带推荐位、公众号和后缀说明清洗时没有做字段级过滤。解决正规化作者字段把“不详/佚名/无名氏/未知/网络”统一替换成“佚名”再写一个规则把正文中来源、微信公众号、转载等相关的噪声行整体删除。6. 进阶用法用前缀树约束格律诗的平仄生成微调之后能写出语法通顺的诗但平仄硬约束还是容易崩尤其七言律诗。我后期把前缀树和有限状态机的思路用在了推理阶段——先生成一句再做平仄校验不合格就打回重生成。class RhythmTrie: 以平仄模式为路径的前缀树用于约束生成候选 def __init__(self): self.root {} def insert(self, pattern: str, sentence: str): node self.root for ch in pattern: node node.setdefault(ch, {}) node[_sentence] sentence def search(self, prefix: str): node self.root for ch in prefix: if ch not in node: return [] node node[ch] # 返回所有匹配当前平仄前缀的候选句 result [] def dfs(n): if _sentence in n: result.append(n[_sentence]) for k, v in n.items(): if k ! _sentence: dfs(v) dfs(node) return result这个 Trie 每次推理时把数据集里所有五言、七言句子的平仄模式构建好当模型生成到第三个字时就能判断后面六个字的平仄有没有可能符合格律并把候选集缩到极小的范围。推理时我会强制重采样前 5 个候选如果平仄匹配失败就重新生成直到押韵和平仄通过。从那以后我每次做古诗生成评测都强制走一遍“形式校验 平仄 Trie 过滤”再谈意境有效把输出里的“格律胡说”比例压到 10% 以下。希望这些步骤和坑位能帮你在古诗词数据微调这条路上少走几趟弯路。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
OpenClaw工具拆解之tts+web_search:TaoToken统一Key接入与配置文件骨架 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:33:40
猪姿态检测数据集详解:从YOLO训练到行为识别落地实践 简介:在智慧养殖与计算机视觉交叉领域中,目标检测和姿态估计是理解动物行为的基础技术路径。检测模型负责定位个体,姿态估计则通过关键点或行为标签描述其动作语义,两者结合构成了行为识别系统的核心原理。高质量的数据集是训练可… · 2026/9/26 10:33:40
月入 200 万的一人公司,OpenClaw 平替工具大盘点:TaoToken 统一 Key 接入配置实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 10:33:40
小白程序员必看:收藏这份大模型实战指南,轻松构建数字员工系统! 本文介绍了企业Agent系统的四层架构,重点阐述了本体层作为“虚拟办公室”的作用,包括行业语义、公司制度、业务逻辑和Action四类内容,以及如何用七个元素组织案件信息。文章还讨论了本体层的选型与施工,以及Agent如何利用本体层高… · 2026/9/26 11:08:42
LeetCode:合并两个有序链表 题目:解题思路:1.建立一个虚拟头结点ListNode dummy,声明cur 是我们用来拼接链表的“指针尾巴”,并取空节点的指针地址赋值给cur;2.通过判断两个链表不为空,进行循环比较;3.通过循环比较两链表的值… · 2026/9/26 11:08:42
AUTOSAR CP通信栈基础:ComStack_Types核心类型解析与工程实践 1. 从一次编译报错说起:ComStack_Types到底管什么第一次接触AUTOSAR CP通信栈的人,十有八九会在某个时刻被一个看似莫名其妙的编译错误拦住。我印象很深的一次,是在集成一个CAN通信模块时,代码里引用了PduInfoType,头文… · 2026/9/26 11:08:42
代码直接变论文!MSRA同款Agent库开源,读Repo一键生成初稿:TaoToken统一Key接入配置与验证 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 11:08:42
【AUTOSAR】 Classic Platform COM 模块--从入门到放弃 【AUTOSAR】 Classic Platform COM 模块–从入门到放弃 这份材料主要依据 AUTOSAR_CP_SWS_COM.pdf(R23-11)整理,另外参考了 RTE(AUTOSAR_CP_SWS_RTE.pdf)、PDU Router(AUTOSAR_CP_TPS_ECUConfiguration.pdf… · 2026/9/26 11:08:36
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍 简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践 一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46