以下是对 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 的问答对增强。其设计兼顾了实用性、可扩展性和可维护性,是智能问答和知识增强系统中的关键数据处理模块。