人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本文围绕 PaddleNLP 中slm/pipelines子项目的answer_extractor节点模块展开系统讲解其在无监督问答Unsupervised QA流水线中的定位、四个核心组件预处理器、答案抽取器、问答对过滤器及其后处理器的实现原理、参数配置与完整调用方式。读完本文你将掌握如何基于通用信息抽取UIE模型自动从原始文本中生成合成问答对并将其过滤、加工后用于构建 FAQ 检索库或训练数据。模块定位无监督问答流水线中的数据生产环节在slm/pipelines项目中answer_extractor是 QAGenerationPipelineQA 生成流水线的关键组成部分。该流水线用于无监督问答场景不依赖人工标注而是从一段段原始文本中自动抽取出答案、生成对应问题最终产出可供检索系统使用的上下文—问题—答案三元组。从 standard_pipelines.py 的源码可以看到流水线的三节点拓扑self.pipeline.add_node(componentanswer_extractor, nameAnswerExtractor, inputs[Query]) self.pipeline.add_node(componentquestion_generator, nameQuestionGenerator, inputs[AnswerExtractor]) self.pipeline.add_node(componentqa_filter, nameQAFilter, inputs[QuestionGenerator])AnswerExtractor输入原始段落文本抽取候选答案合成答案QuestionGenerator基于候选答案生成合成问题该节点不属于本文模块位于同目录的 question_generator.mdQAFilter用独立训练的信息抽取模型过滤低质量的问题—答案对。而answer_extractor节点模块本身slm/pipelines/pipelines/nodes/answer_extractor/共包含四个组件全部继承自BaseComponent并由init.py 统一导出类名职责对应源码文件AnswerExtractorPreprocessor将文档列表转换为段落文本列表answer_extractor_preprocessor.pyAnswerExtractor基于 UIE 抽取候选答案answer_extractor.pyQAFilterPostprocessor将过滤后的三元组重写为文档格式qa_filter_postprocessor.pyQAFilter基于 UIE 过滤合成问答对qa_filter.pyAnswerExtractorPreprocessor文本转换结果的预处理AnswerExtractorPreprocessor源码见 answer_extractor_preprocessor.py是所有下游抽取工作的入口其唯一职责是把上游FileConverter等节点产出的标准document字典列表转换成后续节点需要的纯文本列表。class AnswerExtractorPreprocessor(BaseComponent): def __init__(self, devicegpu): paddle.set_device(device) def run(self, documents): results {meta: [document[content] for document in documents]} return results, output_1关键实现细节构造函数仅接收device默认gpu也可传cpu其内部通过paddle.set_device(device)完成运行设备的初始化其余无需任何模型加载因此该节点非常轻量run(documents)接收节点输入documents元素为含content字段的文档字典将其逐一取出并组装为{meta: [段落1, 段落2, ...]}随后通过return results, output_1将结果传递给output_1输出边与所有 pipeline 节点一致它定义了outgoing_edges 1单输出边以及return_no_answers、query_count、query_time等通用属性用于与 Pipeline 框架的调度逻辑对接。由此可以推断在完整流水线中AnswerExtractorPreprocessor承担的是文本转换 → 段落抽取之间的数据整形角色它不改变内容语义只负责统一下游模型输入的数据格式。AnswerExtractor基于 UIE 的合成答案抽取器AnswerExtractor是本文模块的核心节点源码见 answer_extractor.py类注释明确说明其定位为 Answer Extractor based on Universal Information Extraction即基于通用信息抽取UIE框架的答案抽取器。构造参数与默认值def __init__( self, modeluie-base-answer-extractor, schema[答案], task_pathNone, devicegpu, batch_size64, position_prob0.01, max_answer_candidates5, ):参数默认值说明modeluie-base-answer-extractor专用答案抽取模型名。若设为uie-base则直接走 Taskflow 内置模型否则按PPNLP_HOME/pipelines/unsupervised_question_answering/model路径查找并下载模型资源schema[答案]UIE 的信息抽取目标schema抽取器将围绕该目标从段落中提取答案片段task_pathNone自定义模型路径。一旦指定即标记_custom_model True跳过内置资源校验逻辑直接加载用户提供的模型devicegpu运行设备映射到 Taskflow 的device_id0 if device gpu else -1batch_size64模型推理批大小控制每批处理的段落数量position_prob0.01UIE 输出的位置概率阈值低于该阈值的抽取结果会被过滤max_answer_candidates5每个段落最多保留的候选答案数量资源文件自动下载与校验机制AnswerExtractor通过resource_files_names与resource_files_urls两张类属性表声明了五类模型资源model_state.pdparams、model_config.json、vocab.txt、special_tokens_map.json、tokenizer_config.json并在_check_task_files()中逐一检查若本地文件缺失或经md5filePaddle 内置 MD5 工具校验与resource_files_urls中记录的 md5 不一致则调用paddlenlp.taskflow.utils.download_file从bj.bcebos.com下载对应资源特别地当model_state发生更新时会置位_param_updated标记该机制保证了uie-base-answer-extractor等模型在首次使用时的自动就绪无需用户手工下载。答案抽取的底层实现AnswerExtractor在构造时通过Taskflow(information_extraction, ...)创建底层推理引擎即 PaddleNLP 的信息抽取任务流。真正的抽取逻辑集中在answer_generation_from_paragraphs()def answer_generation_from_paragraphs( self, paragraphs, batch_size16, modelNone, max_answer_candidates5, schemaNone, wfNone ): result [] buffer [] i 0 len_paragraphs len(paragraphs) for paragraph_tobe in tqdm(paragraphs): buffer.append(paragraph_tobe) if len(buffer) batch_size or (i 1) len_paragraphs: predicts model(buffer) paragraph_list buffer buffer [] for predict_dict, paragraph in zip(predicts, paragraph_list): answers [] probabilitys [] for prompt in schema: if prompt in predict_dict: answer_dicts predict_dict[prompt] answers [answer_dict[text] for answer_dict in answer_dicts] probabilitys [answer_dict[probability] for answer_dict in answer_dicts] else: answers [] probabilitys [] candidates sorted( list(set([(a, p) for a, p in zip(answers, probabilitys)])), keylambda x: -x[1] ) if len(candidates) max_answer_candidates: candidates candidates[:max_answer_candidates] outdict { context: paragraph, answer_candidates: candidates, } if wf: wf.write(json.dumps(outdict, ensure_asciiFalse) \n) result.append(outdict) i 1 return result该方法的处理流程可归纳为五个步骤分批缓冲按batch_size累积段落凑满一批或处理到末尾时统一送入model(buffer)推理兼顾吞吐与显存占用按 schema 汇总答案遍历schema默认[答案]中的每个提示词从 UIE 输出字典predict_dict中取出text与probability字段分别累积到答案列表与概率列表去重排序用set去掉(answer, probability)完全相同的重复项再按概率降序排序使置信度最高的答案排在最前候选截断超出max_answer_candidates时仅保留前 N 个候选输出结构化结果每个段落产出一个{context: 段落原文, answer_candidates: [(答案, 概率), ...]}字典若提供了wf文件句柄还会以 JSON 行ensure_asciiFalse即保留中文原文逐行写入文件便于断点续跑或落盘。run 方法与节点输出def run(self, meta): print(creating synthetic answers...) synthetic_context_answer_pairs self.answer_generation_from_paragraphs( meta, batch_sizeself.batch_size, modelself.answer_generator, max_answer_candidatesself.max_answer_candidates, schemaself.schema, wfNone, ) results {ca_pairs: synthetic_context_answer_pairs} return results, output_1run(meta)接收预处理节点传来的段落列表调用上述抽取逻辑最终将{ca_pairs: [{context: ..., answer_candidates: [(答案, 概率), ...]}, ...]}输出到output_1边供QuestionGenerator节点消费。注意此处传入的model参数正是构造函数中创建的self.answer_generatorTaskflow 信息抽取引擎。QAFilter合成问答对的质量过滤器QAFilter源码见 qa_filter.py负责把QuestionGenerator生成的上下文—合成问题—合成答案三元组做二次校验剔除答非所问的低质量样本类注释将其定位为 Question Answer Pairs Filter based on Universal Information Extraction。构造参数与资源机制def __init__( self, modeluie-base-qa-filter, schema[答案], task_pathNone, devicegpu, batch_size64, position_prob0.1, ):与AnswerExtractor高度对称默认模型为uie-base-qa-filter同样支持task_path自定义路径、uie-base走 Taskflow 内置模型的两种旁路默认position_prob0.1比抽取器0.01更严格符合过滤场景对置信度更高的要求resource_files_urls中维护了uie-base-qa-filter-v1的五类资源文件及其 md5 值_check_task_files()的下载/校验逻辑与AnswerExtractor完全一致。过滤逻辑核心filtrationdef filtration(self, paragraphs, batch_size16, modelNone, schemaNone, wfNone, wf_debugNone): ... for d in buffer: context d[context] synthetic_question d[synthetic_question] prefix 问题 synthetic_question 上下文 content prefix context model_inputs.append(content) predicts model(model_inputs) ... if synthetic_answer in candidates: # 视为有效对写入 wf 并追加到 result valid_num 1 else: # 视为无效对写入 wf_debug invalid_num 1过滤思路非常巧妙过滤器先把QuestionGenerator合成的问题与原始上下文拼接为问题question上下文context的提示文本交给 UIE 模型抽取答案若抽取结果中包含合成的答案文本synthetic_answer in candidates说明问题与上下文确实相关、答案确实可从上下文找到则该三元组判定为有效并保留否则判定为无效并丢弃。有效结果会通过wf写盘JSON 行格式无效结果写入wf_debug方便后续人工抽查方法末尾会打印valid synthetic question-answer pairs number与invalid ... number给出本次过滤的有效/无效统计有效对保留了context、synthetic_answer、synthetic_answer_probability、synthetic_question、synthetic_question_probability五个字段完整承载三元组信息。run 方法可开关的过滤def run(self, cqa_triples, is_filterTrue): if is_filter: print(filtering synthetic question-answer pairs...) filtered_cqa_triples self.filtration( cqa_triples, batch_sizeself.batch_size, modelself.filtration_model, schemaself.schema ) print(filter synthetic question-answer pairs successfully!) else: filtered_cqa_triples cqa_triples results {filtered_cqa_triples: filtered_cqa_triples} return results, output_1run()通过is_filter开关控制是否执行过滤为True时走完整过滤流程为False时原样透传便于在需要保留全部合成数据的场景下跳过过滤。节点输出键为filtered_cqa_triples——这也正是 run_pipelines_example.py 中从prediction里直接取用的键名。QAFilterPostprocessor问答三元组的文档化后处理QAFilterPostprocessor源码见 qa_filter_postprocessor.py是过滤环节的收尾节点将过滤后的三元组转换为下游文档库Document Store可直接写入的标准文档结构def run(self, filtered_cqa_triples): results { documents: [ { content: triple[synthetic_question], content_type: text, meta: {answer: triple[synthetic_answer], _split_id: 0}, } for triple in filtered_cqa_triples ] } return results, output_1其转换规则可以概括为每个三元组的synthetic_question合成问题被写入content即文档正文——这与 FAQ 检索场景中用户问的是问题检索的是问题文本的语义一致每个三元组的synthetic_answer合成答案被放入meta.answer作为问题的伴随元数据content_type固定为text_split_id固定为0用于满足文档库对分片与类型字段的约定。经过这一步过滤后的问答数据即可交给FAISSDocumentStore等存储组件建立索引供语义检索使用。实战示例完整无监督问答数据构建流程slm/applications/question_answering/unsupervised_qa/run_pipelines_example.py提供了本文模块的端到端用法其中的qa_generation_pipeline()函数给出了标准装配方式answer_extractor AnswerExtractor( modeluie-base-answer-extractor, deviceargs.device, schema[答案], max_answer_candidates3, position_prob0.01, batch_size1, ) question_generator QuestionGenerator( modelunimo-text-1.0-question-generation, deviceargs.device, num_return_sequences2, ) qa_filter QAFilter( modeluie-base-qa-filter, deviceargs.device, schema[答案], position_prob0.1, ) pipe QAGenerationPipeline( answer_extractoranswer_extractor, question_generatorquestion_generator, qa_filterqa_filter ) pipeline_params {QAFilter: {is_filter: True}} meta [ 世界上最早的电影院是美国洛杉矶的“电气剧场”建于1902年。, 以脸书为例2020年时54%的成年人表示他们从该平台获取新闻。而现在这个数字下降到了44%。……, ] prediction pipe.run(metameta, paramspipeline_params) prediction prediction[filtered_cqa_triples] pprint(prediction)该示例同时支持两种输入方式列表输入直接把多段原始文本作为meta传入pipe.run()结果打印到屏幕文件输入通过--source_file指定原始文本文件每行一段脚本逐行读入后运行流水线最终将过滤结果按问题\t答案的格式写入--doc_dir/generated_qa_pairs.txt可直接作为 FAQ 检索库或问答训练数据使用。示例中几个参数值得注意batch_size1便于小规模演示与调试max_answer_candidates3限制每段候选答案数量QAGenerationPipeline构造时依次传入抽取器、问题生成器与过滤器内部按AnswerExtractor → QuestionGenerator → QAFilter的顺序组网。此外qa_generation_pipeline()之后紧跟着dense_faq_pipeline()后者用 FAISS 构建 FAQ 向量索引并完成检索——两者组合即构成完整的无监督 FAQ 数据生产 语义检索闭环。设计要点总结两级 UIE 模型分工AnswerExtractoruie-base-answer-extractor负责从段落中抽取候选答案QAFilteruie-base-qa-filter负责校验合成问答对的质量二者都基于 PaddleNLP 的Taskflow(information_extraction, ...)引擎通过schema指定抽取目标、position_prob控制置信阈值全程无人工标注从原始文本到可用问答对所有环节均由模型自动完成这正是无监督问答的核心价值资源自动管理两个模型节点均内置了五类资源文件的 md5 校验与自动下载逻辑首次使用即自动就绪无需手工准备模型文件标准节点协议四个组件均继承BaseComponent通过run()返回(results, output_1)二元组与outgoing_edges 1定义单输出边可无缝嵌入Pipeline/QAGenerationPipeline等标准流水线框架数据流清晰可追踪模块内数据的流转路径为documents → meta 段落列表 → ca_pairs上下文候选答案→ cqa_triples问题答案上下文→ filtered_cqa_triples → documents问题为 content、答案为 meta每一环的输出键名都是后续环节的输入键名便于逐节点调试。如需深入理解相邻节点可继续阅读同目录下的 question_generator.md问题生成器与 retriever.md检索器等文档或直接在slm/pipelines/tests/中查找对应测试用例验证各节点的输入输出契约。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐基于 PaddleNLP Pipelines 搭建端到端 FAQ 智能问答系统检索式问答 Web 可视化基于 PaddleNLP Pipelines 搭建端到端 FAQ 智能问答系统检索式问答 Web 可视化 PaddleNLP Pipelines 提供了人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 无监督检索式问答系统实战从非结构化文本自动生成 QA 语料到端到端检索问答搭建PaddleNLP 无监督检索式问答系统实战从非结构化文本自动生成 QA 语料到端到端检索问答搭建 导读本文以 PaddleNLP 仓库 slm/appli人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP Pipelines 之 QuestionGenerator基于 UNIMO-Text 的合成问答对生成节点深度解析PaddleNLP Pipelines 之 QuestionGenerator基于 UNIMO Text 的合成问答对生成节点深度解析 导读 Question人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考