1. Introducción
El resumen de texto es el proceso de crear una versión más corta de un documento de texto y, al mismo tiempo, conservar la información importante. Este proceso se puede usar para leer rápidamente un documento largo, comprender la idea principal de un artículo o compartir un resumen con los usuarios. Si bien resumir un párrafo corto es una tarea no trivial, hay algunos desafíos que debes superar si quieres resumir un documento grande. Por ejemplo, un archivo PDF con varias páginas.
En este codelab, aprenderás a usar modelos generativos para resumir documentos grandes.
Qué compilarás
En este instructivo, aprenderás a usar modelos generativos para resumir información de texto con los siguientes métodos:
- Relleno
- MapReduce
- MapReduce con fragmentos superpuestos
- MapReduce con resumen acumulativo
2. Requisitos
3. Costos
En este instructivo, se usa Vertex AI Generative AI Studio como el componente facturable de Google Cloud.
Obtén información sobre los precios de Vertex AI y los precios de la IA generativa. Usa la calculadora de precios para generar una estimación de costos según el uso previsto.
4. Cómo comenzar
- Instala el SDK de Vertex AI, otros paquetes y sus dependencias con el siguiente comando:
!pip install google-cloud-aiplatform PyPDF2 ratelimit backoff --upgrade --quiet --user
- En Colab, quita la marca de comentario de la siguiente celda para reiniciar el kernel.
# # 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)
- En el caso de Vertex AI Workbench, puedes reiniciar la terminal con el botón que se encuentra en la parte superior.
- Autentica tu entorno de notebook de una de las siguientes maneras:
- En Colab, borra los comentarios de la siguiente celda.
from google.colab import auth
auth.authenticate_user()
- Para Vertex AI Workbench, consulta las instrucciones de configuración.
- Importa bibliotecas para inicializar el SDK de Vertex AI.
- En Colab, importa bibliotecas quitando el comentario de la siguiente celda.
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")
- Importa modelos en los que cargas el modelo de generación de texto previamente entrenado llamado text-bison@001.
generation_model = TextGenerationModel.from_pretrained("text-bison@001")
- Prepara archivos de datos en los que descargarás un archivo PDF para las tareas de resumen.
# 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)
A continuación, te mostramos cómo puedes ver algunas páginas del archivo PDF descargado.
# 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. Método de relleno
La forma más sencilla de pasar datos a un modelo de lenguaje es "incluirlos" en la instrucción como contexto. Esto incluye toda la información pertinente en la instrucción y en el orden en que deseas que el modelo la procese.
- Extrae el texto solo de la página 2 del archivo PDF.
# Entry string that contains the extacted text from page 2
print(f"There are {len(text)} characters in the second page of the pdf")
- Crea una plantilla de instrucción que se pueda usar posteriormente en el notebook.
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:
"""
- Usa un LLM a través de la API para resumir los textos extraídos. Ten en cuenta que, actualmente, los LLM tienen un límite de texto de entrada y es posible que no se acepte un texto de entrada grande. Para obtener más información sobre las cuotas y los límites, consulta Cuotas y límites.
El siguiente código genera una excepción.
# 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)
- El modelo respondió con el mensaje de error 400 La solicitud contiene un argumento no válido porque el texto extraído es demasiado largo para que el modelo generativo lo procese.
Para evitar este problema, debes ingresar un fragmento del texto extraído, por ejemplo, las primeras 30,000 palabras.
# 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
Deberías ver el siguiente resultado en la captura de pantalla:

Resumen
Si bien el texto completo es demasiado grande para el modelo, lograste crear una lista concisa con viñetas de la información más importante de una parte del PDF con el modelo.
Ventajas
- Este método solo realiza una llamada al modelo.
- Cuando resume texto, el modelo tiene acceso a todos los datos a la vez. Esto mejora el resultado.
Desventajas
- La mayoría de los modelos tienen una longitud de contexto. Esto no funciona para documentos grandes (o muchos documentos), ya que genera una instrucción más grande que la longitud del contexto.
- Este método solo funciona con fragmentos de datos más pequeños y no es adecuado para documentos grandes.
6. Método MapReduce
Para abordar el problema de resolver esto para documentos grandes, analizaremos el método MapReduce. Este método primero divide los datos grandes en partes más pequeñas y, luego, ejecuta una instrucción en cada parte. En el caso de las tareas de resumen, la salida de la primera instrucción es un resumen de ese fragmento. Una vez que se generan todos los resultados iniciales, se ejecuta una instrucción diferente para combinarlos.
Consulta este vínculo de GitHub para obtener detalles sobre la implementación de este método.
7. Felicitaciones
¡Felicitaciones! Resumiste correctamente un documento extenso. Aprendiste 2 métodos para resumir documentos largos, junto con sus ventajas y desventajas. Existen algunos métodos para resumir documentos grandes. En otro codelab, encontrarás otros 2 métodos: MapReduce con fragmentos superpuestos y MapReduce con resumen acumulativo.
Resumir un documento largo puede ser un desafío. Requiere que identifiques los puntos principales del documento, sintetices la información y la presentes de manera concisa y coherente. Esto puede ser difícil si el documento es complejo o técnico. Además, resumir un documento largo puede llevar mucho tiempo, ya que debes leer y analizar el texto con cuidado para asegurarte de que el resumen sea preciso y completo.
Si bien estos métodos te permiten interactuar con los LLM y resumir documentos extensos de manera flexible, es posible que, en ocasiones, quieras acelerar el proceso usando métodos de bootstrapping o prediseñados. Aquí es donde entran en juego bibliotecas como LangChain. Obtén más información sobre la compatibilidad de LangChain en Vertex AI.