markdown数据生成—GOT_OCR数据合成

简单的机器学习 简单的机器学习 2024年10月21日 10:27

在上一节《环境准备-GOT_OCR数据合成》内容中,我们给出了一个基于 markdown 数据的简单样例,这一节我们接着聊聊批量 markdown 数据怎么获取得到。

提醒:一定要按照上节内容把 tex live 环境和 markdown 宏包弄好;

我们之前就说过,大模型时代数据的构造会相对方面,这一节我们来看看大模型怎么来获取大量的 markdown 格式的数据。

Chinese Cosmopedia 数据集

这个数据集是OpenCSG开源最大中文合成数据集。

Chinese Cosmopedia 项目通过整合中文互联网中的多种数据来源和内容类型,构建了涵盖约1500万条数据和600亿个token的庞大数据集。该数据集包括了多种文体和风格,如大学教科书、中学教科书、幼儿故事、技术教程和普通故事等,内容广泛涉及学术、教育、技术等多个领域。这些多样化的数据能够满足不同应用场景的需求,帮助训练更加智能和精准的中文生成式语言模型。

OpenCSG团队在数据生成过程中,通过种子数据和prompt设计来控制数据的主题和风格,确保数据的多样性和高质量。例如,种子数据来源于各类中文百科、知识问答和技术博客等,而prompt则用于生成具有不同受众和风格的内容,从学术教科书到儿童故事,内容广泛且具有针对性。团队还利用先进的生成技术,确保生成数据具备连贯性和深度。

数据集生成方法

Chinese Cosmopedia的数据生成基于OpenCSG团队自主开发的OpenCSG-Wukong-Enterprise-Long模型。该模型通过强大的长文本生成能力,确保了生成数据的连贯性和内容深度。在数据生成过程中,OpenCSG团队为每种文体和内容类型设计了专门的prompt(提示词),以确保数据生成的风格与内容准确匹配。例如,对于教科书类型的内容,prompt会引导模型生成严谨且具有深度的学术文本,而对于故事类内容,则引导模型创造生动、引人入胜的情节。

我们这里主要看看它使用的提示是怎么样的:

大学教科书:

这是一段来自网页的摘录:“{}”。
请编写一个针对大学生的足够详细的教科书课程单元,该单元与给定的摘录中的某个概念或多个概念相关。
不需要包含摘录中的所有内容,只需要发掘其中适合作为教科书内容的部分。
你可以自由补充其他相关知识。不能仅仅列出概念,而是要深入发展和详细探讨每个概念,因为我们优先考虑深入理解主题内容,而不是广度。
要求:
1. 严谨性:确保对概念/章节的深入覆盖。
2. 吸引性:用学术、专业且引人入胜的语气撰写,以吸引兴趣。
3. 应用:融入具体的实践例子,例如微积分中要给出公式、严格证明,历史中要给出关键日期和人物,计算机操作中要给出代码。
4.不需要给出参考文献。内容中不应包含广告或涉及隐私的信息。
请记住,要针对大学生制作内容,他们可能拥有一些基础知识,但不是该领域的专家。内容应该详细且发人深省。
请立即开始撰写教科书,不要使用图片,不要输出除了教科书以外的内容。

中学教科书:

网页摘录:“{}”。
创建一个与上述网页摘录中的某个概念相关的具有教育意义的内容,针对中学生,尽量长而详细。
你可以自由补充其他相关知识。不能仅仅列出概念,而是要深入发展和详细探讨每个概念,因为我们优先考虑深入理解主题内容,而不是广度,不需要包含摘录中的所有内容。
不应该使用像微积分这样的复杂大学级主题,因为这些通常不是中学的内容。如果主题是关于这些的,寻找一个更简单的科学替代内容来解释,并使用日常例子。
例如,如果主题是“线性代数”,你可能会讨论如何通过将物体排列成行和列来解决谜题。
避免使用技术术语和LaTeX,只讨论中学级别的主题。内容中不应包含广告或涉及隐私的信息。
请直接开始撰写教育内容,不要输出除了教育内容以外的内容。

普通故事:

写一个与以下文本片段相关的引人入胜的故事:“{}”。
故事不需要提及片段中的所有内容,只需使用它来获得灵感并发挥创意!可以加入其它知识。
故事应包括:
1.小众概念或兴趣:深入研究特定的概念、爱好、兴趣或幽默情况
2.意想不到的情节转折或引人入胜的冲突,引入具有挑战性的情况或困境。
3.对话:故事必须至少包含一个有意义的对话,以揭示人物深度、推进情节或揭开谜团的关键部分。
4.反思和洞察:以具有教育意义的新理解、启示的结论结束。
5.故事中的人物应使用中国式的名字。
请勿包含广告或涉及隐私的信息。请马上开始讲故事,不要输出除了故事以外的内容。

