数据溯源倡议
设置 | 运行 | 收集的信息 | 生成Bibtex | 添加集合 | 数据格式 | 法律声明与限制 | 联系方式
数据溯源倡议是一项跨学科的志愿者努力,旨在提高人工智能训练数据集的透明度、文档记录和负责任使用。通过对44个数据集合进行大规模审计,涵盖1800多个用于微调的文本到文本数据集(称为数据溯源集合),该倡议的首次发布详细记录了这些数据集的网络和机器来源、许可证、创建者和其他元数据。
本仓库中的脚本允许开发人员根据自己的需求筛选最适合的微调数据集,从自报的许可限制到其他数据特征。查看数据溯源浏览器以查看数据组成,以及您可以在此仓库中应用的不同筛选器的影响。从此仓库生成数据子集将创建一个"数据溯源卡"——所有组成数据集的象征性归属,可用作结构化文档。完整详情将在我们即将发布的论文中提供。
本仓库不构成法律建议。 请参阅法律声明和限制。
这是该倡议的第一步,我们计划扩展资源和工具,以及学术分析。如果您想贡献,请通过data.provenance.init@gmail.com与我们联系。
设置
pip install -r requirements.txt
运行
此脚本允许您下载所有数据集,并根据收集的信息中的任何标准进行筛选。您可以通过argparse传入参数,或使用类似于src/configs/default.yaml
的自定义yaml配置。所有数据集都将被标准化为相同的格式。默认情况下,我们使用这种格式,因为它可以推广到多轮对话和响应排序,但您也可以将数据集标准化用于监督微调。
某些数据集需要受限访问,因此您需要在仓库中创建一个类似于.env.template
的.env
文件,并添加您的HuggingFace令牌,并在HuggingFace页面上接受数据集的条款和条件。
python src/download_and_filter.py -c src/configs/default.yaml
收集的信息
标识信息
- 唯一数据集标识符 --- 数据集的唯一标识符,格式为
- 。 - 数据集名称 --- 数据集的常用名称。
- 论文标题 --- 相关论文的标题(如果有)。
- 数据集URL --- 数据集原始GitHub仓库、网站或最佳可用资源的URL。
- GitHub URL --- 数据集原始GitHub仓库的URL(如果有)。
- Hugging Face URL --- 数据集的Hugging Face页面URL。
- Papers with Code URL --- 数据集的'Papers with Code'页面URL。
- ArXiv URL --- 如果数据集附有论文,则为ArXiv摘要页面的URL。
- Semantic Scholar语料ID --- 与数据集论文在Semantic Scholar上关联的语料ID。
- 集合 --- 此版本数据集所属的集合。
- 集合URL --- 集合的GitHub仓库或网站URL。
数据集特征
- 语言 --- 文本中表示的自然或编码语言列表。
- 任务类别 --- 数据集中表示的任务列表。
- 文本来源 --- 文本派生的网络/离线来源列表。
- 文本主题 --- 文本中讨论的主题列表。
- 文本指标 --- 每个示例输入和输出的最小、平均和最大字符数统计,以及对话轮数(如适用)。
- 格式 --- 选项包括"零样本提示"、"少样本提示"、"思维链提示"、"多轮对话"、"响应排序"或其他组合(如适用)。
- 收集时间 --- Hugging Face、Semantic Scholar和GitHub的初始上传时间,表示数据集创建时间。
- 引用计数 --- 如果在Semantic Scholar上,截至2023年9月的记录引用计数。
- 下载计数 --- 如果在Hugging Face上,2023年9月的记录下载计数。
- 数据集筛选ID -- 与Hugging Face数据集关联的数据集筛选ID列表,适用于同一集合有多个来源/语言/任务且可以分开的情况。
数据集溯源
- 模型生成 -- 用于生成此数据集的模型(如适用)。
- 文本来源 --- 文本抓取或派生的网络/离线来源列表。
- 文本领域 --- 从文本来源可以使用
constants/domain_groups.json
推断出"文本领域"(如生物医学、法律、百科全书、书籍等)。 - 派生自数据集 --- 此数据集派生自的其他机器学习数据集列表。
- 人工标注 --- 在从文本来源获取数据后,数据集策划过程中是否包含额外的人工标注。
- 创建者 --- 编制(或创建)此数据集的大学、公司和其他组织列表。
- 许可证 --- 与此数据集相关的许可证列表,由NLP数据集的创建者/编译者提供,包括其URL。
- 许可条件 --- 使用上述信息和
constants/license_classes.json
,我们对每个许可证的使用限制、归属和共享要求进行分类。 - 许可说明 --- 人工标注者对其检索的许可信息的任何说明。
生成Bibtex
我们收集了数据溯源集合中每个有相关论文的数据集的bibtex条目。这些可以在data_summaries/
中找到,您还可以通过运行数据准备脚本自动生成任何数据子集的完整bibtex文件。
要在不下载数据的情况下生成bibtex,只需运行数据下载和筛选脚本,但在此代码行之后停止:https://github.com/Data-Provenance-Initiative/Data-Provenance-Collection/blob/main/src/download_and_filter.py#L419。
添加集合
说明:
-
对于新集合,在
data_summaries/
中添加一个json文件。尝试将所有数据集或数据集的可分离拆分(按语言、任务、许可证、来源等)作为json文件中的单独实体列举,每个实体都有自己的"唯一数据集标识符"。 请参考data_summaries/_template.json
以获取参考和所需字段的信息。 -
在
src/downloaders.py
中为您的集合编写一个下载器函数。 下载器应下载集合,并过滤掉accepted_filter_ids
参数中未表示的任何子集。 此参数对应于每个唯一数据集的"数据集筛选ID",可用于基于Hugging Face数据集对象可能具有的某些列(例如source
)进行筛选。 此下载器返回一个任意格式的列表,以在下一步中解析。 "数据集筛选ID"也应该是每行的一个字段,以便我们稍后可以将示例映射回其来源。
def download_<your_collection>(accepted_filter_ids):
"""下载您的数据集并过滤到`accepted_filter_ids`中的子集。
accepted_filter_ids: 来自数据集摘要文件的"数据集筛选ID"列表,
其"唯一数据集标识符"在运行时通过许可证/语言/任务等筛选器。
使用这些来将下载的数据集分割成仅相关的数据点。
返回一个代表数据集的行列表(任意格式)。
例如,Flan集合有数百个具有不同许可证的数据集。
`accepted_filter_ids`将是我们许可证筛选后剩余的数据集列表,
它们应该对应于huggingface下载中的示例标签。
"""
# 使用此辅助函数从Hugging Face下载您的数据集,例如:
dset = huggingface_download('nomic-ai/gpt4all-j-prompt-generations', split='train')
# 或使用此辅助函数直接从URL下载您的数据集,例如:
dset = direct_data_request("https://raw.githubusercontent.com/<your-repo>/data.json")
# 您现在可以返回dset,或者可以进一步筛选下载的数据集(见下文)。
return dset
# 接下来,我们过滤出相关的数据子集,由`accepted_filter_ids`表示。
# 如果`dset`中有多个数据集,那么通过过滤的数据集的`dataset_filter_key`将被传入`accepted_filter_ids`。
# 你可以使用`pool_filter`并行过滤数据集(参见文档)。
# 'source'是`pool_filter`中定义的`task_key`的一个例子,在downloader.py中
return pool_filter(dset, "source", accepted_filter_ids)
- 在
src/preparers.py
中为你的集合编写数据准备函数。 准备函数将接收你的自定义下载函数的输出,并按以下格式格式化数据(也在这里解释过):
以下是你如何编写数据集准备函数的示例:
def prepare_<your_collection>(row):
"""
准备函数可以使用`convert_inputs_taergets_to_messages`函数,该函数接收你的自定义下载函数的输出,并按以下格式格式化数据:
对话中的消息列表:[{"from": <>, "text": <>, "parent": <>, "score": <>}, ...]
'from'可以是'user'或'assistant'
'text'是单条消息的内容
'parent'是对话列表中前一条消息的0索引ID,或列表中第一条消息的唯一数据集标识符(随后是0,然后是1,等等)
'score'(可选)是该回复的分数,如果适用的话
你也可以自定义你自己的准备处理函数,只要它们有相同的输出格式。
"""
return convert_inputs_targets_to_messages(row['prompt'], row['response'],'<dset_name>')
- 将你的集合添加到
src/collection_mapper.py
中的COLLECTION_FN_MAPPER
,格式如下:
"<你的数据集文件名(不带扩展名)>":{
"download_function": downloaders.download_<your_collection>,
"prepare_function": "preparers.prepare_<your_collection>",
}
- 运行以下测试以确认你的代码是否正常工作(或帮助调试):
python src/test_new_collection.py --collection "<你的集合>"
如果你想运行所有内容并集中打印所有错误,在上一个命令后使用--no_halt
:
python src/test_new_collection.py --collection "<你的集合>" --no_halt
数据集格式
我们的数据集结构是一个字典列表,每个字典代表对话中的一条单独消息。每条消息字典包含以下字段:
- "from":这表示发送者,可以是"user"或"assistant"。
- "text":这提供了消息的实际内容。
- "parent":对于开始对话的消息,此字段包含数据集的ID。对于后续消息,它包含列表中它所回复的消息的0索引位置。
- "score"(可选):某些消息,尤其是回复,可能带有分数。这在单条消息有多个竞争回复的情况下很有用,展示了对话的潜在分支。
消息通常以对组织,其中"assistant"回复"user",反之亦然,但可能有多个回复对应一条消息,表示对话中的不同路径。
[
{
"from": "user",
"text": "你好,你怎么样?",
"parent": "dataset1234"
},
{
"from": "assistant",
"text": "我很好!我能为您做些什么?",
"parent": 0,
"score": 1
},
{
"from": "assistant",
"text": "你好!",
"parent": 0,
"score": 0
},
...
]
法律声明和限制
数据溯源计划是一项旨在增加机器学习透明度的研究努力。 本页面提供的信息以及数据溯源计划的任何输出并不构成,也不意图构成法律建议;相反,所有信息、内容和材料仅供一般信息参考。 本项目的任何读者、用户或浏览者不应基于数据溯源计划的信息采取行动或避免采取行动,而应首先向相关司法管辖区的法律顾问寻求法律建议。
本仓库中的代码采用Apache 2.0许可。
联系方式和引用
联系data.provenance.init@gmail.com更新或为此资源做出贡献。
@article{longpre2023data,
title={The Data Provenance Initiative: A Large Scale Audit of Dataset Licensing \& Attribution in AI},
author={Longpre, Shayne and Mahari, Robert and Chen, Anthony and Obeng-Marnu, Naana and Sileo, Damien and Brannon, William and Muennighoff, Niklas and Khazam, Nathan and Kabbara, Jad and Perisetla, Kartik and others},
journal={arXiv preprint arXiv:2310.16787},
year={2023}
}