1. 简介
文本摘要是指创建文本文件的简短版本,同时保留重要信息的过程。此过程可用于快速浏览长文档、了解文章要点或与用户分享摘要。虽然总结短段落并非易事,但如果您想总结大型文档,则需要克服一些挑战。例如,多页 PDF 文件。
在本 Codelab 中,您将学习如何使用生成模型来总结大型文档。
构建内容
在本教程中,您将学习如何使用生成模型来总结文本中的信息,具体方法如下:
- 填充
- MapReduce
- 使用重叠块的 MapReduce
- 使用滚动摘要的 MapReduce
2. 要求
3. 费用
本教程使用 Vertex AI 生成式 AI Studio 作为 Google Cloud 的计费组件。
了解 Vertex AI 价格和 生成式 AI 价格,并使用 价格计算器根据预计使用量来生成估算的费用。
4. 使用入门
- 使用以下命令安装 Vertex AI SDK、其他软件包及其依赖项:
!pip install google-cloud-aiplatform PyPDF2 ratelimit backoff --upgrade --quiet --user
- 对于 Colab,取消注释以下单元以重启内核。
# # Automatically restart kernel after installs so that your environment can access the new packages
import IPython
app = IPython.Application.instance()
app.kernel.do_shutdown(True)
- 对于 Vertex AI Workbench ,您可以使用顶部的按钮重启终端。
- 通过以下某种方式对笔记本环境进行身份验证:
- 对于 Colab,取消注释以下单元。
from google.colab import auth
auth.authenticate_user()
- 对于 Vertex AI Workbench,请参阅 设置说明。
- 导入库以初始化 Vertex AI SDK。
- 对于 Colab ,请通过取消备注以下单元来导入库。
import vertexai
PROJECT_ID = "[your-project-id]" # @param {type:"string"}
vertexai.init(project=PROJECT_ID, location="us-central1")
import re
import urllib
import warnings
from pathlib import Path
import backoff
import pandas as pd
import PyPDF2
import ratelimit
from google.api_core import exceptions
from tqdm import tqdm
from vertexai.language_models import TextGenerationModel
warnings.filterwarnings("ignore")
- 导入模型,您可以在其中加载名为 text-bison@001 的预训练文本生成模型。
generation_model = TextGenerationModel.from_pretrained("text-bison@001")
- 准备数据文件,您可以在其中下载 PDF 文件以用于摘要任务。
# Define a folder to store the files
data_folder = "data"
Path(data_folder).mkdir(parents=True, exist_ok=True)
# Define a pdf link to download and place to store the download file
pdf_url = "https://services.google.com/fh/files/misc/practitioners_guide_to_mlops_whitepaper.pdf"
pdf_file = Path(data_folder, pdf_url.split("/")[-1])
# Download the file using `urllib` library
urllib.request.urlretrieve(pdf_url, pdf_file)
您可以按如下方式查看下载的 PDF 文件的几个页面。
# Read the PDF file and create a list of pages
reader = PyPDF2.PdfReader(pdf_file)
pages = reader.pages
# Print three pages from the pdf
for i in range(3):
text = pages[i].extract_text().strip()
print(f"Page {i}: {text} \n\n")
#text contains only the text from page 2
5. 填充方法
将数据传递给语言模型的最简单方法是将其作为上下文“填入”提示中。这包括提示中的所有相关信息,以及您希望模型处理这些信息的顺序。
- 仅从 PDF 文件中的第 2 页提取文本。
# Entry string that contains the extacted text from page 2
print(f"There are {len(text)} characters in the second page of the pdf")
- 创建一个提示模板,该模板随后可在笔记本中使用。
prompt_template = """
Write a concise summary of the following text.
Return your response in bullet points which covers the key points of the text.
```{text}```
BULLET POINT SUMMARY:
"""
- 通过 API 使用 LLM 来总结提取的文本。请注意,大语言模型目前有输入文本限制,因此可能无法接受填充大量输入文本。如需详细了解配额和限制,请参阅 配额和限制。
以下代码会导致异常。
# Define the prompt using the prompt template
prompt = prompt_template.format(text=text)
# Use the model to summarize the text using the prompt
summary = generation_model.predict(prompt=prompt, max_output_tokens=1024).text
print(summary)
- 模型返回了出错提示:400 Request contains an invalid argument ,因为提取的文本太长,生成模型无法处理。
为避免此问题,您需要输入一部分提取的文本,例如前 30,000 个字。
# Define the prompt using the prompt template
prompt = prompt_template.format(text=text[:30000])
# Use the model to summarize the text using the prompt
summary = generation_model.predict(prompt=prompt, max_output_tokens=1024)
summary
您应该会在屏幕截图中看到以下结果:

摘要
虽然全文对于模型来说太大,但您已设法使用该模型从 PDF 的一部分创建了最重要信息的简洁项目符号列表。
优势
- 此方法仅对模型进行一次调用。
- 在总结文本时,模型可以一次访问所有数据。这使得结果更好。
缺点
- 大多数模型都有上下文长度。对于大型文档(或许多文档),此方法不起作用,因为它会导致提示大于上下文长度。
- 此方法仅适用于较小的数据块,不适用于大型文档。
6. MapReduce 方法
为了解决大型文档的此问题,我们将介绍 MapReduce 方法。此方法首先将大型数据拆分为较小的块,然后对每个块运行提示。对于摘要任务,第一个提示的输出是该块的摘要。生成所有初始输出后,系统会运行不同的提示来合并这些输出。
如需了解此方法的实现详情,请参阅此 GitHub 链接。
7. 恭喜
恭喜!您已成功总结长文档。您已了解 2 种总结长文档的方法,以及它们的优缺点。有几种方法可以总结大型文档。请在另一个 Codelab 中了解其他 2 种方法 - 使用重叠块的 MapReduce 和使用滚动摘要的 MapReduce。
总结长文档可能具有挑战性。它要求您确定文档的要点、综合信息,并以简洁连贯的方式呈现这些信息。如果文档复杂或技术性强,这可能会变得困难。此外,总结长文档可能很耗时,因为您需要仔细阅读和分析文本,以确保摘要准确完整。
虽然这些方法允许您以灵活的方式与 LLM 互动并总结长文档,但您有时可能希望使用自举法或预构建方法来加快此过程。这时,LangChain 等库就派上用场了。详细了解 Vertex AI 上的 LangChain 支持。