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 qui consiste à créer une version plus courte d'un document texte tout en préservant les informations importantes. Cette procédure permet de survoler rapidement un long document, de comprendre l'essentiel d'un article ou de partager un résumé avec les utilisateurs. Bien que la synthèse d'un court paragraphe soit une tâche non triviale, il y a quelques difficultés à surmonter si vous souhaitez résumer un document volumineux. (par exemple, un fichier PDF contenant plusieurs pages).

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

Objectifs de l'atelier

Dans ce tutoriel, vous allez apprendre à utiliser des modèles génératifs pour synthétiser des informations à partir de texte à l'aide des méthodes suivantes:

  • Farce
  • MapReduce
  • MapReduce avec des fragments 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 en tant que composant facturable de Google Cloud.

Découvrez les tarifs de Vertex AI et les tarifs de l'IA générative, et 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, les 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 situé 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é text-bison@001.
generation_model = TextGenerationModel.from_pretrained("text-bison@001")
  1. Préparez des 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)

Pour afficher quelques pages du fichier PDF téléchargé, procédez comme suit :

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

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

  1. Extrayez le texte de la page 2 uniquement du 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 d'invite que vous pourrez utiliser par la suite 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 LLM via l'API pour résumer les textes extraits. Notez que les LLM ont actuellement une limite de texte en entrée et qu'il est possible que le remplissage d'un texte de grande taille ne soit pas accepté. Pour en savoir plus sur les quotas et les limites, consultez la page 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 le message d'erreur suivant: 400 Request contient un invalid argument, 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 une partie du 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

La capture d'écran doit afficher le résultat suivant:

710efedd9f6dbc6d.png

Résumé

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

Avantages

  • Cette méthode n'appelle 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 permet d'améliorer le résultat.

Inconvénients

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

6. Méthode MapReduce

Pour résoudre ce problème dans le cas de documents volumineux, nous allons étudier la méthode MapReduce. Cette méthode divise d'abord les grandes données en parties plus petites, 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 ce morceau. Une fois que toutes les sorties initiales ont été générées, une autre invite est exécutée pour les combiner.

Consultez ce lien GitHub pour en savoir plus sur l'implémentation de cette méthode.

7. Félicitations

Félicitations ! Vous avez réussi à résumer un long document. Vous avez appris deux méthodes pour résumer de longs documents, ainsi que leurs avantages et leurs inconvénients. Il existe plusieurs méthodes pour résumer des documents volumineux. Recherchez deux autres méthodes : MapReduce avec des fragments qui se chevauchent et MapReduce avec un résumé glissant dans un autre atelier de programmation.

Il peut être difficile de résumer un long document. Cela vous oblige à identifier les principaux points du document, à synthétiser les informations et à les présenter de manière concise et cohérente. Cela peut être difficile si le document est complexe ou technique. De plus, résumer 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 résumer de longs documents de manière flexible, vous voudrez peut-être parfois accélérer le processus en utilisant l'amorçage ou des méthodes prédéfinies. C'est là qu'interviennent des bibliothèques comme LangChain. En savoir plus sur la compatibilité de LangChain sur Vertex AI