幼儿故事:

网页摘录:“{}”
创建一个与上述网页摘录中的某个概念相关的具有教育意义的儿童故事,重点针对对世界和人际交往零知识的5岁儿童。
故事不需要提及片段中的所有内容,只需使用它来获得灵感并发挥创意。
故事应该使用简单的术语。你可以补充额外的知识来帮助理解。
使用易于理解的示例,并将 5 岁儿童可能提出的问题及其答案纳入故事中。
故事应涵盖日常行为和常见物品的使用。
不应该使用像微积分这样的复杂大学级主题,因为这些通常不是幼儿能理解的内容。
如果主题是关于这些的,寻找一个更简单的科学替代内容来解释,并使用日常例子。
例如,如果主题是“线性代数”,你可能会讨论如何通过将物体排列成行和列来解决谜题。
请直接开始撰写故事,不要输出除了故事以外的内容。

wikihow教程:

网页摘录:“{}”。
以 WikiHow 的风格写一篇长而非常详细的教程,教程与此网页摘录有相关性。
教程中需要包括对每个步骤的深入解释以及它如何帮助实现预期结果。
你可以自由补充其他相关知识。确保清晰性和实用性,让读者能够轻松遵循教程完成任务。
内容中不应包含广告或涉及隐私的信息。不要使用图像。请直接开始撰写教程。

经过上面的生成过程就可以获取了大量的 markdown 数据了,然后直接用上一节准备好的环境进行渲染就可以啦。

注:上面只是介绍了 markdown 数据集的生成过程,其实你根本不需要自己生成 OpenCSG 已经开源了他们生成的数据,所以只需要下载下来直接使用就好啦。下载地址:https://huggingface.co/datasets/opencsg/chinese-cosmopedia

基于 Agent 生成 markdown 数据

agent 是什么这里就不介绍,后面会开一系列文章对 agent 进行介绍。

markdown 格式的数据是啥样子的?其实很简单,就是标题、子标题以及内容组织起来的,和一般的文本的区别就是:标题要用“#”进行装饰以及内容里面的特殊元素要用特殊的标记进行标识

我们一般从互联网爬取的数据都一般不具有这些标记内容,所以下面我们看看怎么使用 agent 来生成这些内容。

其实流程很简单:

  • 第一步:用户提供标题;
  • 第二步:根据用户提供的标题,生成标题相关的子标题;
  • 第三步:然后根据第二步获取的子标题生成文本内容;

经过上面的三步我们就得到了一片 markdown 文档啦。下面我们用两个 agent 进行表示,一个是 WriteDirectory,另一个是 WriteContent

WriteDirectory Agent

WriteDirectory Agent提示词如下:

"""
你现在是一位经验丰富的互联网技术专家。我们需要你撰写一篇关于{topic}的技术教程。
请提供本教程的具体目录,严格遵循以下要求:
1. 输出必须严格使用指定的语言,{language}。
2. 答案必须严格以字典格式回答,如下:
{{
    "title": "xxx", 
    "directory": [
        {{
            "dir 1": ["sub dir 1", "sub dir 2"]
        }},
        {{
            "dir 2": ["sub dir 3", "sub dir 4"]
        }}
    ]
}}.
3. 目录应尽可能具体和充分,包含一级目录和二级目录。二级目录以数组形式呈现。
4. 不要有多余的空格或换行。
5. 每个目录标题都具有实际意义。
"""

样例:

  • topic:MySQL
  • language: chinese

经过大模型可以获取到的结果如下:

