别光用BERT了BART模型在文本填充与摘要生成中的实战指南如果你正在寻找一个既能处理文本理解又能胜任生成任务的预训练模型BART绝对值得加入你的工具箱。作为Facebook AI团队推出的序列到序列模型BART在文本填充、摘要生成等任务上展现出了惊人的灵活性。与BERT等纯编码器模型不同BART结合了双向编码器和自回归解码器的优势特别适合需要根据上下文生成连贯文本的场景。1. 环境准备与模型加载在开始之前确保你的Python环境已经安装了最新版本的transformers库。如果你使用GPU加速还需要安装对应版本的PyTorch或TensorFlow。pip install transformers torch加载BART模型和对应的分词器非常简单。Hugging Face提供了多个预训练好的BART变体针对不同任务进行了优化from transformers import BartTokenizer, BartForConditionalGeneration # 加载文本摘要专用模型 model BartForConditionalGeneration.from_pretrained(facebook/bart-large-cnn) tokenizer BartTokenizer.from_pretrained(facebook/bart-large-cnn) # 或者加载基础版模型适合多种生成任务 # model BartForConditionalGeneration.from_pretrained(facebook/bart-large) # tokenizer BartTokenizer.from_pretrained(facebook/bart-large)提示bart-large-cnn是专门为摘要任务微调的版本而bart-large则更适合通用的文本生成任务。根据你的具体需求选择合适的模型。2. 文本填充实战让模型帮你补全句子文本填充是BART的强项之一。想象这样一个场景你正在开发一个写作辅助工具需要根据不完整的句子自动补全内容。BART可以完美胜任这项工作。2.1 基础文本填充让我们从一个简单例子开始text 人工智能正在改变mask的方式未来十年将会看到更多突破。 inputs tokenizer(text, return_tensorspt) output_ids model.generate(inputs[input_ids], max_length50) print(tokenizer.decode(output_ids[0], skip_special_tokensTrue))输出可能是人工智能正在改变我们工作和生活的方式未来十年将会看到更多突破性进展特别是在医疗和教育领域。2.2 高级参数调优BART的生成过程可以通过多个参数控制max_length: 控制生成文本的最大长度num_beams: 束搜索的大小值越大结果越准确但计算量也越大temperature: 控制生成的随机性top_k/top_p: 用于采样策略的参数output_ids model.generate( inputs[input_ids], max_length100, num_beams5, temperature0.7, top_p0.9, early_stoppingTrue )注意num_beams设置为3-5通常能在生成质量和计算效率之间取得良好平衡。对于实时性要求高的应用可以适当降低这个值。3. 自动摘要生成从长文本中提取精华BART在摘要任务上的表现尤其出色。bart-large-cnn版本就是在CNN/Daily Mail数据集上专门微调过的摘要模型。3.1 基础摘要生成article 人工智能(AI)技术近年来取得了飞速发展。从语音助手到自动驾驶汽车AI正在改变我们生活的方方面面。最新研究显示到2025年全球AI市场规模预计将达到1900亿美元。专家认为AI将在医疗诊断、金融分析和教育个性化等领域产生深远影响。然而也有人对AI带来的就业冲击和隐私问题表示担忧。 inputs tokenizer([article], max_length1024, truncationTrue, return_tensorspt) summary_ids model.generate( inputs[input_ids], num_beams4, max_length100, early_stoppingTrue ) print(tokenizer.decode(summary_ids[0], skip_special_tokensTrue))可能的输出AI技术快速发展预计2025年市场规模达1900亿美元将在医疗、金融和教育领域产生深远影响但也引发就业和隐私担忧。3.2 处理超长文本的策略当遇到超过模型最大长度限制的长文档时可以采用以下策略分段处理将文档分成多个段落分别生成摘要后再合并关键句提取先提取关键句子再对这些句子进行摘要层次化摘要先为每个章节生成摘要再对章节摘要进行二次摘要def summarize_long_text(text, chunk_size500): chunks [text[i:ichunk_size] for i in range(0, len(text), chunk_size)] summaries [] for chunk in chunks: inputs tokenizer([chunk], max_length1024, truncationTrue, return_tensorspt) summary_ids model.generate( inputs[input_ids], num_beams4, max_length150, early_stoppingTrue ) summaries.append(tokenizer.decode(summary_ids[0], skip_special_tokensTrue)) # 对分段摘要进行二次摘要 combined .join(summaries) inputs tokenizer([combined], max_length1024, truncationTrue, return_tensorspt) final_ids model.generate( inputs[input_ids], num_beams4, max_length200, early_stoppingTrue ) return tokenizer.decode(final_ids[0], skip_special_tokensTrue)4. 模型微调让BART适应你的特定领域虽然预训练模型在很多任务上表现良好但在特定领域数据上进行微调通常能获得更好的效果。下面是一个微调BART的示例流程。4.1 准备训练数据假设我们有一个文本填充任务的数据集格式如下train_examples [ {input: 气候变化导致mask增加, output: 气候变化导致极端天气事件增加}, {input: 深度学习在mask领域应用广泛, output: 深度学习在计算机视觉领域应用广泛} # 更多样本... ]4.2 微调代码示例from transformers import BartForConditionalGeneration, BartTokenizer, Trainer, TrainingArguments import torch # 加载模型和分词器 model BartForConditionalGeneration.from_pretrained(facebook/bart-base) tokenizer BartTokenizer.from_pretrained(facebook/bart-base) # 准备数据集 class TextFillingDataset(torch.utils.data.Dataset): def __init__(self, examples, tokenizer): self.examples examples self.tokenizer tokenizer def __len__(self): return len(self.examples) def __getitem__(self, idx): encodings self.tokenizer( self.examples[idx][input], text_targetself.examples[idx][output], max_length128, truncationTrue, paddingmax_length, return_tensorspt ) return { input_ids: encodings[input_ids].squeeze(), attention_mask: encodings[attention_mask].squeeze(), labels: encodings[labels].squeeze() } train_dataset TextFillingDataset(train_examples, tokenizer) # 设置训练参数 training_args TrainingArguments( output_dir./results, num_train_epochs3, per_device_train_batch_size8, save_steps10_000, save_total_limit2, logging_dir./logs, logging_steps500, learning_rate5e-5, warmup_steps500, weight_decay0.01, ) # 创建Trainer实例 trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, ) # 开始训练 trainer.train()4.3 微调后的推理训练完成后你可以像使用预训练模型一样使用微调后的模型# 加载微调后的模型 model BartForConditionalGeneration.from_pretrained(./results/checkpoint-XXXXX) # 使用模型进行预测 input_text 量子计算有望在mask领域带来突破 inputs tokenizer(input_text, return_tensorspt) output_ids model.generate(inputs[input_ids], max_length50) print(tokenizer.decode(output_ids[0], skip_special_tokensTrue))5. 性能优化与部署建议在实际应用中我们还需要考虑模型的性能和部署问题。5.1 模型量化加速为了减少内存占用和提高推理速度可以对模型进行量化from transformers import BartForConditionalGeneration # 加载并量化模型 model BartForConditionalGeneration.from_pretrained( facebook/bart-large-cnn, torch_dtypetorch.float16 ).to(cuda)5.2 ONNX运行时支持将模型导出为ONNX格式可以提高跨平台兼容性from transformers.convert_graph_to_onnx import convert convert( frameworkpt, modelfacebook/bart-large-cnn, outputbart.onnx, opset12, tokenizertokenizer )5.3 缓存机制实现对于重复的查询实现简单的缓存可以显著提高响应速度from functools import lru_cache lru_cache(maxsize1000) def cached_generation(text, max_length50, num_beams4): inputs tokenizer(text, return_tensorspt) output_ids model.generate( inputs[input_ids], max_lengthmax_length, num_beamsnum_beams ) return tokenizer.decode(output_ids[0], skip_special_tokensTrue)在实际项目中我发现num_beams4和temperature0.7的组合在大多数文本生成任务中都能取得不错的效果。对于摘要任务适当增加max_length到150-200之间可以生成更全面的摘要但同时也会增加不相关内容的可能性。
别光用BERT了!试试Facebook的BART模型,文本填充和摘要生成实战(附Python代码)
别光用BERT了BART模型在文本填充与摘要生成中的实战指南如果你正在寻找一个既能处理文本理解又能胜任生成任务的预训练模型BART绝对值得加入你的工具箱。作为Facebook AI团队推出的序列到序列模型BART在文本填充、摘要生成等任务上展现出了惊人的灵活性。与BERT等纯编码器模型不同BART结合了双向编码器和自回归解码器的优势特别适合需要根据上下文生成连贯文本的场景。1. 环境准备与模型加载在开始之前确保你的Python环境已经安装了最新版本的transformers库。如果你使用GPU加速还需要安装对应版本的PyTorch或TensorFlow。pip install transformers torch加载BART模型和对应的分词器非常简单。Hugging Face提供了多个预训练好的BART变体针对不同任务进行了优化from transformers import BartTokenizer, BartForConditionalGeneration # 加载文本摘要专用模型 model BartForConditionalGeneration.from_pretrained(facebook/bart-large-cnn) tokenizer BartTokenizer.from_pretrained(facebook/bart-large-cnn) # 或者加载基础版模型适合多种生成任务 # model BartForConditionalGeneration.from_pretrained(facebook/bart-large) # tokenizer BartTokenizer.from_pretrained(facebook/bart-large)提示bart-large-cnn是专门为摘要任务微调的版本而bart-large则更适合通用的文本生成任务。根据你的具体需求选择合适的模型。2. 文本填充实战让模型帮你补全句子文本填充是BART的强项之一。想象这样一个场景你正在开发一个写作辅助工具需要根据不完整的句子自动补全内容。BART可以完美胜任这项工作。2.1 基础文本填充让我们从一个简单例子开始text 人工智能正在改变mask的方式未来十年将会看到更多突破。 inputs tokenizer(text, return_tensorspt) output_ids model.generate(inputs[input_ids], max_length50) print(tokenizer.decode(output_ids[0], skip_special_tokensTrue))输出可能是人工智能正在改变我们工作和生活的方式未来十年将会看到更多突破性进展特别是在医疗和教育领域。2.2 高级参数调优BART的生成过程可以通过多个参数控制max_length: 控制生成文本的最大长度num_beams: 束搜索的大小值越大结果越准确但计算量也越大temperature: 控制生成的随机性top_k/top_p: 用于采样策略的参数output_ids model.generate( inputs[input_ids], max_length100, num_beams5, temperature0.7, top_p0.9, early_stoppingTrue )注意num_beams设置为3-5通常能在生成质量和计算效率之间取得良好平衡。对于实时性要求高的应用可以适当降低这个值。3. 自动摘要生成从长文本中提取精华BART在摘要任务上的表现尤其出色。bart-large-cnn版本就是在CNN/Daily Mail数据集上专门微调过的摘要模型。3.1 基础摘要生成article 人工智能(AI)技术近年来取得了飞速发展。从语音助手到自动驾驶汽车AI正在改变我们生活的方方面面。最新研究显示到2025年全球AI市场规模预计将达到1900亿美元。专家认为AI将在医疗诊断、金融分析和教育个性化等领域产生深远影响。然而也有人对AI带来的就业冲击和隐私问题表示担忧。 inputs tokenizer([article], max_length1024, truncationTrue, return_tensorspt) summary_ids model.generate( inputs[input_ids], num_beams4, max_length100, early_stoppingTrue ) print(tokenizer.decode(summary_ids[0], skip_special_tokensTrue))可能的输出AI技术快速发展预计2025年市场规模达1900亿美元将在医疗、金融和教育领域产生深远影响但也引发就业和隐私担忧。3.2 处理超长文本的策略当遇到超过模型最大长度限制的长文档时可以采用以下策略分段处理将文档分成多个段落分别生成摘要后再合并关键句提取先提取关键句子再对这些句子进行摘要层次化摘要先为每个章节生成摘要再对章节摘要进行二次摘要def summarize_long_text(text, chunk_size500): chunks [text[i:ichunk_size] for i in range(0, len(text), chunk_size)] summaries [] for chunk in chunks: inputs tokenizer([chunk], max_length1024, truncationTrue, return_tensorspt) summary_ids model.generate( inputs[input_ids], num_beams4, max_length150, early_stoppingTrue ) summaries.append(tokenizer.decode(summary_ids[0], skip_special_tokensTrue)) # 对分段摘要进行二次摘要 combined .join(summaries) inputs tokenizer([combined], max_length1024, truncationTrue, return_tensorspt) final_ids model.generate( inputs[input_ids], num_beams4, max_length200, early_stoppingTrue ) return tokenizer.decode(final_ids[0], skip_special_tokensTrue)4. 模型微调让BART适应你的特定领域虽然预训练模型在很多任务上表现良好但在特定领域数据上进行微调通常能获得更好的效果。下面是一个微调BART的示例流程。4.1 准备训练数据假设我们有一个文本填充任务的数据集格式如下train_examples [ {input: 气候变化导致mask增加, output: 气候变化导致极端天气事件增加}, {input: 深度学习在mask领域应用广泛, output: 深度学习在计算机视觉领域应用广泛} # 更多样本... ]4.2 微调代码示例from transformers import BartForConditionalGeneration, BartTokenizer, Trainer, TrainingArguments import torch # 加载模型和分词器 model BartForConditionalGeneration.from_pretrained(facebook/bart-base) tokenizer BartTokenizer.from_pretrained(facebook/bart-base) # 准备数据集 class TextFillingDataset(torch.utils.data.Dataset): def __init__(self, examples, tokenizer): self.examples examples self.tokenizer tokenizer def __len__(self): return len(self.examples) def __getitem__(self, idx): encodings self.tokenizer( self.examples[idx][input], text_targetself.examples[idx][output], max_length128, truncationTrue, paddingmax_length, return_tensorspt ) return { input_ids: encodings[input_ids].squeeze(), attention_mask: encodings[attention_mask].squeeze(), labels: encodings[labels].squeeze() } train_dataset TextFillingDataset(train_examples, tokenizer) # 设置训练参数 training_args TrainingArguments( output_dir./results, num_train_epochs3, per_device_train_batch_size8, save_steps10_000, save_total_limit2, logging_dir./logs, logging_steps500, learning_rate5e-5, warmup_steps500, weight_decay0.01, ) # 创建Trainer实例 trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, ) # 开始训练 trainer.train()4.3 微调后的推理训练完成后你可以像使用预训练模型一样使用微调后的模型# 加载微调后的模型 model BartForConditionalGeneration.from_pretrained(./results/checkpoint-XXXXX) # 使用模型进行预测 input_text 量子计算有望在mask领域带来突破 inputs tokenizer(input_text, return_tensorspt) output_ids model.generate(inputs[input_ids], max_length50) print(tokenizer.decode(output_ids[0], skip_special_tokensTrue))5. 性能优化与部署建议在实际应用中我们还需要考虑模型的性能和部署问题。5.1 模型量化加速为了减少内存占用和提高推理速度可以对模型进行量化from transformers import BartForConditionalGeneration # 加载并量化模型 model BartForConditionalGeneration.from_pretrained( facebook/bart-large-cnn, torch_dtypetorch.float16 ).to(cuda)5.2 ONNX运行时支持将模型导出为ONNX格式可以提高跨平台兼容性from transformers.convert_graph_to_onnx import convert convert( frameworkpt, modelfacebook/bart-large-cnn, outputbart.onnx, opset12, tokenizertokenizer )5.3 缓存机制实现对于重复的查询实现简单的缓存可以显著提高响应速度from functools import lru_cache lru_cache(maxsize1000) def cached_generation(text, max_length50, num_beams4): inputs tokenizer(text, return_tensorspt) output_ids model.generate( inputs[input_ids], max_lengthmax_length, num_beamsnum_beams ) return tokenizer.decode(output_ids[0], skip_special_tokensTrue)在实际项目中我发现num_beams4和temperature0.7的组合在大多数文本生成任务中都能取得不错的效果。对于摘要任务适当增加max_length到150-200之间可以生成更全面的摘要但同时也会增加不相关内容的可能性。