---
title: PrefixBench
canonical_url: "https://www.modelscope.cn/datasets/keriko/PrefixBench"
md_url: "https://www.modelscope.cn/datasets/keriko/PrefixBench.md"
repository: keriko/PrefixBench
chinese_name: "前缀复用测试"
last_updated: 2026-03-10
license: apache-2.0
storage_size: "8.8 GB"
downloads: 310
stars: 1
---

# PrefixBench

> PrefixBench - keriko 在 ModelScope 开源的数据集。面向大语言模型长序列推理的 KV Cache 前缀复用性能评估数据集。

keriko/PrefixBench 是 ModelScope 魔搭社区上的数据集，存储大小 8.8 GB，采用 apache-2.0 许可。

- **Repository**: keriko/PrefixBench
- **License**: apache-2.0
- **Storage size**: 8.8 GB
- **Downloads**: 310
- **Stars**: 1
- **Last updated**: 2026-03-10

Source: https://www.modelscope.cn/datasets/keriko/PrefixBench

---

# PrefixBench: 面向大语言模型长序列推理的 KV Cache 前缀复用性能评估基准

## 简介

PrefixBench 是一个专门用于评估大语言模型（LLM）长序列推理场景下 KV Cache 前缀复用性能的基准数据集。通过模拟真实应用中"共享上下文 + 不同问题"的访问模式，PrefixBench 能够准确测试模型在多轮对话、文档问答、代码生成等场景中的缓存复用效率。

**数据集地址**：https://modelscope.cn/datasets/keriko/PrefixBench

### 核心特性

- ✅ **前缀复用优化**：每个基础文本对应 2-5 个变体问题，形成"共享前缀 + 不同问题"的测试组
- ✅ **多场景覆盖**：支持文档理解、代码生成、对话交互、推理问答等多种场景
- ✅ **多语言支持**：包含中英文双语样本，覆盖通用领域和专业领域
- ✅ **长度分级**：提供 8K/16K/32K/64K/128K 五个上下文窗口级别
- ✅ **正态分布**：文本长度服从正态分布 N(μ, σ²)，模拟真实应用场景
- ✅ **工具链兼容**：原生支持 EvalScope、AIS Bench，一键适配 vLLM Bench

## 数据集统计

| 数据集 | 上下文窗口 | 总条数 |
|:---|:---|:---|
| `data_8k_sequential.jsonl` | 8K | 4,419 |
| `data_8k_random.jsonl` | 8K | 4,419 |
| `data_16k_sequential.jsonl` | 16K | 5,005 |
| `data_16k_random.jsonl` | 16K | 5,005 |
| `data_32k_sequential.jsonl` | 32K | 5,841 |
| `data_32k_random.jsonl` | 32K | 5,841 |
| `data_64k_sequential.jsonl` | 64K | 7,277 |
| `data_64k_random.jsonl` | 64K | 7,277 |
| `data_128k_sequential.jsonl` | 128K | 8,713 |
| `data_128k_random.jsonl` | 128K | 8,713 |

**总计**：10 个文件，共 31,255 条测试样本

### Token 分布详情

#### 8K 数据集
- **范围**：3,014 ~ 8,144 tokens
- **中位数**：6,274 tokens
- **平均**：6,246 tokens
- **标准差**：911 tokens
- **分位数**：25%=5,610, 75%=6,945, 90%=7,462, 95%=7,665

#### 16K 数据集
- **范围**：5,606 ~ 16,383 tokens
- **中位数**：12,471 tokens
- **平均**：12,367 tokens
- **标准差**：1,882 tokens
- **分位数**：25%=11,092, 75%=13,791, 90%=14,761, 95%=15,241

#### 32K 数据集
- **范围**：11,558 ~ 32,666 tokens
- **中位数**：24,265 tokens
- **平均**：24,174 tokens
- **标准差**：3,958 tokens
- **分位数**：25%=21,442, 75%=27,153, 90%=29,449, 95%=30,482

#### 64K 数据集
- **范围**：13,558 ~ 65,473 tokens
- **中位数**：45,284 tokens
- **平均**：45,856 tokens
- **标准差**：9,566 tokens
- **分位数**：25%=38,540, 75%=53,102, 90%=59,872, 95%=62,297

#### 128K 数据集
- **范围**：45,645 ~ 131,030 tokens
- **中位数**：121,279 tokens
- **平均**：117,220 tokens
- **标准差**：10,933 tokens
- **分位数**：25%=119,694, 75%=122,159, 90%=123,074, 95%=123,735

> **注意**: 以上统计数据使用 tiktoken (cl100k_base 编码)精确计算得出。如需重新计算或获取更详细的统计信息,可运行 `scripts/analyze_dataset.py` 脚本。

### 数据来源

PrefixBench 基于以下高质量数据源构建：

