QA_Merger
713 字约 2 分钟
2026-01-20
📘 概述
QA_Merger 是一个用于合并题目与答案的后处理算子。它通常接收来自 LLMOutputParser 的两个独立输出(一个是提取的题目列表,另一个是提取的答案列表),并将它们按照章节标题和题目序号匹配合并为完整的问答对(QA Pairs)。
主要功能:
- 双向合并:根据章节标题或序号逻辑,将题目、答案、解题步骤和标签组合在一起。
- 格式转换:将合并后的
.jsonl数据自动转换为易于阅读的.md(Markdown)格式。 - 数据平铺(Explode):将原本按文件组织的 DataFrame 行,按 QA 对进行拆分。原本一个文件占一行,执行后每个 QA 对将占据一行,方便后续细粒度的处理。
__init__ 函数
def __init__(self, output_dir: str, strict_title_match: bool = False)init 参数说明
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| output_dir | str | 必需 | 合并后文件的输出根目录。 |
| strict_title_match | bool | False | 是否开启严格标题匹配。若为 True,则合并时会严格校验章节标题。若为False,校验前会尝试从标题中提取中文/英文序号 |
run 函数
def run(self,
storage: DataFlowStorage,
input_question_qalist_path_key: str,
input_answer_qalist_path_key: str,
input_name_key: str,
output_merged_qalist_path_key: str,
output_merged_md_path_key: str,
output_qa_item_key: str = "qa_item"
)执行合并逻辑:读取题目和答案的 JSONL 文件,调用内置工具函数合并,并更新存储。
参数说明
| 名称 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| storage | DataFlowStorage | 必需 | 数据流存储实例。 |
| input_question_qalist_path_key | str | 必需 | 题目 JSONL 文件的路径列名。 |
| input_answer_qalist_path_key | str | 必需 | 答案 JSONL 文件的路径列名。 |
| input_name_key | str | 必需 | 任务名称列名,用于创建输出子目录。 |
| output_merged_qalist_path_key | str | 必需 | 合并后 JSONL 文件的存储路径列名。 |
| output_merged_md_path_key | str | 必需 | 合并后 Markdown 文件的存储路径列名。 |
| output_qa_item_key | str | "qa_item" | 关键参数:展开后的 QA 内容存储列名。每行将包含一个具体的问答对字典。 |
🧠 核心逻辑:数据展开 (Explode)
与其他算子不同,QA_Merger 会改变 DataFrame 的行数。
- 合并文件:它首先在磁盘上生成一个
merged_qa_pairs.jsonl,该文件包含该文档的所有问答对。 - 存储对象:将这些问答对以
list形式读入output_qa_item_key列。 - 执行 Explode:调用
dataframe.explode()。
- 处理前:2 行记录(对应 2 个 PDF 文件,各包含 10,5 个 QA 对)。
- 处理后:15 行记录(每行对应 1 个具体的 QA 对,其他列数据如
input_name会自动复制填充)。
🧠 示例结果
🧾 Markdown 输出示例 (merged_qa_pairs.md)
# Chapter: 第一章 导论
**Question 1**: 什么是数据流系统?
**Answer**: 一种...
**Solution**: 数据流系统是一种...
**Label**: 1
---
**Question 2**: [image](images/fig2.png) 请描述此图。
...🧾 DataFrame 展开示例
| index | name | qa_item (列) |
|---|---|---|
| 0 | task_01 | |
| 1 | task_01 | |
| 2 | task_02 |

