Skip to content

Latest commit

 

History

History

dataset

数据集制作笔记

RAG数据集

通过Google Drive访问我们的进行RAG的原始数据与处理后的数据

原始数据

  1. 搜集了公安部令与国务院令中有关机动车驾驶、道路交通规则等一系列法规条令。
  2. 搜集了驾驶证考试科目一、科目二、科目三、科目四有关的考试技巧口诀
  3. 使用开源项目Bili2text,将B站中科目二、科目三的驾考培训视频转为文本数据。

rag_raw_data.png

处理原始数据

手工整理、整合数据,将所有数据统一为txt格式。

向量数据库构建

create_rag_data_base.py用于从目录 rag_datasets 加载文本文件,提取文档内容,并利用预训练的词向量模型将文本内容向量化,最后构建一个向量数据库以便于高效检索和分析。 主要实现了以下主要功能:

  1. 文档加载与文档内容提取:支持从多个目录递归加载 Markdown、PDF 和txt的文件,自动识别文件格式并使用相应的加载器读取文档内容。(本项目数据集最后都统一为了txt)
  2. 文本分块处理:为了适应向量化处理的需求,使用 RecursiveCharacterTextSplitter 对提取的文本内容进行分块处理,保证文本块的大小适中,并允许一定程度的重叠以避免信息损失。
  3. 文本向量化:利用预训练的词向量模型 sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 对文本块进行向量化处理,以支持后续的文本相似性检索。
  4. 向量数据库构建与持久化:使用 Chroma 向量数据库框架存储向量化的文本块,提供快速检索的功能,并将向量数据库持久化到磁盘上以支持大规模文档集合的处理。

微调数据集

Doc转markdown格式

markdown转raw_json

raw_json转struc_json

struct_json转finetune_json

通过Google Drive访问我们微调阶段的数据集

原始数据

网络上搜集的驾考科目一、科目四选择题题库。其中有一部分题库只有选项答案没有解析,另部分有答案解析。

为了在进行指令跟随微调后,TRLLM模型能针对用户的提问,不仅要给出正确的回答,还需要给出详细的解释。因此我们将有解析的科目一科目四题库制作为用作 指令跟随微调的数据集,而只有答案没有解析的科目一科目四题库我们将其制作为评测数据集用来评测微调和量化后TRLLM的性能。

  • 没有解析的科目一题库:共1853条选择题。
  • 没有解析的科目四题库:共1590条选择题。
  • 有解析的科目一题库:共1615条选择题。
  • 有解析的科目四题库:共1383条选择题。

上述题库中,其中有部分看图答题的题目,在后续制作文本数据集时进行了过滤,因此有一定的数据损失。

处理原始数据

1. Doc转markdown格式

对于用作微调用途的,有解析的题库,首先我们使用doc转md格式的在线工具 ,将doc转换为更为结构化的文本,以便于后续的处理。

2. markdown转raw_json

由代码mdtorawjson.py实现。

功能描述

mdtorawjson.py的主要功能是从一系列 Markdown 文件中提取题目文本,并将其格式化为 JSON 数据结构,用于后续的数据处理和分析。

  1. 读取Markdown文件:首先读取经过转换的科目一科目四题库 Markdown 文件。文件路径存储在 file_names 列表中。
  2. 内容拼接:将所有读取到的文件内容拼接成一个长字符串,文件之间用换行符 \n 分隔,以便后续处理。
  3. 题号匹配与校验:使用正则表达式 \n\d+、 匹配文本中所有可能的题号。这些题号用于后续将文本分割成单独的问题。同时,通过 check_question_number 函数校验题号的连续性和完整性,确保没有遗漏或错误的题号。
  4. 问题分割:基于匹配到的题号,将拼接后的文本分割成独立的问题。每个问题都是字符串中的一个片段。
  5. 格式化与JSON转换:对分割出的每个问题进行格式化处理,包括去除多余的空格和将换行符替换为 \\n。然后,将每个问题封装成一个 JSON 对象,其中包含问题编号 (no) 和格式化后的问题文本 (text)。
  6. 保存到JSON文件:将所有问题的 JSON 对象集合转换成 JSON 格式的字符串,并保存到rawtext.json文件中。这个过程中,ensure_ascii=False 参数确保非 ASCII 字符(如中文)能够正确保存。
