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