Métodos de resumo de texto usando a API Vertex AI PaLM

1. Introdução

O resumo de texto é o processo de criar uma versão mais curta de um documento de texto preservando informações importantes. Esse processo pode ser usado para examinar rapidamente um documento longo, obter a essência de um artigo ou compartilhar um resumo com os usuários. Embora resumir um parágrafo curto seja uma tarefa não trivial, existem alguns desafios a serem superados se você quiser resumir um documento grande. Por exemplo, um arquivo PDF com várias páginas.

Neste codelab, você vai aprender a usar modelos generativos para resumir documentos grandes.

O que você vai criar

Neste tutorial, você vai aprender a usar modelos generativos para resumir informações de textos trabalhando com os seguintes métodos:

  • O recheio
  • MapReduce
  • MapReduce com blocos sobrepostos
  • MapReduce com resumo contínuo

2. Requisitos

  • Use um navegador, como o Chrome ou o Firefox.
  • Tenha um projeto do Google Cloud com o faturamento ativado.

3. Custos

Este tutorial usa o Vertex AI Generative AI Studio como o componente faturável do Google Cloud.

Saiba mais sobre os preços da Vertex AI e a IA generativa. Além disso, use a calculadora de preços para gerar uma estimativa de custo com base no uso projetado.

4. Primeiros passos

  1. Instale o SDK da Vertex AI, outros pacotes e as dependências deles usando o seguinte comando:
!pip install google-cloud-aiplatform PyPDF2 ratelimit backoff --upgrade --quiet --user
  • No Colab, remova a marca de comentário da célula abaixo para reiniciar o 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)
  • Para o Vertex AI Workbench, é possível reiniciar o terminal usando o botão na parte de cima.
  1. Autentique o ambiente de notebook de uma das seguintes maneiras:
  • No Colab, remova a marca de comentário da célula a seguir.
from google.colab import auth
auth.authenticate_user()
  1. Importe bibliotecas para inicializar o SDK da Vertex AI.
  • No Colab, importe bibliotecas removendo a marca de comentário da célula a seguir.
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")
  1. Importe modelos em que você carrega o modelo de geração de texto pré-treinado chamado text-bison@001.
generation_model = TextGenerationModel.from_pretrained("text-bison@001")
  1. Prepare arquivos de dados em que você faz o download de um arquivo PDF para as tarefas de resumo.
# 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)

Veja como visualizar algumas páginas do arquivo PDF baixado.

# 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 recheio

A maneira mais simples de transmitir dados para um modelo de linguagem é "encher" no comando como contexto. Isso inclui todas as informações relevantes no comando e na ordem em que você quer que o modelo as processe.

  1. Extraia o texto apenas da página 2 do arquivo 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")
  1. Crie um modelo de comando para usar depois no 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:
"""
  1. Usar o LLM com a API para resumir os textos extraídos. No momento, os LLMs têm um limite de texto de entrada, e inserir um texto de entrada muito grande pode não ser aceito. Para saber mais sobre cotas e limites, consulte Cotas e limites.

O código a seguir causa uma exceção.

# 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)
  1. O modelo respondeu com a mensagem de erro 400 A solicitação contém um argumento inválido porque o texto extraído é muito longo para o modelo generativo processar.

Para evitar esse problema, você precisa inserir uma parte do texto extraído, por exemplo, as primeiras 30.000 palavras.

# 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

O seguinte resultado será exibido na captura de tela:

710efedd9f6dbc6d.png

Resumo

Ainda que o texto completo seja muito grande para o modelo, você conseguiu criar uma lista concisa e com marcadores das informações mais importantes de uma parte do PDF usando o modelo.

Vantagens

  • Esse método faz apenas uma única chamada ao modelo.
  • Ao resumir texto, o modelo tem acesso a todos os dados de uma só vez. Isso melhora o resultado.

Desvantagens

  • A maioria dos modelos tem um comprimento de contexto. Para documentos grandes (ou muitos documentos), isso não funciona porque resulta em um prompt maior do que o tamanho do contexto.
  • Esse método só funciona em dados menores e não é adequado para documentos grandes.

6. Método MapReduce

Para resolver esse problema em documentos grandes, vamos conhecer o método MapReduce. Esse método primeiro divide os dados grandes em partes menores e depois executa um comando em cada parte. Para tarefas de resumo, o resultado do primeiro comando é um resumo dessa parte. Depois que todas as saídas iniciais forem geradas, outro comando será executado para combiná-las.

Consulte este link no GitHub para detalhes de implementação desse método.

7. Parabéns

Parabéns! Você resumiu um documento longo. Você aprendeu dois métodos para resumir documentos longos, além de suas vantagens e desvantagens. Existem alguns métodos para resumir documentos grandes. Procure dois outros métodos: MapReduce com blocos sobrepostos e MapReduce com resumo contínuo em outro codelab.

Resumir um documento longo pode ser desafiador. Ele exige que você identifique os pontos principais do documento, sintetize as informações e a apresente de maneira concisa e coerente. Isso pode ser difícil se o documento for complexo ou técnico. Além disso, resumir um documento longo pode ser demorado, porque você precisa ler e analisar o texto com cuidado para garantir que o resumo seja preciso e completo.

Esses métodos permitem interagir com LLMs e resumir documentos longos de maneira flexível, mas às vezes você pode querer acelerar o processo usando bootstrapping ou métodos pré-criados. É aqui que bibliotecas como o LangChain entram em uso. Saiba mais sobre o suporte ao LangChain na Vertex AI.