Skip to content

以下是对 gc-qa-rag/ragapp/etl_doc/generate_sub.py 文件的详细 Markdown 文档说明:


文档:generate_sub.py 代码详解

文件概述

本文件实现了基于大语言模型(LLM)的问答对增强(Augmentation)流程。其核心目标是:针对已有的问答数据,通过自动化方式生成多样化、语义丰富的相似问答对,从而提升检索系统的覆盖率和鲁棒性。整个流程涵盖了输入输出文件管理、与 LLM 的交互、增强问答的生成与保存等环节,体现了工程化的自动化数据增强设计。

主要流程与函数说明

1. 增强流程的入口:start_generate_sub_doc

该函数是增强流程的主入口,负责整体调度和异常处理。其主要步骤如下:

  • 路径与文件准备:根据传入的 EtlContext(包含根目录、产品名、文件索引等信息),构造输入输出文件夹和文件路径。确保输入文件存在,并为输出准备好清理后的子文件夹。
  • 读取与解析输入:从输入文件中读取原始问答数据(JSON 格式),并解析为 Python 对象。
  • 分组处理:调用 process_qa_group,对每一组问答对进行增强处理。
  • 异常处理:全流程包裹在 try-except 中,确保任何异常都能被记录并抛出,便于后续排查。

2. 问答增强的核心:process_qa_group

该函数负责遍历所有问答组(Groups),对每个问答对逐一进行增强。其实现细节如下:

  • 遍历与标记:对每个问答对,生成唯一标识(如 fileindex_chunkindex_qaindex),便于后续追踪和文件命名。
  • 增强生成:调用 generate_qa_enhancement,将原始问答对输入 LLM,生成增强后的问答对。
  • 结果保存:将 LLM 返回的增强结果以 JSON 格式写入对应的输出文件,确保每个问答对的增强结果单独存储,便于后续分析和复用。

3. 与 LLM 的交互:generate_qa_enhancement

该函数负责将单个问答对包装成特定格式,构造 prompt 并调用 LLM 生成增强结果。其主要流程为:

  • 格式化问答对:通过 QAObject 类,将问答对格式化为“Q:... A:...”的内容,便于 LLM 理解。
  • Prompt 构造:将格式化内容嵌入到预定义的 PROMPT_TEMPLATE 中,明确指示 LLM 如何进行增强、输出格式要求等。
  • LLM 调用与解析:调用 chat_to_llm 与 LLM 交互,获取返回结果后,使用 extract_qa_object 解析为标准结构。
  • 异常处理:任何异常均被捕获并记录,返回 None,保证流程健壮。

4. Prompt 模板设计

PROMPT_TEMPLATE 明确指示 LLM 的任务目标、输出格式和增强方法。包括:

  • 任务说明:要求对用户问题进行多角度增强,生成相似问题及答案。
  • 输出格式:强制要求以特定 JSON 格式返回,便于后续自动解析。
  • 增强方法:列举了同义词扩展、问题重述、细化、反向问题、语法变化、拼写校正、上下文增强、摘要生成等多种增强手段,指导 LLM 生成多样化内容。

5. 文件与目录管理

  • 输入输出分离:输入和输出文件夹分离,且输出以文件索引为子文件夹,便于大规模批量处理和结果管理。
  • 清理与创建:每次处理前清理输出子文件夹,避免历史数据干扰。
  • 文件命名规范:输出文件以“fileindex_chunkindex_qaindex.json”命名,确保唯一性和可追溯性。

实现原理与设计考虑

1. 自动化与可扩展性

整个流程高度自动化,适合批量处理大规模问答数据。通过参数化的上下文(如产品名、文件索引等),可灵活适配不同数据集和业务场景。

2. LLM 能力最大化利用

通过精心设计的 Prompt,最大化发挥 LLM 的生成能力,确保生成内容的多样性和实用性。强制输出结构化 JSON,便于后续自动化处理和集成。

3. 健壮性与容错

全流程均有异常捕获和日志记录,任何环节出错都不会影响整体流程的健壮性。输入输出文件的存在性、格式合法性均有检查,保证数据处理的可靠性。

4. 工程化与可维护性

代码结构清晰,职责分明。文件与目录操作、LLM 交互、数据解析等功能均有独立封装,便于维护和扩展。日志记录为后续问题排查和流程追踪提供了便利。


应用场景

该模块适用于智能问答系统、知识库构建、检索增强等场景。通过自动化生成多样化问答对,可以极大提升系统的覆盖率、鲁棒性和用户体验。尤其适合需要大规模数据增强和多角度问题理解的业务需求。


代码示例

from ragapp.common.context import EtlContext

context = EtlContext(root="/path/to/project", product="productA", index=1)
start_generate_sub_doc(context)
# 运行后将在指定输出目录下生成增强后的问答对JSON文件

总结

generate_sub.py 通过工程化的自动化流程、精细的 Prompt 设计和健壮的异常处理,实现了基于 LLM 的问答对增强。其设计兼顾了实用性、可扩展性和可维护性,是智能问答和知识增强系统中的关键数据处理模块。