跳转到内容

数据集

数据集

数据集是FreeEval框架的基础组件,提供用于评估语言模型的内容。它们包含模型在评估过程中必须回应的提示、问题或场景,帮助测量模型能力和性能的各个方面。

数据集基础

在FreeEval中,数据集代表为系统评估而组织的评估项目集合。每个项目通常包括将呈现给模型的输入文本,并且经常包含额外的元数据,如参考答案、类别或难度评级。

数据集通过提供一致、可重现的内容,作为有意义评估的基础。通过使用标准化数据集,您可以公平地比较模型,跟踪随时间的改进,并将您的结果置于更广泛的研究背景中。

FreeEval支持各种数据集格式和来源,让您可以利用现有基准或创建适合您特定评估需求的自定义集合。该框架提供了用于加载、过滤和预处理数据集的工具,确保它们为评估正确格式化。

数据集类型

FreeEval适应几种类型的数据集,以支持多样化的评估场景:

知识数据集测试模型在科学、历史或时事等领域的事实知识。这些数据集通常包含有经过验证答案的事实性问题,让您可以测量模型在检索和应用信息方面的准确性。

推理数据集评估模型遵循逻辑步骤、解决问题或得出推论的能力。这些通常包括数学问题、逻辑谜题或需要多步推理的场景。

对话数据集通过多轮交流评估对话能力。这些特别适用于评估上下文理解、一致性和对对话规范的遵守。

创意数据集通过故事、诗歌或其他创意内容的提示来测量模型的创造能力。这些评估通常依赖于人类判断或专门指标进行评估。

安全数据集测试模型适当处理潜在问题请求的能力,帮助评估与道德准则和安全约束的一致性。

数据集选择和定制

选择适当的数据集对于有意义的评估至关重要。您选择的数据集应与您的评估目标一致,涵盖您想要评估的特定能力,并代表与您的应用相关的用例。

FreeEval允许您定制数据集以满足您的评估需求。您可以过滤数据集,专注于特定类别、难度级别或内容类型。您还可以转换数据集项目,改变格式、添加指令或修改内容,以测试特定的模型行为。

对于专业需求,您可以从头创建自定义数据集或调整现有数据集。FreeEval提供工具帮助您正确构建数据,并将其无缝集成到评估流水线中。

使用数据集

在FreeEval中配置评估时,您需指定使用哪些数据集以及如何处理它们。框架处理数据集的加载和准备,使它们可用于流水线中的评估步骤。

在评估过程中,每个步骤可以根据需要访问相关数据集,应用特定于模型的格式化或处理。框架维护数据集项目和评估结果之间的清晰连接,使您能够轻松分析在数据不同子集上的性能。

通过理解数据集在FreeEval中的功能,您可以设计更有意义的评估,为模型能力提供有针对性的见解。周到的数据集选择和定制确保您的评估测量对您特定应用或研究问题最重要的内容。

数据集实现示例

要实现新的数据集,您需要定义自定义数据集的加载逻辑和数据解析。以下是一个详细示例,展示如何创建与FreeEval流水线兼容的数据集。

from freeeval.datasets.multiple_choice import (
MultipleChoiceDataset, # 多项选择数据集的基类
MultipleChoiceProblem, # 单个问题的数据结构
)
from datasets import load_dataset # HuggingFace数据集库
from freeeval.data.registry import register_dataset # 用于注册我们的数据集
# 定义一个继承自MultipleChoiceDataset的新数据集类
class ExampleDataset(MultipleChoiceDataset):
"""
示例数据集实现,用于加载多项选择题。
此示例演示加载类似C-Eval格式的数据集。
"""
def __init__(
self,
seed=1, # 用于可重现性的随机种子
split="val", # 数据集分割(如train、val、test)
name_or_path=None, # HuggingFace数据集名称或本地路径
config_name=None, # 数据集的配置名称
fewshot_split="dev", # 用于少样本示例的分割
fewshot_num=0, # 要包含的少样本示例数量(0 = 零样本)
**kwargs # 传递给父类的额外参数
):
# 初始化父类
super().__init__(seed=seed, **kwargs)
# 设置数据集来源(如果未提供则使用默认值)
self.name_or_path = (
"liyucheng/ceval_all" if name_or_path is None else name_or_path
)
# 如果请求,处理少样本学习
if fewshot_num:
# 从指定分割加载用于少样本示范的示例
fewshot_dataset = load_dataset(
self.name_or_path,
name=config_name, # 特定子集的可选配置
split=fewshot_split
)
# 基于种子选择一组一致的示例
fewshot_examples = self.select_fewshot_examples(
fewshot_dataset, fewshot_num, seed=seed
)
# 将示例解析为标准问题格式
self.fewshot_examples = [
self.parse_data_instance(e) for e in fewshot_examples
]
else:
# 对于零样本,不需要示例
self.fewshot_examples = []
# 加载主评估数据集
self.hf_dataset = load_dataset(self.name_or_path, split=split)
# 将数据集处理成我们的格式
self.parse_hf_dataset()
# 生成包括任何少样本示例的最终提示文本
self.generate_prompt_text()
def parse_data_instance(self, data, extra={}):
"""
将单个问题实例解析为标准格式。
参数:
data: 来自数据集的原始数据实例
extra: 要包含在问题中的额外元数据
返回:
表示问题的MultipleChoiceProblem对象
"""
# 提取问题文本
question = data["question"]
# 提取答案选项
choices = [data["A"], data["B"], data["C"], data["D"]]
# 将字母答案转换为索引(A=0, B=1, C=2, D=3)
answer = ["A", "B", "C", "D"].index(data["answer"])
# 为选项生成标签
labels = [chr(i + ord("A")) for i in range(len(choices))]
# 创建并返回结构化问题对象
return MultipleChoiceProblem(
question,
choices,
answer,
generation_config={"stop_sequences": labels}, # 选择标签后停止生成
extra=extra, # 存储任何额外元数据
)
def parse_hf_dataset(self):
"""
通过解析每个实例来处理整个数据集。
将所有问题存储在self.problems列表中。
"""
for idx, data in enumerate(self.hf_dataset):
# 解析每个实例并添加ID用于跟踪
self.problems.append(self.parse_data_instance(data, extra={"id": idx}))
# 注册数据集,使其可以在配置文件中引用
register_dataset("example_dataset", ExampleDataset)

使用您的自定义数据集

实现数据集后,您可以在FreeEval配置中使用它:

{
"steps": [
{
"step_type": "simple_multiple_choice",
"step_name": "示例数据集评估",
"dataset_config": {
"type": "example_dataset", // 引用您注册的数据集名称
"dataset_kwargs": {
"seed": 42,
"split": "test",
"fewshot_num": 3 // 使用3个少样本示例
}
},
// ...模型配置和其他设置...
}
]
}

实现数据集时的关键考虑因素

  1. 可重现性:对任何随机操作使用固定种子以确保结果一致。
  2. 验证:包括检查以验证数据集格式并提出信息性错误。
  3. 格式化:确保您的数据集以目标模型期望的格式生成提示。
  4. 文档:添加清晰的文档字符串,解释数据集结构和任何特殊处理。
  5. 注册:始终注册您的数据集,使其在配置文件中可用。