1基础信息
1.1 案例背景
本案例设计了一个基于生成式 AI 的文档摘要系统,该系统能够自动读取长篇文档并生成内容摘要。将使用深度学习中的 Transformer 架构和相关技术来实现这一功能。
1.2 应用场景
企业内部文档处理
学术论文快速阅读
新闻资讯汇总
法律文书分析
1.3 功能目标
支持多种文档格式(PDF、Word、纯文本)
生成不同长度的摘要(短摘要、长摘要)
保留文档核心内容和关键论点
保持摘要的连贯性和可读性
2 实现步骤
2.1 数据收集与预处理
首先需要收集用于训练和测试的文档数据集。可以使用公开数据集如 CNN/Daily Mail、20 Newsgroups 等,也可以收集企业内部文档。
数据预处理流程:
文档格式转换:将不同格式的文档转换为纯文本
文本清洗:去除噪声、特殊字符和无关信息
分句与分段:将文本分割为句子和段落
标记化:将文本转换为模型可处理的标记序列
处理 PDF 文档并提取文本的Python代码:
import pdfplumber
import re
def extract_text_from_pdf(pdf_path):
text = ""
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
text += page.extract_text()
return text
def clean_text(text):
# 去除多余空格和换行
text = re.sub(r'\s+', ' ', text).strip()
# 去除特殊字符
text = re.sub(r'[^\w\s]', '', text)
return text
# 使用示例
pdf_path = "example.pdf"
raw_text = extract_text_from_pdf(pdf_path)
cleaned_text = clean_text(raw_text)
print(cleaned_text[:500]) # 打印前500个字符
2.2 模型选择与设计
对于文档摘要任务,我们可以选择以下几种模型架构:
Encoder-Decoder 架构:使用 Transformer 的编码器处理输入文档,解码器生成摘要
预训练语言模型:如 BERT、T5、GPT 等,通过微调适应摘要任务
抽取式与生成式结合:先抽取关键句子,再通过生成式模型整合
这里我们选择 T5 模型,因为它在文本生成任务上表现出色,并且支持 "text-to-text" 的统一框架。
2.3 模型选择与微调
使用选定的数据集对模型进行微调,使其适应文档摘要任务。
训练流程:
准备训练数据:将文档和对应的摘要转换为模型输入格式
定义模型:加载预训练的 T5 模型
定义训练参数:学习率、批次大小、训练轮数等
训练模型:使用训练数据对模型进行微调
评估模型:使用验证集评估模型性能
以下是使用 Hugging Face Transformers 库微调 T5 模型的代码:
from transformers import T5Tokenizer, T5ForConditionalGeneration
from datasets import load_dataset
from transformers import Trainer, TrainingArguments
# 加载预训练模型和分词器
tokenizer = T5Tokenizer.from_pretrained("t5-base")
model = T5ForConditionalGeneration.from_pretrained("t5-base")
# 加载数据集
dataset = load_dataset("cnn_dailymail", "3.0.0")
# 预处理函数
def preprocess_function(examples):
inputs = ["summarize: " + doc for doc in examples["article"]]
model_inputs = tokenizer(inputs, max_length=1024, truncation=True)
# 标记摘要
labels = tokenizer(examples["highlights"], max_length=128, truncation=True)
model_inputs["labels"] = labels["input_ids"]
return model_inputs
# 预处理数据集
tokenized_datasets = dataset.map(preprocess_function, batched=True)
# 定义训练参数
training_args = TrainingArguments(
output_dir="./results",
evaluation_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=4,
per_device_eval_batch_size=4,
num_train_epochs=3,
weight_decay=0.01,
)
# 定义训练器
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["validation"],
)
# 训练模型
trainer.train()
# 保存模型
model.save_pretrained("summarizer_model")
tokenizer.save_pretrained("summarizer_model")
2.4 实现文档摘要生成
使用微调后的模型实现文档摘要生成功能。
生成流程:
加载微调后的模型和分词器
对输入文档进行预处理
使用模型生成摘要
对生成的摘要进行后处理
生成摘要的代码:
from transformers import T5Tokenizer, T5ForConditionalGeneration
# 加载模型和分词器
tokenizer = T5Tokenizer.from_pretrained("summarizer_model")
model = T5ForConditionalGeneration.from_pretrained("summarizer_model")
def generate_summary(text, max_length=150, min_length=30):
# 准备输入
input_text = "summarize: " + text
inputs = tokenizer(input_text, return_tensors="pt", max_length=1024, truncation=True)
# 生成摘要
outputs = model.generate(
inputs["input_ids"],
max_length=max_length,
min_length=min_length,
length_penalty=2.0,
num_beams=4,
early_stopping=True
)
# 解码生成的摘要
summary = tokenizer.decode(outputs[0], skip_special_tokens=True)
return summary
# 使用示例
document = "这是一段示例文本,用于测试文档摘要生成功能。"
summary = generate_summary(document)
print("生成的摘要:", summary)
2.5 评估与优化
使用自动评估指标和人工评估相结合的方式评估摘要质量,并根据评估结果优化模型。
常用评估指标:
ROUGE (Recall-Oriented Understudy for Gisting Evaluation)
BLEU (Bilingual Evaluation Understudy)
METEOR (Metric for Evaluation of Translation with Explicit ORdering)
以下是计算 ROUGE 指标代码:
from rouge import Rouge
def evaluate_summary(reference, generated):
rouge = Rouge()
scores = rouge.get_scores(generated, reference)
return scores
# 使用示例
reference_summary = "这是参考摘要。"
generated_summary = "这是生成的摘要。"
scores = evaluate_summary(reference_summary, generated_summary)
print("ROUGE分数:", scores)
2.6 部署与集成
将训练好的模型部署为可用的服务,并集成到实际应用中。
部署方式:
作为 API 服务部署
集成到应用程序中
构建 Web 界面提供服务
使用 Flask 构建Web 服务的代码:
from flask import Flask, request, jsonify
from transformers import T5Tokenizer, T5ForConditionalGeneration
app = Flask(__name__)
# 加载模型和分词器
tokenizer = T5Tokenizer.from_pretrained("summarizer_model")
model = T5ForConditionalGeneration.from_pretrained("summarizer_model")
@app.route('/summarize', methods=['POST'])
def summarize():
data = request.json
text = data.get('text', '')
max_length = data.get('max_length', 150)
min_length = data.get('min_length', 30)
if not text:
return jsonify({"error": "No text provided"}), 400
summary = generate_summary(text, max_length, min_length)
return jsonify({"summary": summary})
def generate_summary(text, max_length, min_length):
input_text = "summarize: " + text
inputs = tokenizer(input_text, return_tensors="pt", max_length=1024, truncation=True)
outputs = model.generate(
inputs["input_ids"],
max_length=max_length,
min_length=min_length,
length_penalty=2.0,
num_beams=4,
early_stopping=True
)
summary = tokenizer.decode(outputs[0], skip_special_tokens=True)
return summary
if __name__ == '__main__':
app.run(debug=True)
3 案例扩展与优化
多语言支持:使用多语言预训练模型如 mT5
文档类型扩展:支持更多格式的文档处理
用户反馈机制:收集用户反馈,持续优化模型
摘要类型多样化:支持不同类型的摘要(信息性摘要、结构性摘要等)
与知识库结合:将外部知识融入摘要生成过程