- **中文小说**：3,132 本小说（来自原始 Book 目录 + xiaoshuo02 扩展目录）
- **英文小说**：74 本经典英文小说
- **开源代码**：25 个经典开源项目（约 82,545 个代码文件）

**总样本生成数**：242,380 个原始样本，经正态分布采样后得到最终 50,000 个测试样本

### 场景分布

| 场景类型 | 占比 | 说明 |
|:---|:---|:---|
| 小说理解 | 70% | 小说内容分析、情节预测、人物关系分析 |
| 代码理解 | 30% | 代码功能解释、优化建议、重构方案 |

### 组结构统计

每个基础文本生成 2-5 个变体问题，共享相同 `group_id`：

| 数据集 | 唯一组数 | 平均每组样本数 |
|:---|:---|:---|
| 8K | 1,250 | 3.5 |
| 16K | 1,427 | 3.5 |
| 32K | 1,666 | 3.5 |
| 64K | 2,083 | 3.5 |
| 128K | 2,500 | 3.5 |

## 数据格式

### PrefixBench 原生格式

```jsonl
{"question": "长文档内容...\n\n问题：基于该文档的具体问题1？", "group_id": "uuid-001", "turn_id": 1}
{"question": "长文档内容...\n\n问题：基于该文档的具体问题2？", "group_id": "uuid-001", "turn_id": 2}
{"question": "长文档内容2...\n\n问题：基于该文档2的具体问题1？", "group_id": "uuid-002", "turn_id": 1}
```

**字段说明**：

- `question`：完整的 prompt，包含共享前缀文本 + 具体问题（用 `\n\n` 分隔）
- `group_id`：测试组唯一标识，同组共享相同前缀文本
- `turn_id`：组内问题序号（1~N），用于控制请求顺序

### 版本说明

每个数据集提供两个版本：

- **`sequential`**：按 `group_id` 排序，同一组的样本连续排列，**最大化前缀复用**
  - 连续率随上下文长度增长而提升（22.1% → 65.8%）
  - 8K：22.1% 连续率，平均组间隔 3.9 行
  - 16K：31.7% 连续率，平均组间隔 3.2 行
  - 32K：49.1% 连续率，平均组间隔 2.0 行
  - 64K：63.9% 连续率，平均组间隔 1.6 行
  - 128K：65.8% 连续率，平均组间隔 1.5 行

- **`random`**：随机打乱顺序，**防止缓存命中**（用于对比测试）
  - 平均间隔：1,079 ~ 1,490 行
  - 平均 Token 距离：15M ~ 79M tokens（随数据集大小增长）
  - 8K：平均间隔 1,490 行，Token 距离 15.1M
  - 16K：平均间隔 1,408 行，Token 距离 27.5M
  - 32K：平均间隔 1,261 行，Token 距离 45.1M
  - 64K：平均间隔 1,099 行，Token 距离 62.2M
  - 128K：平均间隔 1,080 行，Token 距离 79.4M

## 快速开始

### 下载

#### 方法 1：使用 ModelScope CLI（推荐）

```bash
# 安装 ModelScope CLI
pip install modelscope

# 下载数据集到本地
modelscope download --dataset keriko/PrefixBench

# 或指定下载目录
modelscope download --dataset keriko/PrefixBench --local_dir ./PrefixBench
```

#### 方法 2：从 GitHub 克隆

```bash
git clone https://www.modelscope.cn/datasets/keriko/PrefixBench.git
cd PrefixBench
```

#### 方法 3：使用 Python API

```python
from modelscope import snapshot_download

# 下载数据集到本地
model_dir = snapshot_download('keriko/PrefixBench')

# 或指定下载目录
model_dir = snapshot_download('keriko/PrefixBench', cache_dir='./datasets')
```

### 加载示例

```python
import json

# 加载数据集
with open('data_8k_sequential.jsonl', 'r', encoding='utf-8') as f:
    samples = [json.loads(line) for line in f]

# 查看样本
print(f"总样本数: {len(samples)}")
print(f"前缀组数: {len(set(s['group_id'] for s in samples))}")

# 查看第一个样本
sample = samples[0]
print(f"问题: {sample['question'][:100]}...")
print(f"组ID: {sample['group_id']}")
print(f"轮次: {sample['turn_id']}")
```

## 工具链使用指南

### 1. EvalScope（原生支持）

EvalScope 的 `openqa` 格式直接兼容 PrefixBench 原生格式。

```bash
evalscope perf \
    --url "http://127.0.0.1:8000/v1/chat/completions" \
    --parallel 100 \
    --model Qwen3-32B \
    --tokenizer-path /models/Qwen3-32B \
    --api openai \
    --dataset openqa \
    --dataset-path data_8k_sequential.jsonl \
    --stream
```
测试结果
![EvalScope 测试](image/img-1.jpg)
### 2. AIS Bench（原生支持）

