284 lines
6.8 KiB
Markdown
284 lines
6.8 KiB
Markdown
# QA数据集采样工具
|
||
|
||
一个全面的QA数据集采样工具,使用OpenAI的GPT模型生成答案。该工具帮助您从大规模数据集(如MS MARCO)创建高质量的问答数据集。
|
||
|
||
## 功能特性
|
||
|
||
- **智能采样**:智能地从大型数据集中采样查询、文档和相关性判断
|
||
- **答案生成**:使用OpenAI的GPT模型自动生成高质量答案
|
||
- **断点续传**:支持中断后继续生成,从上次位置开始
|
||
- **进度跟踪**:实时进度更新和统计信息
|
||
- **结果可视化**:易于阅读的问答对展示,包含完整上下文
|
||
|
||
## 安装指南
|
||
|
||
### 系统要求
|
||
|
||
- Python 3.7+
|
||
- OpenAI API密钥
|
||
|
||
### 安装依赖
|
||
|
||
```bash
|
||
pip install pandas pyarrow openai
|
||
```
|
||
|
||
### 设置环境变量
|
||
|
||
```bash
|
||
export OPENAI_API_KEY="你的openai-api-key"
|
||
# 可选:使用自定义OpenAI端点
|
||
export OPENAI_BASE_URL="https://api.openai.com/v1"
|
||
```
|
||
|
||
### 准备数据集
|
||
|
||
您可以使用任何符合格式要求的QA数据集,或下载预处理好的样本:
|
||
|
||
**使用HuggingFace/ModelScope样本**
|
||
我们提供了来自流行QA数据集的预处理样本:
|
||
- MarkrAI/eli5_sample_autorag
|
||
- MarkrAI/msmarco_sample_autorag
|
||
- MarkrAI/triviaqa_sample_autorag
|
||
- gnekt/hotpotqa_small_sample_autorag
|
||
|
||
**使用您自己的数据集**
|
||
确保您的数据集包含以下文件:
|
||
- `queries.parquet`(列:id, text)
|
||
- `corpus.parquet`(列:id, text)
|
||
- `qrels.parquet`(列:qid, pid)
|
||
|
||
## 快速开始
|
||
|
||
### 1. 从大型数据集采样
|
||
|
||
首先,从完整数据集中采样查询、文档和相关性判断的子集:
|
||
|
||
```bash
|
||
python dataset/qa_dataset.py sample \
|
||
--queries ~/dataset/mmarco-queries.parquet \
|
||
--corpus ~/dataset/mmarco-corpus.parquet \
|
||
--qrels ~/dataset/mmarco-qrels.parquet \
|
||
--nq 100 \
|
||
--output_dir ./dataset/samples
|
||
```
|
||
|
||
### 2. 生成答案
|
||
|
||
使用OpenAI的GPT模型为采样的问答生成答案:
|
||
|
||
```bash
|
||
python dataset/qa_dataset.py generate \
|
||
--input_dir ./dataset/samples \
|
||
--output_dir ./dataset/samples
|
||
```
|
||
|
||
### 3. 查看结果
|
||
|
||
展示生成的问答对及其上下文:
|
||
|
||
```bash
|
||
python dataset/qa_dataset.py show \
|
||
--input_dir ./dataset/samples \
|
||
-n 5
|
||
```
|
||
|
||
## 详细使用说明
|
||
|
||
### 采样命令
|
||
|
||
从完整数据集中创建代表性样本。
|
||
|
||
```bash
|
||
python dataset/qa_dataset.py sample [选项]
|
||
```
|
||
|
||
**必需参数:**
|
||
- `--queries`:查询parquet文件路径(列:`id`, `text`)
|
||
- `--corpus`:语料库parquet文件路径(列:`id`, `text`)
|
||
- `--qrels`:相关性判断parquet文件路径(列:`qid`, `pid`)
|
||
|
||
**可选参数:**
|
||
- `--nq`:要采样的查询数量(默认:1000)
|
||
- `--output_dir`:采样数据输出目录(默认:./save)
|
||
|
||
**示例:**
|
||
```bash
|
||
python dataset/qa_dataset.py sample \
|
||
--queries data/queries.parquet \
|
||
--corpus data/corpus.parquet \
|
||
--qrels data/qrels.parquet \
|
||
--nq 500 \
|
||
--output_dir ./my_sample
|
||
```
|
||
|
||
### 生成命令
|
||
|
||
使用OpenAI API为采样问题生成答案。
|
||
|
||
```bash
|
||
python dataset/qa_dataset.py generate [选项]
|
||
```
|
||
|
||
**必需参数:**
|
||
- `--input_dir`:包含采样数据的目录(queries.parquet, corpus.parquet, qrels.parquet)
|
||
|
||
**可选参数:**
|
||
- `--output_dir`:生成答案的输出目录(默认:./save)
|
||
|
||
**特性:**
|
||
- **断点续传**:中断后自动从上次位置继续
|
||
- **错误处理**:API调用失败自动重试3次
|
||
- **进度保存**:每成功生成一个答案就保存进度
|
||
|
||
**示例:**
|
||
```bash
|
||
python dataset/qa_dataset.py generate \
|
||
--input_dir ./my_sample \
|
||
--output_dir ./my_sample
|
||
```
|
||
|
||
### 展示命令
|
||
|
||
展示生成的问答对及完整上下文。
|
||
|
||
```bash
|
||
python dataset/qa_dataset.py show [选项]
|
||
```
|
||
|
||
**必需参数:**
|
||
- `--input_dir`:包含QA数据的目录(queries.parquet, corpus.parquet, qrels.parquet, qas.parquet, answers.parquet)
|
||
|
||
**可选参数:**
|
||
- `-n`:要展示的结果数量(默认:5)
|
||
|
||
**示例:**
|
||
```bash
|
||
python dataset/qa_dataset.py show \
|
||
--input_dir ./my_sample \
|
||
-n 3
|
||
```
|
||
|
||
## 输入数据格式
|
||
|
||
### 查询文件 (queries.parquet)
|
||
| 列名 | 类型 | 描述 |
|
||
|------|------|------|
|
||
| id | string | 唯一查询标识符 |
|
||
| text | string | 实际的问题文本 |
|
||
|
||
### 语料库文件 (corpus.parquet)
|
||
| 列名 | 类型 | 描述 |
|
||
|------|------|------|
|
||
| id | string | 唯一段落/文档标识符 |
|
||
| text | string | 段落/文档内容 |
|
||
|
||
### 相关性判断文件 (qrels.parquet)
|
||
| 列名 | 类型 | 描述 |
|
||
|------|------|------|
|
||
| qid | string | 查询ID(匹配queries.id) |
|
||
| pid | string | 段落ID(匹配corpus.id) |
|
||
|
||
## 输出文件
|
||
|
||
运行所有命令后,输出目录将包含:
|
||
|
||
### 采样数据
|
||
- `queries.parquet`:采样的查询子集
|
||
- `corpus.parquet`:采样的文档子集
|
||
- `qrels.parquet`:采样的相关性判断
|
||
|
||
### 生成的答案
|
||
- `answers.parquet`:生成的答案(含唯一ID)
|
||
- `qas.parquet`:问答映射(qid → aid)
|
||
|
||
## 高级用法
|
||
|
||
### 自定义OpenAI配置
|
||
|
||
您可以使用不同的OpenAI模型或端点:
|
||
|
||
```bash
|
||
# 使用GPT-4 Turbo
|
||
export OPENAI_API_KEY="你的密钥"
|
||
python dataset/qa_dataset.py generate --input_dir ./samples
|
||
|
||
# 使用Azure OpenAI
|
||
export OPENAI_API_KEY="azure密钥"
|
||
export OPENAI_BASE_URL="https://你的资源.openai.azure.com/openai/deployments/gpt-4"
|
||
python dataset/qa_dataset.py generate --input_dir ./samples
|
||
```
|
||
|
||
### 大型数据集采样
|
||
|
||
对于非常大的数据集,建议分批采样:
|
||
|
||
```bash
|
||
# 第一批
|
||
python dataset/qa_dataset.py sample --nq 1000 --output_dir ./batch1
|
||
python dataset/qa_dataset.py generate --input_dir ./batch1
|
||
|
||
# 第二批
|
||
python dataset/qa_dataset.py sample --nq 1000 --output_dir ./batch2
|
||
python dataset/qa_dataset.py generate --input_dir ./batch2
|
||
```
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
**1. OpenAI API错误**
|
||
- 确保API密钥设置正确:`echo $OPENAI_API_KEY`
|
||
- 检查API配额和账单状态
|
||
- 验证与OpenAI的网络连接
|
||
|
||
**2. 大数据集内存问题**
|
||
- 减小`--nq`参数以获得更小的样本
|
||
- 确保pandas操作有足够的RAM
|
||
- 考虑使用更小的parquet文件
|
||
|
||
**3. 文件未找到错误**
|
||
- 验证所有输入文件路径是否正确
|
||
- 确保parquet文件有正确的列名
|
||
- 检查文件权限
|
||
|
||
### 调试模式
|
||
|
||
通过添加打印语句或使用Python调试器启用详细输出:
|
||
|
||
```bash
|
||
python -m pdb dataset/qa_dataset.py sample --queries ...
|
||
```
|
||
|
||
## 示例工作流
|
||
|
||
```bash
|
||
# 1. 设置环境
|
||
export OPENAI_API_KEY="sk-..."
|
||
|
||
# 2. 从MS MARCO采样200个查询
|
||
python dataset/qa_dataset.py sample \
|
||
--queries ~/mmarco/queries.parquet \
|
||
--corpus ~/mmarco/corpus.parquet \
|
||
--qrels ~/mmarco/qrels.parquet \
|
||
--nq 200 \
|
||
--output_dir ./marco_sample
|
||
|
||
# 3. 生成答案(根据API速率限制可能需要一些时间)
|
||
python dataset/qa_dataset.py generate \
|
||
--input_dir ./marco_sample \
|
||
--output_dir ./marco_sample
|
||
|
||
# 4. 查看结果
|
||
python dataset/qa_dataset.py show \
|
||
--input_dir ./marco_sample \
|
||
-n 10
|
||
```
|
||
|
||
## 贡献
|
||
|
||
欢迎提交问题和功能增强请求!
|
||
|
||
## 许可证
|
||
|
||
MIT许可证 - 可自由用于研究和项目。 |