今天我要分享一个非常实用的工具——YourBench,它能帮你从任意文档中自动生成高质量的基准测试数据集。想象一下,你手头有一堆PDF、Word文档或网页内容,现在需要基于这些材料创建一套多选题测验。传统方法需要人工阅读、出题、设计选项,耗时耗力。而YourBench让这个过程变得像变魔术一样简单。
我最近用它把《哈利波特》的维基百科剧情摘要PDF转换成了包含数百道多选题的完整测验数据集,整个过程不到1分钟。这套工具由Hugging Face团队开发,特别适合教育工作者、内容创作者和AI开发者快速构建定制化的评估数据集。
首先确保你的系统满足以下条件:
创建并激活虚拟环境:
bash复制python -m venv yourbench-env
source yourbench-env/bin/activate # Linux/macOS
# 或 yourbench-env\Scripts\activate # Windows
通过pip安装最新版:
bash复制pip install yourbench
注意:如果遇到依赖冲突,可以先创建一个全新的虚拟环境。我遇到过transformers库版本冲突的问题,全新环境是最稳妥的解决方案。
我们将使用《哈利波特》系列的情节摘要作为示例文档。这些内容已经整理成PDF格式,可以直接下载:
bash复制mkdir -p data && wget https://raw.githubusercontent.com/patrickfleith/test-files/main/Harry_Potter_Wikipedia_Plots.pdf -O data/Harry_Potter_Wikipedia_Plots.pdf
YourBench采用分阶段处理策略,每个阶段都经过精心设计:
文档摄取(Ingestion):
摘要生成(Summarization):
分块处理(Chunking):
问题生成(Question Generation):
导出(Export):
创建config.yaml文件,包含以下主要部分:
yaml复制hf_configuration: # Hugging Face相关配置
model_list: # 使用的模型列表
model_roles: # 模型分工配置(可选)
pipeline: # 处理管道配置
在.env文件中设置你的API密钥:
code复制HF_TOKEN=hf_xxxxxx
OPENROUTER_API_KEY=sk-xxxxxxx
然后在config.yaml中添加:
yaml复制hf_configuration:
hf_dataset_name: "harry-potter-quizz"
private: true
hf_organization: "$HF_ORGANIZATION" # 可选
hf_token: "$HF_TOKEN"
实操技巧:如果你没有组织账号,可以省略hf_organization字段,数据集会默认上传到你的个人账号下。
我们使用OpenRouter访问GPT-OSS-120B模型:
yaml复制model_list:
- model_name: "openai/gpt-oss-120b"
base_url: "https://openrouter.ai/api/v1"
api_key: "$OPENROUTER_API_KEY"
max_concurrent_requests: 8
yaml复制pipeline:
ingestion:
source_documents_dir: "data"
output_dir: "processed"
summarization: {} # 使用默认配置
chunking:
l_max_tokens: 1024
token_overlap: 256
single_shot_question_generation:
question_mode: "multi-choice"
bash复制yourbench run config.yaml
这个命令会自动执行完整流程,你会在终端看到详细的进度日志。典型的处理时间取决于:
生成的数据集包含多个子集,可以通过Hugging Face的datasets库加载:
python复制from datasets import load_dataset
dataset = load_dataset("your_hf_organization/harry-potter-quizz", name='single_shot_questions')
主要子集包括:
single_shot_questions子集包含以下关键字段:
| 字段名 | 类型 | 描述 | 示例 |
|---|---|---|---|
| question | str | 生成的问题 | "What is Professor Snape's true intention during Harry's first Quidditch match?" |
| choices | list[str] | 选项列表 | ['(A) He is trying to protect Harry...', '(B) He wants to sabotage Harry...'] |
| answer | str | 正确答案标签 | "A" |
| chunk_id | str | 来源文本块ID | "doc_0_chunk_12" |
除了多选题,还可以生成开放式问题:
yaml复制single_shot_question_generation:
question_mode: "open-ended"
要生成需要综合多个文本块信息的问题:
yaml复制multi_hop_question_generation:
max_hops: 2 # 最多关联2个文本块
max_concurrent_requests提高吞吐量summarization阶段l_max_tokens平衡上下文完整性和处理效率症状:ingestion阶段报错
可能原因:
症状:生成的问题含糊或错误
可能原因:
症状:频繁的速率限制错误
解决方案:
yaml复制model_list:
- model_name: "..."
retry:
max_attempts: 5
delay: 10
通过继承DocumentProcessor类实现自定义解析器:
python复制from yourbench.processors import DocumentProcessor
class EpubProcessor(DocumentProcessor):
def process(self, file_path):
# 实现EPUB解析逻辑
return processed_text
创建prompt模板文件questions_prompt.jinja2:
code复制基于以下文本生成多个选择题:
{{ chunk_text }}
要求:
- 问题清晰明确
- 选项数量:4个
- 包含1个正确答案和3个合理但错误的选项
然后在配置中指定:
yaml复制single_shot_question_generation:
prompt_template: "path/to/questions_prompt.jinja2"
添加新的模型配置示例:
yaml复制model_list:
- model_name: "anthropic/claude-3-opus"
base_url: "https://api.anthropic.com"
api_key: "$ANTHROPIC_API_KEY"
经过一周的实际使用,我发现YourBench最强大的地方在于它的灵活性。虽然示例使用了《哈利波特》内容,但同样的流程完全可以应用于技术文档、法律条文或科研论文。关键是要根据具体内容类型调整chunk大小和问题生成策略。比如技术文档适合较小的chunk(512 tokens)和更精确的问题,而文学作品则可以接受更大的上下文窗口。