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, preservar la información importante. Este proceso se puede utilizar para leer rápidamente un documento largo, comprender lo esencial 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 un texto a través de los siguientes métodos:
- Relleno
- MapReduce
- MapReduce con fragmentos superpuestos
- MapReduce con resumen progresivo
2. Requisitos
3. Costos
En este instructivo, se usa Vertex AI Generative AI Studio como componente facturable de Google Cloud.
Obtén información sobre los precios de Vertex AI y los precios de la IA generativa, y 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
- Para Colab, quita el comentario de la siguiente celda a fin de 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 Vertex AI Workbench, puedes reiniciar la terminal con el botón que se encuentra en la parte superior.
- Autentica el entorno del notebook de una de las siguientes maneras:
- Para Colab, quita el comentario 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.
- Para Colab, importa bibliotecas quitando los comentarios 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")
- Preparar los archivos de datos y descargarlos en 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 indicamos 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 “rellenar” en la instrucción como contexto. Esto incluye toda la información relevante en la instrucción y en el orden en que quieres que el modelo la procese.
- Extrae el texto de la única 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 instrucciones 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 el LLM con la API para resumir los textos extraídos. Ten en cuenta que, actualmente, los LLM tienen un límite de texto de entrada, por lo que es posible que no se acepte el uso de 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 un 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, necesitas 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
Aunque el texto completo es demasiado grande para el modelo, lograste crear una lista concisa y con viñetas de la información más importante de una parte del PDF usando el modelo.
Ventajas
- Este método realiza una sola llamada al modelo.
- Cuando se resume un texto, el modelo tiene acceso a todos los datos a la vez. Esto hace que el resultado sea mejor.
Desventajas
- La mayoría de los modelos tienen una longitud del contexto. En el caso de los documentos grandes (o muchos documentos), esto no funciona, ya que genera una instrucción más grande que la longitud del contexto.
- Este método solo funciona en datos más pequeños y no es adecuado para documentos grandes.
6. Método MapReduce
Para abordar el problema de resolver esto en documentos grandes, estudiaremos el método MapReduce. Este método primero divide los datos grandes en partes más pequeñas y, luego, ejecuta un mensaje en cada parte. Para las tareas de resumen, el resultado de la primera instrucción es un resumen de esa pieza. Una vez que se generaron 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 largo. Aprendiste 2 métodos para resumir documentos largos, junto con sus ventajas y desventajas. Existen algunos métodos para resumir documentos grandes. Busca otros 2 métodos: MapReduce con fragmentos superpuestos y MapReduce con resumen progresivo en otro codelab.
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 esté completo.
Si bien estos métodos te permiten interactuar con LLM y resumir documentos largos de forma flexible, es posible que, a veces, quieras acelerar el proceso usando métodos de arranque o previamente compilados. Aquí es donde se usan bibliotecas como LangChain. Obtén más información sobre la compatibilidad de LangChain con Vertex AI.