RAG评测必备-PDF文件智能出题Agent【附带源码】
在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颜色 |
蓝色底色 |
黄色底色 |
项目源码
项目源码详见顶部资源包
更多推荐
所有评论(0)