Méthodes de synthèse de texte à l'aide de l'API Vertex AI PaLM

1. Introduction

La synthèse de texte est le processus de création d'une version plus courte d'un document texte tout en conservant les informations importantes. Ce processus peut être utilisé pour parcourir rapidement un long document, obtenir l'essentiel d'un article ou partager un résumé avec les utilisateurs. Bien que la synthèse d'un court paragraphe soit une tâche non triviale, il existe quelques défis à relever si vous souhaitez résumer un document volumineux. Par exemple, un fichier PDF de plusieurs pages.

Dans cet atelier de programmation, vous allez découvrir comment utiliser des modèles génératifs pour résumer des documents volumineux.

Objectifs de l'atelier

Dans ce tutoriel, vous allez découvrir comment utiliser des modèles génératifs pour synthétiser les informations d'un texte en utilisant les méthodes suivantes :

  • Farce
  • MapReduce
  • MapReduce avec des blocs qui se chevauchent
  • MapReduce avec résumé glissant

2. Conditions requises

  • Un navigateur tel que Chrome ou Firefox
  • Un projet Google Cloud avec facturation activée

3. Coûts

Ce tutoriel utilise Vertex AI Generative AI Studio comme composant facturable de Google Cloud.

Découvrez les tarifs de Vertex AI et de Generative AI, puis utilisez le Simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue.

4. Premiers pas

  1. Installez le SDK Vertex AI, d'autres packages et leurs dépendances à l'aide de la commande suivante :
!pip install google-cloud-aiplatform PyPDF2 ratelimit backoff --upgrade --quiet --user
  • Pour Colab, annulez la mise en commentaire de la cellule suivante pour redémarrer le noyau.
# # 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)
  • Pour Vertex AI Workbench , vous pouvez redémarrer le terminal à l'aide du bouton en haut.
  1. Authentifiez votre environnement de notebook de l'une des manières suivantes :
  • Pour Colab, annulez la mise en commentaire de la cellule suivante.
from google.colab import auth
auth.authenticate_user()
  1. Importez des bibliothèques pour initialiser le SDK Vertex AI.
  • Pour Colab, importez des bibliothèques en annulant la mise en commentaire de la cellule suivante.
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. Importez des modèles dans lesquels vous chargez le modèle de génération de texte pré-entraîné appelé text-bison@001.
generation_model = TextGenerationModel.from_pretrained("text-bison@001")
  1. Préparez les fichiers de données dans lesquels vous téléchargez un fichier PDF pour les tâches de synthèse.
# 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)

Voici comment afficher quelques pages du fichier PDF téléchargé.

# 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éthode de farce

Le moyen le plus simple de transmettre des données à un modèle de langage consiste à les "farcir" dans la requête en tant que contexte. Cela inclut toutes les informations pertinentes dans la requête et dans l'ordre dans lequel vous souhaitez que le modèle les traite.

  1. Extrayez le texte de la page 2 uniquement dans le fichier 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. Créez un modèle de requête qui pourra être utilisé ultérieurement dans le 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. Utilisez le LLM via l'API pour synthétiser les textes extraits. Notez que les LLM ont actuellement une limite de texte d'entrée et que le bourrage d'un texte d'entrée volumineux peut ne pas être accepté. Pour en savoir plus sur les quotas et les limites, consultez la section Quotas et limites.

Le code suivant provoque une exception.

# 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. Le modèle a répondu avec un message d'erreur : 400 Request contains an invalid argument (La requête contient un argument non valide), car le texte extrait est trop long pour que le modèle génératif puisse le traiter.

Pour éviter ce problème, vous devez saisir un bloc de texte extrait, par exemple les 30 000 premiers mots.

# 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

Le résultat suivant devrait s'afficher dans la capture d'écran :

710efedd9f6dbc6d.png

Résumé

Bien que le texte intégral soit trop volumineux pour le modèle, vous avez réussi à créer une liste à puces concise des informations les plus importantes d'une partie du PDF à l'aide du modèle.

Avantages

  • Cette méthode n'effectue qu'un seul appel au modèle.
  • Lors de la synthèse de texte, le modèle a accès à toutes les données en même temps. Cela améliore le résultat.

Inconvénients

  • La plupart des modèles ont une longueur de contexte. Pour les documents volumineux (ou de nombreux documents), cela ne fonctionne pas, car la requête est plus longue que la longueur du contexte.
  • Cette méthode ne fonctionne que sur des petits éléments de données et ne convient pas aux documents volumineux.

6. Méthode MapReduce

Pour résoudre ce problème pour les documents volumineux, nous allons examiner la méthode MapReduce. Cette méthode divise d'abord les données volumineuses en éléments plus petits, puis exécute une requête sur chaque élément. Pour les tâches de synthèse, la sortie de la première requête est un résumé de cet élément. Une fois toutes les sorties initiales générées, une autre requête est exécutée pour les combiner.

Pour en savoir plus sur l'implémentation de cette méthode, consultez ce lien GitHub link.

7. Félicitations

Félicitations ! Vous avez réussi à synthétiser un long document. Vous avez appris deux méthodes pour synthétiser des documents volumineux, ainsi que leurs avantages et inconvénients. Il existe plusieurs méthodes pour synthétiser des documents volumineux. Découvrez deux autres méthodes (MapReduce avec des blocs qui se chevauchent et MapReduce avec résumé glissant) dans un autre atelier de programmation.

Synthétiser un long document peut être difficile. Vous devez identifier les points principaux du document, synthétiser les informations et les présenter de manière concise et cohérente. Cela peut devenir difficile si le document est complexe ou technique. De plus, la synthèse d'un long document peut prendre du temps, car vous devez lire et analyser attentivement le texte pour vous assurer que le résumé est précis et complet.

Bien que ces méthodes vous permettent d'interagir avec les LLM et de synthétiser des documents volumineux de manière flexible, vous pouvez parfois accélérer le processus en utilisant des méthodes d'amorçage ou prédéfinies. C'est là que des bibliothèques comme LangChain entrent en jeu. En savoir plus sur la compatibilité de LangChain avec Vertex AI.