范例数据格式:

提取题号no和题目文本内容text,初步结构化数据,便于后续分离提取。

[
  {
    "no": "1",
    "text": "1、对未取得驾驶证驾驶机动车的,会追究其法律责任。\\n\\nA、正确 \\n\\nB、错误 \\n\\n【答案】A \\n\\n【技巧 1】无证禁止驾车,违反依法追责。\\n\\n【技巧 2】解析:未取得驾驶证驾驶机动车,属于“无证驾驶”,将依法追究 法律责任。\\n\\n【讲解 1】本题主要考察无证驾驶的处罚。未取得驾驶证驾驶机动车属于违法 行为,将依法追究法律责任。因此选择“正确”。 \\n\\n【讲解 2】相关法规参考:《道路交通安全法》第九十九条,未取得机动车驾驶证、机动车驾驶证被吊销或者机动车驾驶证被暂扣期间驾驶机动车的,由公 安机关交通管理部门处二百元以上二千元以下罚款,可以并处十五日以下拘留。"
  },
  {
    "no": "2",
    "text": "2、驾驶机动车应随身携带哪种证件?\\n\\nA、工作证 \\n\\nB、驾驶证 \\n\\nC、身份证 \\n\\nD、职业资格证\\n\\n【答案】B \\n\\n【技巧 1】两证两标一号牌,不带扣车还罚款。\\n\\n【技巧 2】解析:驾驶机动车应随车携带机动车行驶证、驾驶证,无论是电子 版,还是纸质版,都需要随车携带。\\n\\n【讲解 1】本题主要考察机动车上路行驶条件。驾驶机动车上路行驶应随车携 带驾驶证、行驶证。因此选择“驾驶证”。 \\n\\n【讲解 2】相关法规参考:《道路交通安全法》第十九条,驾驶人应当按照驾 驶证载明的准驾车型驾驶机动车;驾驶机动车时,应当随身携带机动车驾驶 证。"
  }
]

3. raw_json转struc_json

strucjson.py

improvedataset.py

strucjson功能描述

strucjson.py实现了从rawtext.json中提取和处理考试题目数据,并将其转换为结构化的数据集structqa_raw.json 的功能(此处暂未分割原始数据集中的看图答题和纯文本题)。

  1. 提取题目文本:通过正则表达式匹配并提取每个题目的文本部分,去除其中的空格和换行符,以获得干净的题目描述。
  2. 提取选项文本:同样使用正则表达式匹配并提取题目的选项部分,支持跨行的文本提取,保留选项内容。
  3. 提取答案文本:通过正则表达式从题目中提取答案,并清洗数据以去除非字母字符,仅留下答案标记(如A、B、C、D)。
  4. 提取解释文本:提取题目解释部分的文本,包括多个解释段落的提取,确保从题目的解释部分获得完整信息。
  5. 构造 JSON 对象:将提取到的题目文本、选项、答案和解释组织成一个结构化的 JSON 对象,每个对象包含四个主要字段:question (问题)、choose(选项)、answer(答案)和explanation(解释)。
  6. 生成结构化数据集:遍历rawtext.json中的所有元素,应用上述提取和处理步骤,将结果收集到一个列表中。
  7. 保存结构化数据:将处理后的结构化数据保存到structqa_raw.json中,便于后续转换为适合大模型微调的数据格式。
范例数据格式
  • 问题question
  • 选项choose
  • 答案answer
  • 解答explaination
[
  {
    "question": "对未取得驾驶证驾驶机动车的,会追究其法律责任。",
    "choose": "A、正确 \\n\\nB、错误 \\n\\n",
    "answer": "A",
    "explanation": [
      "无证禁止驾车,违反依法追责。",
      "未取得驾驶证驾驶机动车,属于“无证驾驶”,将依法追究法律责任。",
      "未取得驾驶证驾驶机动车属于违法行为,将依法追究法律责任。",
      "根据《道路交通安全法》第九十九条,未取得机动车驾驶证、机动车驾驶证被吊销或者机动车驾驶证被暂扣期间驾驶机动车的,由公安机关交通管理部门处二百元以上二千元以下罚款,可以并处十五日以下拘留。"
    ]
  },
  {
    "question": "驾驶机动车应随身携带哪种证件?",
    "choose": "A、工作证 \\n\\nB、驾驶证 \\n\\nC、身份证 \\n\\nD、职业资格证\\n\\n",
    "answer": "B",
    "explanation": [
      "两证两标一号牌,不带扣车还罚款。",
      "驾驶机动车应随车携带机动车行驶证、驾驶证,无论是电子版,还是纸质版,都需要随车携带。",
      "驾驶机动车上路行驶应随车携带驾驶证、行驶证。",
      "根据《道路交通安全法》第十九条,驾驶人应当按照驾驶证载明的准驾车型驾驶机动车;驾驶机动车时,应当随身携带机动车驾驶证。"
    ]
  }
]
正则表达式