AIS Bench 的 QA 格式兼容 PrefixBench。

```bash
# 使用 PrefixBench 原生格式（无需转换）
ais_bench \
    --models mindie_stream_api_general \
    --custom-dataset-path data_8k_sequential.jsonl \
    --custom-dataset-data-type qa \
    --custom-dataset-infer-method gen
```

### 3. vLLM Bench（需转换）

使用转换脚本将 PrefixBench 转换为 ShareGPT 格式。

#### 步骤 1：转换格式

```bash
# 转换单个文件
python scripts/convert_to_sharegpt.py \
    --single data/data_8k_sequential.jsonl

# 批量转换所有文件
python scripts/convert_to_sharegpt.py \
    --input data \
    --output data/sharegpt \
    --dataset 8k 16k 32k \
    --version sequential
```

**输出**：`sharegpt_8k_sequential.jsonl`

#### 步骤 2：使用 vLLM Bench 压测

```bash
vllm bench serve \
    --max-concurrency 50 \
    --num-prompts 5000 \
    --host 127.0.0.1 \
    --port 8000 \
    --backend openai-chat \
    --model Qwen2.5-32B-Instruct \
    --dataset-name sharegpt \
    --dataset-path sharegpt_8k_sequential.jsonl \
    --sharegpt-output-len 512 \
    --tokenizer Qwen/Qwen2.5-32B-Instruct \
    --endpoint /v1/chat/completions
```

**关键参数**：
- `--dataset-path`：转换后的 ShareGPT 格式文件
- `--sharegpt-output-len`：设置期望输出长度（建议 512-1024）
- `--tokenizer`：与模型保持一致

## 性能指标解读

### 关键指标

使用 PrefixBench 进行性能测试时，应关注以下指标：

| 指标 | 说明 | 计算方法 |
|:---|:---|:---|
| **首字延迟（TTFT）** | 第一个 token 的生成时间 | Time to First Token |
| **Token 生成速度** | 每秒生成的 token 数 | Tokens / Second |
| **总延迟** | 完整请求的响应时间 | End-to-End Latency |
| **缓存命中率** | 前缀缓存命中比例 | Hit Groups / Total Groups |
| **吞吐量** | 每秒处理的请求数 | Requests / Second |
| **GPU 内存利用率** | 显存占用情况 | N/A |

### 对比分析

**Sequential vs Random 对比**：

- 使用 `sequential` 版本测试：评估**最佳情况**下的前缀复用性能
- 使用 `random` 版本测试：评估**无缓存**时的基准性能
- 对比两者差异：量化 KV Cache 前缀复用的**性能提升**

**示例分析**：

```bash
# 测试缓存命中性能（sequential）
evalscope perf --dataset-path data_8k_sequential.jsonl ...

# 测试无缓存性能（random）
evalscope perf --dataset-path data_8k_random.jsonl ...

# 计算加速比
加速比 = Random平均延迟 / Sequential平均延迟
```


## 项目结构

```
PrefixBench/
├── data/                           # 数据集文件
│   ├── data_8k_sequential.jsonl    # 8K 顺序版本
│   ├── data_8k_random.jsonl        # 8K 随机版本
│   ├── ... (共10个文件)
├── scripts/                        # 工具脚本
│   └── convert_to_sharegpt.py      # 格式转换脚本
├── utils/                          # 工具模块
│   ├── data_loader.py              # 数据加载器
│   └── prefix_generator.py         # 前缀组生成器
└── README.md                       # 本文档
```

## 引用

如果您在研究中使用了 PrefixBench，请引用：

```bibtex
@misc{prefixbench2024,
  title={PrefixBench: A Benchmark for Evaluating KV Cache Prefix Reuse in Long-Context LLMs},
  author={PrefixBench Team},
  year={2026},
  howpublished={\url{https://modelscope.cn/datasets/keriko/PrefixBench}}
}
```

## 许可证

本项目采用 Apache 2.0 许可证。

## 贡献

欢迎提交 Issue 和 Pull Request！

## 致谢

感谢以下开源项目和数据源：

**数据源**：
- **Project Gutenberg** - 公版英文小说资源
- **GitHub** - 开源代码项目托管平台
- **中文小说资源** - 各类中文小说文本

**工具框架**：
- [tiktoken](https://github.com/openai/tiktoken) - OpenAI 的 Token 计数工具
- [EvalScope](https://github.com/modelscope/evalscope) - 模型评估框架
- [vLLM](https://github.com/vllm-project/vllm) - 高性能 LLM 推理引擎
- [ModelScope](https://modelscope.cn/) - 模型社区和数据集托管平台

---

**数据集地址**：https://modelscope.cn/datasets/keriko/PrefixBench

**最后更新**：2026年3月10日
