Skip to content

以下是对 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 流程中的关键模块。