strucjson.py:

  • 提取题目文本
    • 目的:从题目文本中提取出题干部分。
    • 解释:这个正则表达式匹配一个题号(由数字和顺序点组成),然后捕获直到第一个选项“A、”之前的所有文本作为题干。
match = re.search(r'\d+、(.+?)A、', text)
  • 提取选项文本
    • 目的:提取包含所有选项的文本段落。
    • 解释:使用re.DOTALL标志来让.匹配包括换行符在内的任意字符,从而支持跨行的选项文本提取。这个正则表达式从题号开始,非贪婪地匹配到“A、”开始的选项文本,直到“【答案】”标记之前。
match = re.search(r'\d+、.*?(A、.+?)【答案】', text, re.DOTALL)
  • 提取答案文本
    • 目的:从题目中提取答案文本。
    • 解释:在“【答案】”和下一个“【”标记之间提取任意文本,包括跨行的情况。随后通过re.sub(r'[^A-Za-z]', '', text) 去除非字母字符,仅保留答案标记(如A、B、C、D)。
match = re.search(r'【答案】(.*?)【', text, re.DOTALL)
  • 提取解释文本
    • 目的:提取题目的解释部分文本。
    • 解释:这个正则表达式匹配“【答案】”标记后的所有文本,直到字符串末尾。然后使用findall 方法提取出每段解释文本。contents1用于提取除最后一段外的解释文本段,而contents2用于单独提取最后一段解释文本。
match = re.search(r'【答案】.*?【(.*?)$', text)
contents1 = re.findall(r'】(.*?)【', text, re.DOTALL)
contents2 = re.findall(r'】([^】]*)$', text, re.DOTALL)
improvedataset功能描述

improvedataset.py 旨在优化和分类考试题目数据。它从结构化的 JSON 数据集 structqa_raw.json 中进行处理,识别包含图片的题目与纯文本题目,并对题目的解释文本进行改进,剔除与答题强相关的从而更符合车载交规小助手与用户问答互动的应用场景。

  1. 题目分类:通过检查题目文本中是否包含图片标记(![任意字符]模式),将题目分为包含图片的题目和纯文本题目两个列表(TRLLM暂时只针对文本类的数据进行训练)。
  2. 解释文本优化:对每个题目的explanation部分进行以下改进:
    • 删除解释文本中不必要的引导语句(如“本题主要考察...”)。
    • 清除特定的提示信息(如“相关内容拓展:”和“相关法规参考:”),并对后者进行替换,以更加简洁地指向相关法规。
    • 移除解释中的答案选择提示(如“因此选择...”)。
    • 忽略包含“选项”二字的解释文本,以去除可能的冗余信息。
  3. 数据保存:将分类后的图片题目和纯文本题目分别保存到两个新的 JSON 文件中(structqa_picture.jsonstructqa_text.json),以便于后续的分析和使用。

4. struct_json转finetune_json

makellmdata.py

功能描述

