在RAG(检索增强生成)系统评测中,高质量的问答对数据集是验证系统效果的关键。传统方式依赖人工从文档中逐条编写问题和答案,耗时耗力且难以规模化,成为制约RAG评测效率的主要瓶颈。

本系统通过多Agent协同架构,实现了从PDF文档到问答对的自动化生成。系统利用MinerU API精准解析PDF(支持公式、表格、OCR),采用双Agent并行出题策略,同时生成直白问题和逻辑推理问题两类题型,并基于Jaccard相似度智能去重。整个过程从文档解析、文本切片、题目生成到Excel输出全流程自动化,大幅降低了人工成本,提升了评测数据的生产效率,为RAG系统的快速迭代和效果验证提供了可靠的数据支撑

作者:百度智能云 谭文涛

图片

系统架构

┌──────────────────────────────────────────────────────────────┐
│                    PDF智能出题协同环境                          │
│                                                              │
│  Step 1: MinerU API ───→ PDF → Markdown                      │
│              │                                               │
│  Step 2: 文本切片 ────→ Markdown → 512字符切片                  │
│              │                                               │
│         ┌────┴────┐                                          │
│         ▼         ▼                                          │
│  ┌────────────┐  ┌────────────┐                              │
│  │ 直白问题    │  │ 逻辑问题    │  ← 并行 (asyncio.gather)      │
│  │ Agent      │  │ Agent      │                              │
│  │ (直接回答)  │  │ (推理判断)   │                              │
│  └─────┬──────┘  └─────┬──────┘                              │
│        │               │                                     │
│        └───────┬───────┘                                     │
│                ▼                                             │
│         汇总去重 + Excel输出                                   │
│                                                              │
│  ┌─────────────┐  ┌─────────────┐                            │
│  │ MinerU API  │  │ 千帆/Ollama │                             │
│  │ (PDF解析)   │  │ (LLM出题)   │                             │
│  └─────────────┘  └─────────────┘                            │
└──────────────────────────────────────────────────────────────┘

协作模式:串行解析 → 并行出题(Fan-out) → 串行汇总

核心理念

  • MinerU解析

    :调用在线API将PDF精准转为Markdown(支持公式、表格、OCR)

  • 完整段落切片

    :按512字符切分,保持段落边界完整

  • 双Agent并行出题

    :直白问题+逻辑问题两类题型同时生成

  • 智能去重

    :基于Jaccard关键词相似度去重,避免重复题目

图片

项目结构

pdf-question-generator/
├── main.py                    # 主入口
├── config.py                  # 全局配置
├── merger.py                  # 汇总去重+Excel输出
├── core/
│   ├── __init__.py
│   ├── llm_client.py          # LLM客户端(千帆+Ollama双后端)
│   ├── pdf_parser.py          # MinerU API PDF解析
│   ├── text_splitter.py       # 文本切片(512字符+完整段落)
│   └── prompt_loader.py       # 提示词模板加载器
├── agents/
│   ├── __init__.py
│   ├── base_agent.py          # Agent基类
│   ├── direct_agent.py        # 直白问题Agent
│   └── logic_agent.py         # 逻辑问题Agent
├── prompts/
│   ├── direct_agent.md        # 直白问题提示词
│   └── logic_agent.md         # 逻辑问题提示词
├── output/                    # 输出目录
└── requirements.txt

快速开始

1. 安装依赖

pip install -r requirements.txt

2. 运行

# 默认模式:千帆LLM + 本地PDF文件
python3 main.py 'output/train.pdf'

# 通过URL解析PDF
python3 main.py --url https://example.com/paper.pdf

# 切换到Ollama
python3 main.py --ollama 'output/train.pdf'

# 自定义参数
python3 main.py --chunk-size 256 --num-direct 3 --num-logic 3 ./doc.pdf

3. 查看帮助

python3 main.py help

运行参数

参数

说明

默认值

--ollama

切换到Ollama后端

千帆

--url

通过URL解析PDF

本地文件

--chunk-size N

切片字符数

512

--num-direct N

每切片直白问题数

5

--num-logic N

每切片逻辑问题数

5

环境变量配置

环境变量

说明

默认值

LLM_PROVIDER

LLM后端 (qianfan/ollama)

qianfan

QIANFAN_API_KEY

千帆API密钥

(内置)

QIANFAN_MODEL

千帆模型名

ernie-x1-turbo-32k

OLLAMA_BASE_URL

Ollama服务地址

http://localhost:11434

OLLAMA_MODEL

Ollama模型名

qwen2.5:7b

MINERU_TOKEN

MinerU API Token

(内置)

MINERU_MODEL_VERSION

MinerU模型版本

vlm

CHUNK_SIZE

切片字符数

512

NUM_DIRECT_QUESTIONS

每切片直白问题数

5

NUM_LOGIC_QUESTIONS

每切片逻辑问题数

5

SIMILARITY_THRESHOLD

去重相似度阈值

0.7

输出文件

运行后在 output/ 目录下生成:

文件

说明

parsed_content.md

MinerU解析的Markdown原文

{文件名}_questions.xlsx

Excel问答对(序号、问题、答案、题目类型)

{文件名}_questions.json

JSON格式备份

两种题型对比

维度

直白问题

逻辑问题

特点

原文直接回答

需要推理判断

示例

"事故轻伤人数是怎么定义的?"

"小明因事故需卧床90天,属于轻伤还是重伤?"

Excel颜色

蓝色底色

黄色底色

项目源码

项目源码详见顶部资源包

更多推荐