Skip to content

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


文档:generate.py 代码详解

文件概述

本文件实现了技术文档自动化问答对(QA)生成的完整流程。其核心功能是:从 HTML 技术文档中提取主要内容,分句分组后,利用大语言模型(LLM)自动生成知识点摘要和相关问答对,并将结果以结构化 JSON 格式保存。该流程为知识检索系统、智能问答系统等应用提供了高质量的知识基础。

主要类与函数说明

1. PromptConfig 配置类

该数据类封装了与 LLM 交互时所需的各种提示词模板(prompt template),包括单组和多组处理的不同模板,以及与多轮对话相关的系统和助手回复。模板中详细描述了输出格式、任务要求(如问题数量、语言等),并通过占位符灵活适配不同内容和分组。这种设计便于后续维护和扩展,也保证了与 LLM 交互的一致性和高质量输出。

2. QAGenerator 问答生成主类

初始化与主流程

QAGenerator 是整个问答生成流程的核心。初始化时可传入自定义的 PromptConfig,否则使用默认配置。其主流程分为以下几个步骤:

(1) HTML 主内容提取

get_html_main_content 方法利用 BeautifulSoup 解析 HTML,优先提取 class 为 main__doc 的元素内容。这样可以过滤掉页面中的导航、广告等无关内容,聚焦于技术文档主体,提高后续问答生成的相关性和准确性。如果未找到目标元素,会记录警告日志并返回空字符串,保证流程健壮。

(2) 单组与多组问答生成

  • 单组处理:当文档内容较短或分组后只有一组时,generate_by_single_group 方法会根据句子数量动态调整问题数量,并用单组模板构造 prompt,直接与 LLM 交互生成问答对。
  • 多组处理:对于较长文档,generate_by_groups 方法会先用 split_text_into_sentence_groups 工具将内容分为多个句子组。每组分别构造多轮对话消息(system、user、assistant、user),以模拟更自然的多轮交互,提升 LLM 输出的多样性和准确性。每组的问答对单独生成,最后合并为整体结果。

(3) LLM 交互与异常处理

  • _generate_single_qa_generate_multi_qa 分别封装了与 LLM 的单轮和多轮交互,并在异常时返回空结构,记录详细日志,保证流程的健壮性。
  • 所有 LLM 返回内容都通过 extract_qa_object 进行结构化解析,确保输出格式统一。

(4) 主入口 generate

该方法接收一个包含 HTML 内容的文档对象,自动完成内容提取、分组、问答生成等全流程,并返回标准化的结果结构。

3. start_generate_doc 文档处理入口函数

该函数是整个文档处理流程的入口,负责:

  • 路径拼接与目录创建,确保中间文件和输出文件夹存在。
  • 读取指定索引的文档 JSON 文件,解析为对象。
  • 调用 QAGenerator 生成问答对。
  • 将结果以 JSON 格式写入输出目录,文件名与输入一致,便于后续追溯和批量处理。
  • 全流程中均有异常捕获和日志记录,便于问题定位和维护。

实现原理与设计考虑

1. 分组与多轮对话设计

文档内容往往较长,直接整体生成问答对容易遗漏细节或输出不均衡。通过 split_text_into_sentence_groups 工具将内容分组,可以细粒度地覆盖文档各部分知识点。多轮对话消息的设计(如先让 LLM“记住”全文,再针对片段提问)模拟了真实的知识梳理过程,有助于提升 LLM 的理解和输出质量。

2. 灵活的 Prompt 模板

所有与 LLM 交互的提示词均集中在 PromptConfig,并通过占位符动态填充。这不仅便于后续根据实际效果调整提示词,还能灵活适配不同文档、不同分组的需求,提升系统的可维护性和扩展性。

3. 健壮性与可追溯性

全流程均有详细的异常捕获和日志记录,任何环节出错都不会导致整体中断,而是返回空结构并记录错误,便于后续排查。输入输出文件名一一对应,便于批量处理和结果追溯。

4. 结构化输出

所有生成结果均以标准 JSON 结构输出,包含摘要和问答对,便于后续检索、索引、展示等多种应用场景。


应用场景

该模块适用于大规模技术文档的知识抽取、企业知识库构建、智能问答系统等场景。通过自动化、结构化地生成高质量问答对,可以极大提升知识检索和智能问答的效果和效率。


代码示例

# 假设 context 已初始化为 EtlContext 实例
start_generate_doc(context)
# 运行后将在指定输出目录生成结构化的问答对JSON文件

总结

generate.py 通过分组、模板化、多轮对话等机制,实现了技术文档到结构化问答对的自动化转换。其设计兼顾了灵活性、健壮性和高质量输出,是知识抽取和智能问答系统中的关键环节。