Files
siemens_ragas/docs/sample-pdf-question-bank-workflow.md
2026-06-12 14:02:15 +08:00

223 lines
6.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# `sample-pdf-question-bank` 端到端使用说明
这篇文档对应仓库里的真实案例:先把 PDF 解析成 question bank再用 online evaluator 基于证据 chunk 生成答案并打分。
完整链路是:
```text
PDFs
-> dataset_build
-> sample-pdf-question-bank.csv + latest/source_chunks.jsonl
-> online adapter
-> answer + contexts
-> ragas metrics
```
## 1. 先准备环境
先复制环境变量模板:
```powershell
Copy-Item .env.example .env
```
这条案例链路依赖两类能力:
- OpenAI 兼容模型
- `OPENAI_API_KEY`
- `OPENAI_BASE_URL`
- 阿里云文档解析
- `ALIBABA_ACCESS_KEY_ID`
- `ALIBABA_ACCESS_KEY_SECRET`
- `ALIBABA_ENDPOINT`
默认还会用到这些模型配置:
- `DATASET_GENERATOR_MODEL=qwen3.6-plus`
- `RAGAS_JUDGE_MODEL=deepseek-v4-flash`
- `RAGAS_EMBEDDING_MODEL=text-embedding-v3`
如果少了 `OPENAI_API_KEY`dataset build 里的题库生成和 online eval 都无法运行。
如果少了阿里云凭据PDF 解析阶段无法运行。
## 2. 跑 dataset build
使用 sample 配置:
- config: [scenarios/dataset_build/sample-pdf-build.yaml](/C:/Users/A200477427/Learnings/ragas-template/scenarios/dataset_build/sample-pdf-build.yaml)
执行命令:
```powershell
uv run main.py --dataset-build-config scenarios/dataset_build/sample-pdf-build.yaml
or
.\.venv\Scripts\python.exe main.py --dataset-build-config scenarios/dataset_build/sample-pdf-build.yaml
```
这一步会做四件事:
1. 扫描 `datasets/raw/pdfs` 下的 PDF
2. 调用阿里云解析生成结构化 `source chunks`
3. 调用 LLM 生成 question bank 草稿
4. 写出稳定 dataset 和详细 run 资产
## 3. 看 build 产物
跑完以后,你会看到两类输出。
第一类是稳定入口,给后续 online eval 和教程使用:
- question bank CSV:
[datasets/raw/generated/sample-pdf-question-bank.csv](/C:/Users/A200477427/Learnings/ragas-template/datasets/raw/generated/sample-pdf-question-bank.csv)
- latest source chunks:
[source_chunks.jsonl](/C:/Users/A200477427/Learnings/ragas-template/outputs/dataset-builds/sample-pdf-question-bank/latest/source_chunks.jsonl)
- latest dataset draft:
[dataset_draft.csv](/C:/Users/A200477427/Learnings/ragas-template/outputs/dataset-builds/sample-pdf-question-bank/latest/dataset_draft.csv)
- latest metadata:
[metadata.json](/C:/Users/A200477427/Learnings/ragas-template/outputs/dataset-builds/sample-pdf-question-bank/latest/metadata.json)
第二类是带时间戳的 run 级资产,用来审计和排查:
- 目录模式:
`outputs/dataset-builds/sample-pdf-question-bank/<run_id>/`
其中常见文件有:
- `documents.jsonl`
- `semantic_blocks.jsonl`
- `source_chunks.jsonl`
- `dataset_draft.csv`
- `parse_failures.csv`
- `metadata.json`
理解这个区别很重要:
- 稳定入口用于“继续往下跑”
- 时间戳目录用于“回看某次具体构建”
## 4. question bank CSV 里是什么
sample build 输出的是 online-ready question bank不是离线评测格式。
核心字段包括:
- `question`
- `ground_truth`
- `source_chunk_ids`
- `doc_id`
- `doc_name`
它故意不预写 `answer`
原因是这条链路的目标是在线评测:由 adapter 在评测时,根据 `source_chunk_ids``source_chunks.jsonl` 里取证据,再调用模型生成 `answer`
## 5. 跑 online eval
使用 sample online scenario
- scenario: [scenarios/online/sample-pdf-question-bank-online.yaml](/C:/Users/A200477427/Learnings/ragas-template/scenarios/online/sample-pdf-question-bank-online.yaml)
- adapter: [apps/pdf_question_bank/adapter.py](/C:/Users/A200477427/Learnings/ragas-template/apps/pdf_question_bank/adapter.py)
执行命令:
```powershell
uv run main.py --scenario scenarios/online/sample-pdf-question-bank-online.yaml
or
.\.venv\Scripts\python.exe main.py --scenario scenarios/online/sample-pdf-question-bank-online.yaml
```
这个 scenario 的关键点有两个:
1. dataset 指向稳定 question bank CSV
2. `app_adapter.static_kwargs.source_chunks_path` 指向稳定的 `latest/source_chunks.jsonl`
因此,只要你重新跑过 sample dataset buildonline scenario 就不需要再手改时间戳路径。
## 6. online adapter 在做什么
`apps/pdf_question_bank/adapter.py` 的处理方式是固定的:
1. 从题库行里读取 `source_chunk_ids`
2. 打开 `source_chunks.jsonl`
3. 只解析被引用的 chunk
4. 把这些 chunk 文本原样作为 `contexts`
5. 用这些证据 prompt 模型生成 `answer`
6.`resolved_chunk_ids` 和模型响应写进 `raw_response`
所以评测关系是:
- `ground_truth` 是参考答案
- `answer` 是运行时生成答案
- `contexts` 是题目显式引用的证据块
这条链路没有单独做 retrieval。
它评测的是“给定明确证据后,应用/模型能否稳定生成正确答案”。
## 7. 结果在哪里看
online eval 完成后,结果会写到:
- `outputs/online/sample-pdf-question-bank/<run_id>/`
常见文件包括:
- `scores.csv`
- `invalid.csv`
- `summary.md`
- `metadata.json`
优先看这几个点:
- `scores.csv`:逐题指标分数
- `invalid.csv`:哪些样本因为 adapter 失败或空结果被剔除了
- `summary.md`:汇总视图
## 8. 常见问题
### `source_chunk_ids` 找不到
这通常表示 question bank CSV 和 `source_chunks.jsonl` 不是同一次 build 的产物。
正确做法:
1. 重新跑一次 `sample-pdf-build.yaml`
2. 确认 `outputs/dataset-builds/sample-pdf-question-bank/latest/source_chunks.jsonl` 已更新
3. 再运行 online scenario
### dataset build 成功,但 online eval 结果是 invalid
先看 `invalid.csv`
当前实现里,以下情况会进入 invalid
- adapter 生成 `answer` 为空
- adapter 返回 `contexts` 为空
- adapter 在解析 chunk 或调模型时抛异常
### 只想快速看离线 smoke不想重建题库
直接运行:
- [scenarios/offline/sample-pdf-offline-smoke.yaml](/C:/Users/A200477427/Learnings/ragas-template/scenarios/offline/sample-pdf-offline-smoke.yaml)
这个案例是固化好的离线 smoke dataset不依赖 online adapter。
## 9. 换成你自己的 PDF 时改哪里
如果你要复用这条模式处理自己的 PDF最少只改这几个点
1. 复制一份 dataset build YAML
2. 修改 `input.path` 指向你的 PDF 或 PDF 目录
3. 修改 `output.dataset_path` 为你的 question bank CSV
4. 修改 `output.artifact_dir` 为你的 build 资产根目录
5. 复制一份 online scenario
6. 修改 `dataset` 指向你的 question bank CSV
7. 修改 `app_adapter.static_kwargs.source_chunks_path` 指向你的 `artifact_dir/latest/source_chunks.jsonl`
不需要改 question bank CSV 的字段结构。
也不需要把 `answer` 预先写进 CSV。
如果你的 online answer 逻辑仍然是“根据显式证据块生成答案”,就可以继续复用:
- [apps/pdf_question_bank/adapter.py](/C:/Users/A200477427/Learnings/ragas-template/apps/pdf_question_bank/adapter.py)
如果你的应用是 HTTP 服务或有自己独立的 RAG 流程,再换成对应 adapter 即可。