构建高质量古诗词数据集:赋能AI大模型预训练与微调实践

构建高质量古诗词数据集:赋能AI大模型预训练与微调实践 简介本资源是一套面向大语言模型训练与古诗文NLP任务的高质量中文古诗词数据集覆盖先秦至现代逾两千年的经典文本专为LLM预训练、微调及诗词生成等场景优化。压缩包共123.72MB包含结构化文本文件如唐诗、宋词、花间集、纳兰性德词、曹操诗集等子集所有数据均经人工校勘与标准化处理统一标点、修正异体字与OCR错误如“愚千慮切”→“愚衷千虑切”、补全节选内容、规范标题格式如《木兰花·令拟古决绝词》→《木兰花令·拟古决绝词》、剔除冗余注释与无效条目。已有378人学习下载适用于需要高精度古诗语料的研究者、算法工程师及AI开发者可直接用于构建诗词微调数据集、评估模型古文理解能力或开发古诗生成/赏析应用。1. 项目概述一份为AI大模型“喂食”的古典诗词盛宴最近在整理手头的古籍资料准备给几个语言模型做微调实验发现市面上公开的古诗词数据集要么质量参差不齐要么格式混乱要么就是覆盖的朝代和诗人不够全面。对于想训练一个真正懂点“风雅”的AI来说这简直是“巧妇难为无米之炊”。于是我花了几个月时间把自己收藏和整理的资料系统性地梳理了一遍最终打包成了这个“先秦到现代古诗词数据集大模型高质量数据说明-最新整理.zip”。这个数据集的核心目标非常明确为AI大模型特别是中文大语言模型LLM的预训练、指令微调SFT或强化学习RLHF阶段提供一份高质量、高纯度、结构化的古典诗词语料。它不仅仅是一个简单的文本合集而是从数据清洗、格式统一、元信息标注到应用场景设计都为大模型训练量身定制的“营养套餐”。无论你是想训练一个能对答如流的“AI诗人”一个能精准赏析的“AI评论家”还是一个能辅助创作的“AI灵感助手”这份数据集都能提供一个坚实、干净的起点。2. 数据集核心设计与构建思路拆解2.1 数据源筛选与质量把控宁缺毋滥构建高质量数据集的第一步也是最重要的一步就是源头把控。网络上流传的古诗词文本常见问题包括异体字、繁简混杂、标点符号不规范、存在大量现代注释和赏析文字混入、同一首诗有多个版本。这些问题对于人类阅读或许影响不大但对于逐字逐句“学习”的大模型来说就是严重的“噪声”会导致模型学到错误的知识或混乱的语法。我的筛选原则是“权威底本 交叉校验”核心底本优先采用中华书局、上海古籍出版社等权威机构出版的校勘本电子资源作为主数据源。例如先秦部分以《诗经》程俊英校注本、《楚辞》洪兴祖补注本为基准。版本校验对于唐宋等诗词鼎盛时期同一首诗在不同选本中可能有细微差别。我会以《全唐诗》、《全宋词》这类大型总集为基准同时参考诗人别集的主流现代校注本进行比对选取最通行、最可靠的版本。文本净化彻底清除所有现代人的注释、赏析、评点文字。确保数据集中每一行都是纯粹的古代原文。对于必要的标点统一采用现代中文标点逗号、句号、问号等进行断句便于模型理解句读。注意这里有一个关键取舍。完全去除注释虽然保证了文本的“纯净”但也丢失了语义关联信息。因此在元数据字段中我通过“题材”、“关键词”等标签部分地弥补了这种语义信息的缺失为模型提供理解上下文的结构化线索。2.2 数据结构化让机器读懂“诗”的上下文一份优秀的AI训练数据必须是结构化的。简单堆砌诗文就像把一堆食材胡乱扔进锅里模型很难从中提取出有效的模式Pattern。我为每一条诗词数据设计了以下核心字段{ “id”: “T001_001”, “dynasty”: “唐”, “author”: “李白”, “title”: “静夜思”, “content”: “床前明月光疑是地上霜。举头望明月低头思故乡。”, “genre”: “诗”, // 体裁诗、词、曲、赋等 “sub_genre”: “五言绝句”, // 子体裁 “theme”: [“思乡”, “月亮”, “羁旅”], // 题材标签 “keywords”: [“明月”, “故乡”, “霜”], // 关键词 “collection”: “李太白全集”, // 出处 “notes”: “此诗版本以《李太白全集》清王琦注本为据。” // 版本备注 }为什么需要如此细致的结构化朝代dynasty和作者author让模型学习文学史脉络和诗人风格。模型可以隐式地学到“李白”和“杜甫”的风格差异或者“唐诗”与“宋词”的整体风貌区别。体裁genre/sub_genre这是古典诗词的“格律密码”。五言绝句、七言律诗、词牌名如“沁园春”、“水调歌头”本身就有强烈的格式约束。标注这些信息能极大地帮助模型掌握不同文体的格律、平仄和字数规则。题材theme和关键词keywords这是理解诗词内容的“语义钥匙”。当模型在微调阶段被问到“写一首关于思乡的诗”它可以通过检索theme包含“思乡”的训练样本更精准地生成相关内容。关键词则提供了更细粒度的意象关联。2.3 时间跨度与内容覆盖从源头到流变“先秦到现代”这个范围很广我的划分标准如下先秦两汉以《诗经》、《楚辞》、汉乐府、古诗十九首为核心。这部分是源头语言古朴意象深远是训练模型理解比兴、典故的基础。魏晋南北朝涵盖三曹、陶渊明、谢灵运等重点在于山水诗、田园诗的兴起和五言诗的成熟。隋唐五代数据集的绝对重心。全唐诗人基本覆盖重点突出李、杜、王、孟、白、李商隐等大家并包含敦煌曲子词等早期词作。宋辽金宋词的全盛期苏、辛、柳、李清照等大家词作完备。同时不忽略宋诗如苏轼、陆游。元明清元曲散曲、剧曲选段、明清诗词。这部分选取标准更严侧重名家名篇避免良莠不齐。近现代指晚清至民国时期运用传统格律创作的诗词如秋瑾、鲁迅、毛泽东等人的作品。这部分数据用于探索古典形式与现代思想的结合。这样的覆盖确保了数据集不仅能训练模型掌握诗词格律还能让其感知到文学风格的历时性演变。3. 数据预处理与清洗的核心技术细节3.1 文本清洗的“硬骨头”编码、异体字与标点原始文本的混乱超乎想象清洗过程是体力活更是技术活。字符编码统一与繁简转换所有文本强制转换为UTF-8编码。对于繁体字我采用OpenCC工具包进行“繁体到简体”的转换但这里有一个重要策略对于人名、地名、特定典故用字建立白名单予以保留。例如“乾”在表示“乾坤”时转为“干”简体但在年号“乾隆”中则保留为“乾”。这需要结合历史知识建立规则库。异体字与通假字处理这是最耗时的部分。例如“著”和“着”“于”和“於”“云”和“雲”。我的原则是对于明确的古今字、异体字统一转换为现代标准字形依据《通用规范汉字表》。但对于诗词中因押韵、平仄而使用的通假字则予以保留因为这是古典诗词的重要特征。例如“早知潮有信嫁与弄潮儿”中的“信”不能改为“讯”。标点符号规范化去除所有全角空格、不规则空格如nbsp;。将诗句结尾的句号、逗号统一。多数情况一联内用逗号联末和诗末用句号。去除所有引号、书名号诗题已在独立字段因为模型训练时这些符号在连续文本中可能产生干扰。词作中上下阕之间用空行分隔这为模型提供了结构提示。3.2 元数据标注半自动化与人工校验的结合手动为数万首诗词标注题材、关键词是不现实的。我采用**“关键词提取规则过滤人工审核”**的流水线初筛使用jieba分词和TF-IDF算法从每首诗词的正文中提取高频实词名词、动词、形容词。规则过滤建立一个包含“明月”、“春风”、“青山”、“流水”、“孤舟”、“断肠”等数百个古典诗词常见意象的词库。将提取出的词与词库匹配初步生成keywords列表。题材theme归类我预先定义了一个两级题材分类体系如“抒情 - 思乡”、“写景 - 山水”、“咏物 - 咏梅”、“边塞 - 战争”等。训练一个简单的文本分类模型如基于BERT对诗词进行初步题材分类。人工审核与修正前两步的结果会有大量误差。例如算法可能把“长安”地名当作关键词或把一首表面写景实则抒怀的诗误分为“写景”。这就需要逐首抽查特别是对名家名篇进行精细校准。这个过程虽然慢但决定了数据的最终质量。实操心得不要追求全自动。算法能解决80%的问题但剩下20%的“脏活累活”才是区分数据集优劣的关键。对于核心篇目必须人工逐字核对。我建立了一个“争议案例库”记录下那些模棱两可的标注供后续迭代参考。4. 数据集在AI大模型训练中的核心应用场景4.1 场景一预训练语料补充——提升模型的“文学素养”当前主流大模型的预训练语料虽然海量但多以现代网页、新闻、百科为主古典诗词的占比和精度都严重不足。这导致模型在涉及古文、诗词时常常出现事实性错误张冠李戴、格律错误平仄不通、或生成现代白话打油诗。使用方法将本数据集以一定比例例如5%-10%混合到模型的原始预训练语料中。由于数据已经过清洗和标准化可以直接进行tokenize分词/分字。这个过程能显著增强模型对以下方面的“感知”古汉语词汇与句法让模型熟悉“之乎者也”的用法、文言句式。诗词格律与节奏通过大量接触五言、七言、词牌模型能内化其字数、断句和韵律模式。古典意象体系让“明月”、“杨柳”、“孤帆”、“浊酒”等意象及其常见情感关联成为模型知识的一部分。4.2 场景二指令微调SFT——打造专业的“诗词AI”这是本数据集最直接、最有效的应用场景。我们可以构建高质量的指令-输出对专门训练模型完成与诗词相关的任务。指令数据构建示例{ “instruction”: “请扮演诗人李白以他的口吻创作一首描写庐山瀑布的七言绝句。”, “input”: “”, “output”: “日照香炉生紫烟遥看瀑布挂前川。飞流直下三千尺疑是银河落九天。” } { “instruction”: “赏析下面这首词的情感与艺术特色。”, “input”: “《江城子·乙卯正月二十日夜记梦》 十年生死两茫茫不思量自难忘...”, “output”: “此词为苏轼悼念亡妻之作。上阕写实抒发生死相隔的沉痛...下阕记梦虚实结合‘相顾无言惟有泪千行’真挚感人...全词语言朴素如话情感却深挚绵长是婉约词中的绝唱。” } { “instruction”: “根据以下关键词生成一首符合《浣溪沙》词牌的作品。”, “input”: “关键词暮春、落花、微雨、闲愁”, “output”: “一曲新词酒一杯去年天气旧亭台。夕阳西下几时回无可奈何花落去似曾相识燕归来。小园香径独徘徊。” }通过成千上万条这样的高质量指令对进行微调模型就能学会按特定要求创作诗词、进行风格模仿、完成诗词赏析、翻译文白对译、对联、根据意境补全诗句等一系列专业能力。4.3 场景三检索增强生成RAG——构建精准的“诗词知识库”我们可以将本数据集向量化构建一个专用的古典诗词向量数据库。当用户提问时先从这个数据库中检索出最相关的诗词原文和元数据再将它们作为上下文Context提供给大模型让模型基于这些准确信息生成答案。技术流程向量化使用text-embedding模型如BGE、M3E将每首诗词的“标题作者正文”编码为向量。建库将向量存入ChromaDB、Milvus或FAISS等向量数据库。检索用户提问“有哪些描写秋天悲凉的诗句”将问题也向量化在库中检索theme包含“悲秋”或keywords包含“秋风”、“落叶”且情感倾向相似的诗词。生成将检索到的TOP-K首诗词如“杜甫《登高》‘万里悲秋常作客...’”、“马致远《天净沙·秋思》‘枯藤老树昏鸦...’”连同元数据一起插入到大模型的提示词中指令其进行总结或赏析。这种方法能极大缓解大模型的“幻觉”问题确保它给出的诗句、作者、朝代等信息100%准确非常适合构建问答系统或教学工具。4.4 场景四对比学习与偏好优化——让模型懂得“诗的好坏”我们可以利用数据集的结构化信息构建用于对比学习Contrastive Learning或直接偏好优化DPO的数据。正负例构建选择同一题材如“咏梅”的两首诗一首是公认的佳作如陆游《卜算子·咏梅》一首是艺术水准较低的作品或随机打乱格律生成的“诗”。让模型学习区分高下。风格偏好给出李白的“豪放飘逸”诗句和杜甫的“沉郁顿挫”诗句作为对比训练模型捕捉风格差异。格律纠正给出一个符合平仄的七律例句和一个故意出律的例句让模型学会判断格律的正确性。通过这些精细化的训练模型不仅能“写诗”更能写出“好诗”并具备初步的审美判断能力。5. 使用本数据集的实操步骤与避坑指南5.1 环境准备与数据加载假设你使用Python和Hugging Face生态进行开发。# 1. 解压数据 unzip 先秦到现代古诗词数据集大模型高质量数据说明-最新整理.zip # 解压后你会看到 # - poems.jsonl (主数据文件每行一个JSON对象) # - README.md (详细的数据字段说明、统计信息) # - dynasty_author_stats.csv (朝代、诗人分布统计) # - theme_keyword_list.txt (题材和关键词列表) # 2. 安装必要库 pip install pandas jsonlines transformers torch# 3. 加载数据示例 import jsonlines import pandas as pd data [] with jsonlines.open(‘poems.jsonl’) as reader: for obj in reader: data.append(obj) df pd.DataFrame(data) print(f“数据集总量{len(df)} 首”) print(f“朝代分布\n{df[‘dynasty’].value_counts().head()}) print(f“热门诗人\n{df[‘author’].value_counts().head()})5.2 针对不同训练目标的预处理策略用于预训练Continual Pretraining# 简单拼接文本构建纯文本语料 def build_pretrain_text(record): # 格式 [朝代]作者《标题》正文 text f“[{record[‘dynasty’]}]{record[‘author’]}《{record[‘title’]}》{record[‘content’]}” return text corpus df.apply(build_pretrain_text, axis1).tolist() # 然后将corpus列表与其他语料混合进行tokenize和训练。用于指令微调SFT 你需要根据第4.2节的思路构建自己的指令数据集。这里给出一个转换示例sft_data [] for _, row in df.iterrows(): # 示例1创作指令 instruction f“请模仿{row[‘author’]}的风格创作一首关于{‘、’.join(row[‘theme’][:2])}的{row[‘sub_genre’]}。” output row[‘content’] sft_data.append({“instruction”: instruction, “input”: “”, “output”: output}) # 示例2赏析指令 (可抽样部分名篇) if row[‘author’] in [‘李白’, ‘杜甫’, ‘苏轼’, ‘李清照’]: # 名家名篇 instruction f“请赏析{row[‘author’]}的《{row[‘title’]}》。” # 这里需要你预先准备好或调用大模型生成赏析文本作为output # output get_appreciation(row[‘content’]) # sft_data.append({...})用于RAG构建向量库from sentence_transformers import SentenceTransformer import chromadb # 初始化模型和客户端 model SentenceTransformer(‘BAAI/bge-large-zh-v1.5’) chroma_client chromadb.PersistentClient(path“./poem_vector_db”) collection chroma_client.create_collection(name“classical_poems”) # 准备文档和元数据 documents [] metadatas [] ids [] for i, row in df.iterrows(): # 将关键信息拼接成文档 doc_text f“{row[‘title’]}作者{row[‘author’]}朝代{row[‘dynasty’]}。{row[‘content’]}” documents.append(doc_text) metadatas.append({ “dynasty”: row[‘dynasty’], “author”: row[‘author’], “theme”: “,”.join(row[‘theme’]), “keywords”: “,”.join(row[‘keywords’]) }) ids.append(str(i)) # 生成向量并入库 embeddings model.encode(documents).tolist() collection.add( embeddingsembeddings, documentsdocuments, metadatasmetadatas, idsids )5.3 训练过程中的关键参数与技巧学习率Learning Rate在预训练或SFT中引入古典数据时建议使用较小的学习率例如比基础学习率小5-10倍进行温和的增量训练避免灾难性遗忘Catastrophic Forgetting。例如基础LR是2e-5对诗词数据可以设为5e-6。数据混合比例在预训练中诗词数据的比例不宜过高建议从1%开始逐步增加到5%观察验证集上古文相关任务的表现同时监控模型在现代汉语任务上的性能是否下降。损失函数对于SFT标准的交叉熵损失即可。对于DPO训练则需要精心构建偏好对chosen/rejected并使用DPO特有的损失函数。评估指标除了常规的困惑度PPL应设计专项评估集格律正确率自动检测生成诗词的平仄、押韵、对仗是否符合规则。意象相关性计算生成文本的关键词与指令要求的关键词之间的相似度。人工评估最重要的环节。邀请对古典文学有了解的人从“意境”、“格律”、“语言”、“创新性”等维度进行打分。6. 常见问题、挑战与解决方案实录6.1 数据质量问题与应对问题1同一首诗存在多个版本如何选择现象例如杜牧《清明》有“清明时节雨纷纷”和“清明雨纷纷”两种开头。解决方案遵循“从众从善”原则。优先选择最广为流传、被权威教材收录的版本。在数据集的notes字段中注明版本依据。对于差异较大的异文可以考虑以一条数据为主在备注中列出重要异文。问题2部分诗词作者存疑或佚名。现象如《金缕衣》劝君莫惜金缕衣作者常标“杜秋娘”或“无名氏”。解决方案在author字段中标注最通行的说法如“杜秋娘”同时在notes中说明“一说为无名氏作”。保持字段一致性避免空值。问题3题材theme标注存在主观性。现象一首诗可能同时包含“山水”、“隐逸”、“哲理”多种元素。解决方案允许theme字段为列表并设置优先级。通常标注1-3个最核心的题材。建立明确的《题材标注指南》例如以诗歌的主要情感或表达重心为准。6.2 模型训练中的典型“翻车”现场问题1模型生成“缝合怪”或“张冠李戴”。现象指令“写一首李白风格的山水诗”模型生成“床前明月光疑是地上霜。飞流直下三千尺孤帆远影碧空尽。”混搭了《静夜思》、《望庐山瀑布》、《送孟浩然之广陵》。原因分析SFT数据质量不高或模型在预训练阶段记忆了诗句但未理解“风格”是整体性的概念只是进行了字词的简单组合。解决思路强化指令在指令中更明确地要求“创作一首全新的诗”而非“输出诗句”。改进数据在SFT数据中增加对“模仿风格”的正面和反面示例。正面示例是整首的风格模仿反面示例就是这种诗句拼贴。后处理过滤设计规则检查生成结果是否直接抄袭了训练集中的大段原文。问题2模型严守格律但意境全无。现象生成的七律平仄完全正确对仗工整但词汇陈腐意象堆砌读起来像“诗词格律练习软件”的输出。原因分析模型过于关注局部特征字词搭配、平仄模式缺乏对整体意境、情感连贯性的把握。这通常是因为训练数据中缺乏对“好诗”的深层理解信号。解决思路引入DPO/RLHF使用人工标注或模型打分对生成的诗歌进行优劣排序训练模型学习“好”的标准不仅仅是格律还有新颖性、连贯性和感染力。丰富上下文在指令中提供更详细的背景、情感要求或画面描述而不仅仅是“写一首X题材的Y体裁诗”。融合现代语料在SFT阶段适当加入一些优秀的现代诗歌或诗评让模型接触更多元的表达方式避免陷入古典词汇的僵化组合。问题3处理长诗词如《长恨歌》、《春江花月夜》时效果差。现象模型生成到后半部分容易跑题、重复或逻辑断裂。原因分析大模型的上下文长度Context Length有限且注意力机制在超长文本上可能衰减。模型难以维持贯穿全篇的叙事线索或情感基调。解决思路分块训练与生成对于长诗在训练和生成时可以按意义段落如四句一联进行分块并为每块提供前文摘要或主题提示帮助模型保持连贯。使用更长上下文模型优先选择支持更长上下文如128K的模型架构进行微调。结构化提示生成时先让模型输出一个“提纲”或“情感脉络”再分段填充内容。6.3 工程实践中的避坑技巧内存与算力全量数据集可能包含数万甚至数十万首诗在向量化或训练时注意分批处理batch processing。使用Hugging Face Datasets库的流式加载功能可以有效管理内存。版本控制数据集、训练脚本、模型checkpoint务必做好版本管理。记录下每次实验使用的数据版本、超参数和结果便于回溯和比较。从小规模开始不要一开始就用全量数据训练一个大模型。先用一个小的子集如唐诗部分在一个小模型如ChatGLM-6B或Qwen-7B上跑通整个SFT或RAG流程验证方案可行性再扩展到全量和更大模型。重视评估古典诗词生成的质量评估非常主观。除了自动化的格律检查一定要设计人工评估环节。可以制定一个简单的评分表1-5分找多位评测者最好有文学背景进行双盲评测计算平均分和一致性。这份数据集的整理本身就是一个不断与历史文本、算法局限和工程细节“较劲”的过程。最终的目标是希望它能成为一座连接古典文学与人工智能的可靠桥梁让冰冷的代码也能触摸到千年前的温度与韵律。在实际使用中你会发现它或许仍有瑕疵但希望它精心设计的结构和纯净的内容能为你节省大量数据准备的时间让你更专注于模型算法和上层应用的探索。本文还有配套的精品资源点击获取