{
    "title""编写关于MySQL的国家标准"
    "directory": [
        {
            "1. 引言": ["1.1 背景""1.2 目的""1.3 范围"]
        },
        {
            "2. MySQL 概述": ["2.1 MySQL 历史""2.2 MySQL 架构""2.3 主要功能"]
        },
        {
            "3. 国家标准制定原则": ["3.1 标准化的重要性""3.2 制定标准的基本原则""3.3 标准制定的流程"]
        },
        {
            "4. MySQL 数据库设计标准": ["4.1 数据库设计的基本原则""4.2 数据模型设计""4.3 数据类型选择"]
        },
        {
            "5. MySQL 安全标准": ["5.1 用户管理""5.2 权限控制""5.3 数据加密"]
        },
        {
            "6. MySQL 性能优化标准": ["6.1 查询优化""6.2 索引优化""6.3 存储引擎选择"]
        },
        {
            "7. MySQL 高可用与灾备标准": ["7.1 主从复制""7.2 集群技术""7.3 灾备方案"]
        },
        {
            "8. MySQL 监控与维护标准": ["8.1 监控工具""8.2 日志管理""8.3 维护计划"]
        },
        {
            "9. MySQL 兼容性与扩展性标准": ["9.1 兼容性测试""9.2 扩展性设计""9.3 第三方工具集成"]
        },
        {
            "10. 国家标准实施与推广": ["10.1 实施计划""10.2 推广策略""10.3 持续改进"]
        },
        {
            "11. 附录": ["11.1 参考文献""11.2 术语表""11.3 常见问题解答"]
        }
    ]
}

WriteContent Agent

通过 WriteDirectory Agent我们可以得到相关标题内容,下面我们就基于相关标题通过 WriteContent Agent来获取对应子标题下的文本吧。

WriteContent Agent 提示词:

"""
现在我将为你提供该主题的模块目录标题。
请详细输出该标题的详细原理内容。
如果有代码示例,请根据标准代码规范提供。
如果没有代码示例,则不需要。

该主题的模块目录标题如下:
{directory}

严格限制输出按照以下要求:
1. 遵循 Mathpix Markdown 语法格式进行布局。
2. 如果有代码示例,必须遵循标准语法规范,有文档注释,并以代码块形式显示。
3. 输出必须严格使用指定的语言,{language}。
4. 不要有多余的输出,包括结论性语句。
5. 严格要求不输出主题“{topic}”。
"""

样例:

  • directory: {"1. 引言": ["1.1 背景", "1.2 目的", "1.3 范围"] }
  • language: chinese
  • topic: MySQL

结果如下:

## 1.1 背景

MySQL 是一种广泛使用的开源关系型数据库管理系统(RDBMS)。它由瑞典公司 MySQL AB 于 1995 年开发,后被 Sun Microsystems 收购,再后来被 Oracle Corporation 收购。MySQL 以其高性能、可靠性和易用性而闻名,广泛应用于各种规模的企业和组织中。

随着信息技术的快速发展,数据库技术也在不断进步。为了确保 MySQL 在不同行业和应用场景中的标准化和规范化使用,制定国家标准化文件显得尤为重要。这不仅有助于提高系统的互操作性和可维护性,还能促进技术的普及和应用。

## 1.2 目的

本标准的制定旨在为 MySQL 数据库的使用和管理提供一套统一的规范和指导。具体目的包括:

1. 
**确保兼容性和互操作性**:通过标准化 SQL 语句和数据类型,确保不同系统和应用之间的数据交换和共享。
2. **提高系统安全性**:提供安全配置和管理的最佳实践,减少潜在的安全风险。
3. **优化性能**:提供性能调优和优化的建议,确保数据库在高负载和大数据量下的稳定运行。
4. **简化维护和管理**:提供统一的管理和维护流程,降低运维成本,提高工作效率。

## 1.3 范围

本标准适用于以下方面:

**数据库设计**:包括表结构设计、索引设计、数据类型选择等。
**数据操作**:包括数据的增删改查(CRUD)操作、事务管理等。
**性能优化**:包括查询优化、索引优化、存储引擎选择等。
**安全管理**:包括用户权限管理、数据加密、备份与恢复等。
**运维管理**:包括日志管理、监控与报警、故障排除等。

本标准适用于使用 MySQL 数据库的各类企业和组织,无论其规模大小。通过遵循本标准,可以确保 MySQL 数据库的高效、安全和稳定运行。

这样我们获取到了第一节部分的内容了,其它节的内容重复执行就依次获取到了。

其实上面的内容可以在 Metagpt 项目工程里面可以发现的:

  • github:https://github.com/geekan/MetaGPT/tree/main
  • 样例文件:https://github.com/geekan/MetaGPT/blob/main/examples/write_tutorial.py

最后获取得到

结合《环境准备-GOT_OCR数据合成》我们展示一下这个经过渲染后的内容如下:

图片

总结

本篇文章介绍了两个 markdown 的数据获取来源:

  • 直接使用 Chinese Cosmopedia
  • 使用 MetaGpt 中的 Agent 实现自定义数据获取。