makellmdata.py旨在为 internML 大模型训练准备交通规则问答数据集。通过精细的处理、合并和扩充步骤,我们生成了一个符合微调数据集格式要求的数据集。

  1. 从中structqa_text.json提取合并题目的选项、答案和解释文本。
  • 通过合并和格式化,创建符合模型训练需求的对话式数据结构。

  • 对数据集进行扩充,增加模型训练的数据量。(因原始数据集条数太少,故将数据集扩充10倍( v1-new版本改为扩展5倍,因为我们有了基于文心一言优化用词的v3)

  • 将扩充后的数据集与其他数据集合并,形成一个综合的训练资源库。

  • 执行数据集随机化,以确保训练过程的公正性和有效性。

  • 生成并保存最终的数据集,为基于internml-chat-7b进行微调的TRLLM模型训练提供支持。

  • 范例数据格式

    • 一轮对话集converstaion
    • 系统promptsystem
    • 用户输入input
    • 模型输出output
[
  {
    "conversation": [
      {
        "system": "你现在是一名道路安全规则专家,你需要帮助用户解答各种交通规则问题以及向用户提供驾驶车辆需要了解的各种知识,你需要给出专业、可靠、有逻辑的回答,同时用词还需要具有亲和力。",
        "input": "对未取得驾驶证驾驶机动车的,会追究其法律责任。",
        "output": "正确。\n因为无证禁止驾车,违反依法追责。未取得驾驶证驾驶机动车,属于“无证驾驶”,将依法追究法律责任。未取得驾驶证驾驶机动车属于违法行为,将依法追究法律责任。根据《道路交通安全法》第九十九条,未取得机动车驾驶证、机动车驾驶证被吊销或者机动车驾驶证被暂扣期间驾驶机动车的,由公安机关交通管理部门处二百元以上二千元以下罚款,可以并处十五日以下拘留。"
      }
    ]
  },
  {
    "conversation": [
      {
        "system": "你现在是一名道路安全规则专家,你需要帮助用户解答各种交通规则问题以及向用户提供驾驶车辆需要了解的各种知识,你需要给出专业、可靠、有逻辑的回答,同时用词还需要具有亲和力。",
        "input": "驾驶机动车应随身携带哪种证件?",
        "output": "驾驶证。\n因为两证两标一号牌,不带扣车还罚款。驾驶机动车应随车携带机动车行驶证、驾驶证,无论是电子版,还是纸质版,都需要随车携带。驾驶机动车上路行驶应随车携带驾驶证、行驶证。根据《道路交通安全法》第十九条,驾驶人应当按照驾驶证载明的准驾车型驾驶机动车;驾驶机动车时,应当随身携带机动车驾驶证。"
      }
    ]
  }
]

评测数据集

自定义数据集格式以及利用opencampass进行评测,参考文档:https://opencompass.readthedocs.io/zh-cn/latest/advanced_guides/custom_dataset.html

genmcq.py用于从结构化的 JSON 数据集(仅有答案没有解释的结构化科目一问题集仅有答案没有解释的结构化科目四问题集 )中提取多项选择题(MCQ)数据。评测数据集和微调数据集是分别基于不同的源数据制作的,因此避免了数据泄漏问题,确保了评测得分的可靠度。

  • 从结构化的科目一科目四选择题数据中提取问题question、选项choose和答案answer
  • 清洁和格式化选项文本,生成易于处理的选项列表。
  • 过滤掉多选题(因为暂不明确oncampass评测多选题时的脚本怎么写)。
  • 将处理后的题目数据转换为 JSONL 格式,每个题目一个 JSON 对象,符合oncampass官方文档的要求。

输入数据格式

  • question
  • choose
  • answer
  • explanation
[
  {
    "question": "变更车道前确认后方无来车时可以不开转向灯变道。",
    "choose": "A、正确\nB、错误",
    "answer": "B",
    "explainnation": ""
  },
  {
    "question": "某日早上6时,冉某驾驶一辆大客车出发,连续行驶至上午11时,在宣汉县境内宣南路1公里处,坠于公路一侧垂直高度8.5米的陡坎下,造成13人死亡、9人受伤。冉某的主要违法行为是什么?",
    "choose": "A、超速行驶\nB、不按交通标线行驶\nC、客车超员\nD、疲劳驾驶",
    "answer": "D",
    "explainnation": "。连续行驶超过4个小时属于疲劳驾驶。"
  }
]

输出数据格式

  • question
  • A, B, C, D, ...
  • answer
{"question": "对驾驶已达到报废标准的机动车上路行驶的驾驶人,会受到以下哪种处罚?", "A": "处 15 日以下拘留", "B": "吊销机动车驾驶证", "C": "处 20 元以上 200 元以下罚款", "D": "追究刑事责任", "answer": "B"}
{"question": "驾驶机动车上路前应检查车辆安全技术性能。", "A": "正确", "B": "错误", "answer": "A"}