以下是对 gc-qa-rag/ragapp/etl_doc/merge.py
文件的详细 Markdown 文档说明:
文档:merge.py
代码详解
文件概述
本文件实现了文档级问答(QA)数据的合并流程,主要用于将主文档的问答结构与其子问答(Sub-QA)及相关元数据进行整合,生成最终可用于下游处理的标准化结构。该模块在数据处理管道(ETL)中处于“合并”阶段,确保每个文档的问答内容、子问答内容和文档元信息能够有机结合,便于后续的检索、分析和展示。
主要类与函数说明
1. QAObject
类
该类用于表示单个问答对象,包含摘要(summary)和问答对列表(possible_qa)。其设计简洁,支持从 JSON 文本直接构建对象(from_json
),并在解析失败时返回空对象,保证了数据处理的健壮性。通过这种封装,便于后续对子问答的递归处理和结构统一。
2. QARoot
类
QARoot
表示整个文档的问答根结构,包含多个问答分组(groups)以及文档级元数据(如产品、URL、标题、类别等)。其构造方法支持从 JSON 文本初始化(from_json
),并提供了 to_dict
方法用于序列化输出。通过这种设计,既能灵活扩展元数据字段,也能保证与下游 JSON 格式的兼容性。
3. merge_qa_sub
函数
这是合并流程的核心函数。其主要逻辑如下:
- 首先将主文档的问答内容解析为
QARoot
对象,并将文档元数据(如产品、URL、标题、类别)写入根对象。 - 遍历所有子问答文件(sub_file_list),每个子文件名中包含分组索引和问答索引(如
xxx_groupIndex_qaIndex
),据此定位到主结构中对应的问答项。 - 读取子问答文件内容,解析为
QAObject
,并将其以Sub
字段的形式嵌入到主问答结构的对应位置,实现主问答与子问答的递归嵌套。 - 返回合并后的
QARoot
对象。
这种设计保证了主问答与子问答的层级关系和数据完整性,便于后续的多层级问答检索和展示。
4. get_folder_paths
函数
该函数根据 ETL 上下文(EtlContext
)动态生成各类中间文件和输出文件的路径,包括主问答、文档元数据、子问答和合并结果等。通过集中管理路径,提升了代码的可维护性和灵活性,便于适配不同产品或数据源。
5. start_merge_doc
函数
这是整个合并流程的入口函数。其主要流程为:
- 获取所有相关文件夹路径,并确保其存在(自动创建)。
- 检查主问答文件是否存在,若不存在则直接返回,避免无效处理。
- 获取所有子问答文件列表。
- 读取文档元数据文件,解析为字典对象。
- 调用
merge_qa_sub
进行主问答与子问答的合并。 - 将合并后的结果序列化为 JSON 并写入目标输出路径。
- 通过日志记录合并过程,便于追踪和调试。
该函数实现了从文件读取、数据合并到结果输出的完整流程,是 ETL 合并阶段的核心调度器。
实现原理与设计考虑
1. 层级结构与递归嵌套
主问答与子问答的合并采用了递归嵌套的方式,每个主问答项下可以有一个 Sub
字段,存放其子问答对象。这种设计适应了实际文档中多层级问答的需求,便于后续的层级化检索和展示。
2. 文件命名与索引定位
子问答文件名中包含分组索引和问答索引,通过解析文件名即可准确定位到主结构中的对应问答项。这种约定式命名极大简化了数据合并的复杂度,避免了额外的索引映射。
3. 元数据统一管理
文档级元数据(如产品、URL、标题、类别)统一存储在 QARoot
对象中,保证了每个合并结果都携带完整的上下文信息,便于后续的数据分析和溯源。
4. 健壮性与容错
所有 JSON 解析操作均带有异常处理,解析失败时返回空对象并记录日志,避免因单个文件损坏导致整个流程中断。同时,所有目录操作均确保目标路径存在,提升了流程的健壮性。
5. 日志记录
通过标准的 logging
模块记录关键步骤和异常信息,便于生产环境下的监控、调试和问题追踪。
应用场景
该模块适用于大规模文档问答数据的 ETL 处理,尤其是在需要将主问答、子问答和文档元数据进行统一整合的场景。典型应用包括知识库构建、智能问答系统、文档摘要与多层级问答检索等。
代码示例
from ragapp.common.context import EtlContext
context = EtlContext(
root="/path/to/workspace",
product="example_product",
index=1
)
start_merge_doc(context)
# 该调用将自动完成指定文档的主问答、子问答和元数据的合并,并输出到目标目录
总结
merge.py
通过面向对象的结构设计、递归嵌套的数据合并、灵活的路径管理和健壮的异常处理,实现了文档级问答数据的高效整合。其设计充分考虑了实际生产环境中的多层级数据结构、元数据管理和流程可追溯性,是大规模问答数据 ETL 流程中的关键模块。