构建高质量古诗词数据集:从数据清洗到LLM应用实战
简介高质量数据是训练大语言模型LLM的基石尤其在垂直领域应用中至关重要。其核心原理在于通过精准、结构化的信息供给让模型学习特定领域的知识表示与生成模式。在自然语言处理任务中高质量数据能显著提升模型在指令微调SFT和检索增强生成RAG等场景下的性能与可靠性。以古诗词领域为例一个精心构建的数据集不仅包含准确的原文更需融合创作背景、赏析、标签等多维度信息形成机器可理解的语义网络。这为训练具备深度理解和创作能力的领域模型提供了关键燃料广泛应用于智能问答、内容生成和文化传承等场景。本文即聚焦于如何通过系统性的数据清洗、结构化标注与任务导向设计打造一个可直接用于LLM训练与部署的“先秦到现代古诗词数据集”为相关实践提供一套完整、可复用的解决方案。1. 项目缘起为什么我们需要一个“干净”的古诗词数据集做AI尤其是做大语言模型LLM的朋友最近应该都绕不开一个词高质量数据。无论是做预训练、指令微调SFT还是做检索增强生成RAG数据都是地基。我最近在做一个古典文学领域的垂直模型核心需求是让模型能精准理解、生成和赏析从先秦到现代的诗词。市面上能找到的古诗词数据不少但真用起来问题一大堆格式混乱、朝代作者信息缺失、重复条目多、甚至夹杂着现代网友的戏仿和错误注释。这种“脏数据”喂给模型训练出来的效果可想而知——要么胡言乱语要么知识错乱。所以当我花了大半个月时间从几十个公开数据库、古籍扫描文本、学术论文附录里一点点清洗、对齐、校验最终整理出这个“先秦到现代古诗词数据集大模型高质量数据”时感觉就像给混乱的图书馆做了一次彻底的编目。这个数据集不是简单的文本堆砌而是为AI模型“量身定制”的营养餐。今天我就把这个数据集的构建思路、核心结构、使用场景以及我踩过的那些坑毫无保留地分享出来。无论你是想训练自己的诗词模型还是单纯需要一个干净、可靠的古诗词语料库做研究相信这份“说明书”都能让你少走很多弯路。2. 数据集全景解析它里面到底装了些什么这个数据集的命名“先秦到现代”已经点明了时间跨度但“高质量”体现在哪里我们直接拆开压缩包看看它的目录结构和核心字段设计。2.1 核心数据文件与结构解压后你会看到几个核心的JSONL文件每行一个JSON对象这是目前大模型处理中最友好的格式之一。主要文件包括poetry_full_info.jsonl(核心全集)这是数据集的“主菜”。每一行是一条完整的诗词记录。我以一个唐代诗人王维的《山居秋暝》为例展示一条记录的典型结构{ “id”: “TANG_王维_0012”, “title”: “山居秋暝”, “author”: “王维”, “dynasty”: “唐”, “content”: “空山新雨后天气晚来秋。明月松间照清泉石上流。竹喧归浣女莲动下渔舟。随意春芳歇王孙自可留。”, “content_clean”: [“空山新雨后”, “天气晚来秋”, “明月松间照”, “清泉石上流”, “竹喧归浣女”, “莲动下渔舟”, “随意春芳歇”, “王孙自可留”], “genre”: [“五言律诗”], “tags”: [“山水”, “田园”, “秋景”, “隐居”], “background”: “此诗描绘了秋雨初晴后傍晚时分山村的旖旎风光和山居村民的淳朴风尚表现了诗人寄情山水田园并对隐居生活怡然自得的满足心情。”, “translation”: “空旷的群山沐浴了一场新雨夜晚降临使人感到已是初秋。皎皎明月从松隙间洒下清光清清泉水在山石上淙淙淌流。竹林喧响知是洗衣姑娘归来莲叶轻摇想是上游荡下轻舟。春日的芳菲不妨任随它消歇秋天的山中王孙自可以久留。”, “appreciation”: “这首诗一个重要的艺术手法是以自然美来表现诗人的人格美和一种理想中的社会之美。表面看来这首诗只是用‘赋’的方法模山范水对景物作细致感人的刻画实际上通篇都是比兴。诗人通过对山水的描绘寄慨言志含蕴丰富耐人寻味。”, “collection”: “《全唐诗》”, “source_confidence”: 0.95, “metadata”: { “created_date”: “2024-10-26”, “last_verified”: “2024-10-26”, “contributor”: “dataset_curator” } }poetry_author_index.jsonl(作者索引)以作者为核心聚合其所有作品ID并包含作者生平简介、所属朝代、字号等信息。这对于做诗人风格分析、时代流派研究至关重要。poetry_by_dynasty.jsonl(朝代分卷)按朝代先秦、汉、魏晋南北朝、唐、宋、元、明、清、近现代划分的诗词ID列表。方便进行断代文学研究或训练具有时代特色的模型。instructions_for_sft.jsonl(SFT指令数据)这是为指令微调准备的“精加工食品”。我将诗词知识转化成了多种问答和任务格式。例如知识问答“instruction: 请赏析王维《山居秋暝》的艺术特色。output: [上面appreciation字段的内容]”文本生成“instruction: 以‘空山新雨后’为开头续写一首五言诗。output: [模型期望的生成结果示例]”分类与识别“instruction: 判断‘床前明月光疑是地上霜’是否属于唐诗。output: 是这是唐代诗人李白的《静夜思》。”风格模仿“instruction: 请模仿李清照婉约词的风格创作一首关于秋思的词。output: [示例词作]”2.2 “高质量”的五个维度定义我理解的高质量绝不仅仅是文本正确而是为下游AI任务服务的“可用性”质量。准确性每个字、每个标点都经过与权威底本如中华书局点校本、《全唐诗》、《全宋词》的交叉核对。对于有异文的诗句在metadata中进行了标注。source_confidence字段直观反映了该条目的可信度0.0-1.0。结构化原始古诗文往往是纯文本。我将其拆解为title,author,dynasty,content等原子字段。特别是content_clean字段将诗句按句拆分对于训练模型理解诗歌节奏、对仗和平仄格律有巨大帮助。丰富性不止于原文。background创作背景、translation现代汉语译文、appreciation赏析和tags主题标签构成了多维度的语义信息。这让模型不仅能“背诵”还能“理解”和“阐释”。一致性作者名、朝代名、诗集名全部进行了归一化处理。比如“李太白”、“青莲居士”、“李白”统一为“李白”“唐”、“唐代”、“唐朝”统一为“唐”。这避免了模型因别名问题产生认知混乱。任务导向性专门准备的instructions_for_sft.jsonl文件直接将数据转化为模型可学习的“指令输出”对极大降低了使用者构造训练数据的门槛和成本。3. 数据清洗与构建从“矿渣”到“精钢”的全过程这一步是最耗时、最考验耐心也最能体现数据集价值的地方。原始数据就像混杂着矿石和泥土的矿渣我的工作就是冶炼和提纯。3.1 原始数据来源与痛点我的数据主要来自以下几个渠道每个都有其特有的“坑”开源古籍库如“中华经典古籍库”的导出文本。优点是覆盖面广缺点是格式不统一大量注释、校勘记混在正文中需要正则表达式精准剥离。学术机构公开数据部分大学和研究所有诗词数据库。数据相对规范但往往字段不全缺少赏析、译文等增强信息。网络爬虫数据从一些诗词网站上爬取。信息维度最全常有赏析、注释但错误也最多网友上传的内容良莠不齐存在大量张冠李戴的现象。最常见的痛点包括作者朝代信息缺失或错误很多数据源只有作者名没有朝代。需要根据作者名反向查询补全但对于生僻诗人这本身就是个研究课题。文本编码与乱码来自不同源的数据编码方式各异GBK, UTF-8, GB2312混合处理时极易产生乱码。必须统一转换为UTF-8并对无法识别的字符进行人工审查或替换。标点符号不统一古诗中逗号、句号、顿号混用甚至全半角不分。这会影响分词和模型对句子结构的判断。我统一将古诗内的标点规范为全角字符。重复与近似重复同一首诗在不同来源中可能有微小差异如“白云深处有人家”与“白云生处有人家”。需要设计模糊匹配算法如SimHash去重并对差异点进行人工裁定选择最权威的版本。3.2 核心清洗流程与工具链我的清洗流水线大致如下用了不少“笨”办法但效果扎实原始数据聚合将所有来源的文本TXT, CSV, HTML解析结果汇总初步去重基于标题作者首句的精确匹配。基于规则的信息提取编写复杂的正则表达式从非结构化的文本块中提取标题、作者、正文。例如匹配“《.?》”作为标题匹配“【.?】”或“作者.*”作为作者。这一步能解决70%的问题。关键信息补全与纠错对于规则无法提取或存疑的信息我构建了一个“诗词知识图谱”作为校验基准。这个图谱基于《中国文学家大辞典》和权威文学史手动整理包含了诗人-朝代对应关系、主要作品等。通过字符串模糊匹配如Levenshtein距离将提取出的作者名与图谱中的标准名对齐从而补全朝代并纠正错别字如“杜莆”纠正为“杜甫”。内容标准化分词与分句利用jieba分词并结合古诗文特点的自定义词典对赏析、译文等现代文进行分词。对于诗词正文按韵脚、标点或固定字数五言、七言进行分句存入content_clean列表。标签生成采用无监督TF-IDF关键词提取和有监督基于小规模已标注数据训练文本分类器结合的方式为每首诗词自动生成tags。例如从“明月”、“思乡”、“孤独”等高频词中提取主题。增强信息关联从权威的诗词鉴赏辞典电子版中通过标题和作者匹配为部分经典诗词添加background和appreciation。对于无法自动匹配的则保持字段为空避免引入错误信息。人工抽样校验这是保证质量的最后一道也是最重要的防线。我制定了详细的校验清单随机抽样5%的数据进行人工逐字审校重点检查生僻字、异文、朝代归属和赏析文字的准确性。根据抽样错误率反向调整和优化前面的自动化流程。注意数据清洗没有一劳永逸的“银弹”。我的经验是规则匹配为主模型预测为辅人工校验兜底。对于核心的正文和作者信息必须追求100%准确宁可舍弃存疑的数据也绝不将错误喂给模型。4. 实战应用如何用这个数据集“喂”出更好的诗词模型数据集再好用不起来也是白搭。下面我结合几个具体的LLM任务场景讲讲怎么把这个数据集的价值榨干。4.1 场景一古诗词领域大模型预训练如果你打算从零开始或在通用基座模型上继续预训练一个精通古诗词的模型poetry_full_info.jsonl是你的主训练料。操作步骤与技巧数据格式化将JSONL中的content字段或content_clean拼接后的全文提取出来作为纯文本语料。可以按“《标题》-作者正文”的格式组织让模型学习标题、作者和正文的关联。领域混合不建议只用古诗词数据训练模型会“偏科”严重丧失通用语言能力。我的策略是混合训练。例如采用90%的通用中文语料如百科、新闻 10%的本古诗词语料。这10%的领域数据足以让模型深刻掌握诗词的语言模式和知识又不至于忘记怎么说现代汉语。关键参数在预训练时可以适当调低学习率。因为领域数据占比较小用太大的学习率可能会“冲掉”模型从通用语料中学到的基础知识。采用余弦学习率衰减并在领域数据上做更久的训练是一个稳妥的策略。避坑心得直接训练时模型可能会机械地记忆并复现整首诗但无法理解诗意或进行创作。为了解决这个问题我在构造训练样本时会随机掩码Mask诗句中的某些字词让模型练习“完形填空”。例如将“床前明月光”处理为“床前[MASK]月光”让模型预测“明”字。这能有效促进模型对诗歌用词和意境的理解而不仅仅是记忆序列。4.2 场景二指令微调SFT打造诗词助手如果你想得到一个能对话、能赏析、能创作的诗词AI助手那么instructions_for_sft.jsonl就是为你准备的。如何使用 这个文件已经格式化为标准的Alpaca或ShareGPT格式。你可以直接用它来微调诸如ChatGLM、Qwen、Baichuan等支持指令跟随的模型。指令数据构造的学问 我设计的指令类型多样旨在全方位激发模型能力知识检索型“李白写过哪些关于月亮的诗”——训练模型从内部知识中检索并列表回答。理解分析型“请解释‘春风又绿江南岸’中‘绿’字的妙处。”——训练模型的深度文本分析和鉴赏能力。创作生成型“以‘秋风’为主题写一首七言绝句。”——这是核心目标指令中要包含体裁、主题、风格等约束。对比评价型“比较一下苏轼的《水调歌头》和李清照的《声声慢》在情感表达上的异同。”——训练模型的比较和综合论述能力。SFT实战技巧数据划分将指令数据按8:1:1划分为训练集、验证集和测试集。测试集用于最终评估模型是否真的学会了“创作”而不仅仅是“套用”。损失监控在SFT过程中不仅要看训练损失下降更要关注验证集上的损失。如果验证损失很早就停止下降甚至上升说明可能过拟合了模型只是记住了训练集中的诗词对应关系。这时需要检查指令的多样性是否足够。评估设计评估诗词生成模型是难点。自动化指标如BLEU、ROUGE不太适用。我采用“人工规则”评估规则过滤首先检查生成的诗是否符合基本的格律平仄、押韵这可以用规则程序初步判断。人工评分邀请有文学背景的同事从“意境契合度”、“语言优美性”、“格律符合度”三个维度进行1-5分打分。这是最可靠的评估方式。4.3 场景三检索增强生成RAG构建精准问答系统如果你不想微调模型或者希望答案的准确性有绝对保障RAG是更好的选择。你可以将这个数据集作为向量知识库。技术栈推荐向量数据库ChromaDB 或 Milvus轻量易用。嵌入模型针对中文和古典文本我强烈推荐BAAI/bge-large-zh-v1.5或m3e-base。它们在中文语义相似度任务上表现优异。千万不要用通用的多语言模型如OpenAI的text-embedding-ada-002对古文的语义捕捉能力很差。流程将每首诗的“titleauthorcontenttags”拼接成一段文本作为检索单元。用嵌入模型将上述文本转化为向量存入向量数据库。当用户提问“给我一首王维的山水诗”时将问题也转化为向量在库中检索最相似的K首诗比如前5首。将检索到的原始诗文及其background、appreciation等信息作为上下文Context连同用户问题一起提交给大语言模型如GPT-4、ChatGLM让模型基于这些精准资料生成回答。RAG的优势与注意点优势答案绝对准确不会胡编乱造Hallucination。因为模型“看到”的上下文就是王维的原文和赏析。注意点检索的质量是关键。如果用户问“有哪些描写秋天悲伤的诗”而你的检索单元只包含标题和正文可能无法准确找到“悲秋”主题的诗。这时tags字段就发挥了巨大作用。确保你的检索查询能充分利用这些结构化标签。5. 进阶思考数据集的局限性与未来扩展方向没有任何数据集是完美的坦诚地讲这个数据集也有其边界。5.1 当前版本的已知局限覆盖度有限虽然涵盖了从先秦到近现代的主要名家名篇但对于浩如烟海的古代诗词而言这仍是冰山一角。大量非著名诗人的作品、地方性诗词、碑刻楹联等尚未收录。深度解析不足目前的appreciation和background字段对于教学和普及是足够的但对于专业的学术研究如版本流变、艺术手法细析则显得深度不够。多模态数据缺失真正的“高质量”未来应该包含与诗词相关的书法、绘画、吟诵音频等多模态数据构建立体的文化知识体系目前这部分是空白。格律的机器可读性目前数据集标注了genre如五言律诗但未将每一首诗的平仄谱、押韵规则以结构化的数据形式呈现。这对于训练模型严格遵循格律创作是一个挑战。5.2 可探索的扩展与共建模式基于这些局限我设想了几种扩展方向也欢迎有兴趣的朋友一起参与众包标注平台建立一个简单的Web界面让诗词爱好者可以为我们补充tags、background甚至撰写新的appreciation。通过多人校验机制来保证质量。这能极大丰富数据的维度。链接权威知识图谱将数据集中的诗人、地点、历史事件与开放的通用知识图谱如CN-DBpedia进行关联。这样模型不仅能知道这首诗还能知道诗人当时所处的历史环境实现更深层次的“知人论世”。构建格律校验模块这是一个相对独立的子项目。可以基于王力先生的《诗词格律》等权威理论构建一个规则引擎或训练一个分类模型自动判断一首诗是否符合特定格律并输出具体的平仄错误点。将这个模块的输出作为新的字段如metrical_pattern加入数据集。生成“负样本”对于SFT任务高质量的正样本好诗固然重要但明确的负样本不符合格律、意境混乱的诗也能帮助模型更快地学会边界。可以设计规则自动生成一些在押韵、平仄、内容上“有问题”的诗句作为对比学习的数据。整理这个数据集的过程就像一次漫长的考古与修复。每一首诗都从碎片化的信息中被辨认、清理、归位。最终的目标是让冰冷的代码能够触碰千年的文脉让AI不仅能计算出“明月”这个词的向量更能理解“举头望明月”里的那缕乡愁。这份数据集是我朝着这个目标迈出的一步它肯定不完美但我希望它坚实、干净、可用。如果你在使用中发现了任何问题或者有更好的建议我非常期待能与你交流。毕竟在让AI理解人文之美这条路上我们都需要同行者。本文还有配套的精品资源点击获取

相关新闻

最新新闻

日新闻

周新闻

月新闻