Résumé automatique de texte

Les différents modèles de langage de grande taille (LLM) ont des limitations de longueur différentes pour les mots d'entrée dans l'invite. Lorsqu'il est nécessaire de résumer un long article, mais que sa longueur dépasse la limite maximale du modèle, il n'est pas possible de fournir directement l'article complet au modèle d'IA. Dans de tels scénarios, LangChain propose des stratégies et une encapsulation pour gérer cela. Ce chapitre présente principalement comment LangChain résout la problématique de résumé de texte.

Prétraitement des données

Tout d'abord, nous préparons les données de test. Dans cet exemple, nous chargeons un long document, puis découpons le document en plusieurs petits fragments de document.

  • Note : le chargement des données de fichier local ici est uniquement à des fins d'illustration. Dans des scénarios professionnels réels, vous pourriez charger les données du document à partir de votre propre base de données.
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.prompts import PromptTemplate

llm = OpenAI(temperature=0)

text_splitter = CharacterTextSplitter()
with open("../../state_of_the_union.txt") as f:
    state_of_the_union = f.read()
texts = text_splitter.split_text(state_of_the_union)
from langchain.docstore.document import Document

docs = [Document(page_content=t) for t in texts[:3]]

Pour commencer

La manière la plus simple de résumer un long texte est d'utiliser la tâche load_summarize_chain fournie par LangChain pour exécuter la tâche de résumé de texte.

from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)

L'utilisation de la chaîne encapsulée de résumé de texte fournie par LangChain est simple. Cependant, si vous devez affiner certains paramètres, veuillez vous référer au contenu suivant. Par exemple, l'exemple ci-dessus utilise un modèle de mots d'invite intégré, qui peut ne pas être convivial pour le chinois. Vous pouvez le changer pour votre propre modèle de mots d'invite, etc.

Explication du paramètre chain_type

LangChain a conçu 4 méthodes de traitement pour les cas où le mot d'invite de la tâche Chain dépasse la limite de longueur de jeton du LLM.

Les 4 types de chain_type sont les suivants :

  • stuff
  • map_reduce
  • refine
  • map_rerank

Type stuff

Il s'agit du type par défaut de LangChain, qui envoie tout le contenu du document au modèle LLM pour en faire un résumé. Il est donc appelé mode stuffing. Si le contenu du document est trop long, il dépassera certainement la limite de jetons du LLM.

Type map_reduce

Cette méthode envoie d'abord chaque fragment de document au modèle LLM pour un résumé individuel, puis combine tous les résumés, et fournit enfin un résumé global à l'IA, ce qui est similaire au concept de bibliothèques de fonctions map-reduce dans de nombreux langages de programmation.

Type refine

Cette méthode génère un résumé de texte de manière récapitulative. Elle envoie d'abord le contenu du premier document au modèle LLM pour un résumé, puis envoie le contenu du résumé du premier document + le contenu du deuxième document au modèle LLM pour un résumé, et ainsi de suite, pour obtenir un résumé final pour un long texte.

Type map_rerank

Il est utilisé dans les tâches de question-réponse. Il sélectionne les fragments de document les plus pertinents par rapport à la question, puis les envoie au modèle LLM pour répondre à la question.

Exemple de tâche stuff

Voici un exemple de résumé d'un article en utilisant le type stuff, qui convient aux articles qui ne dépassent pas la limite de longueur de jeton du LLM :

chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)

Mots d'invite personnalisés

Pour le type stuff, voici un exemple de mots d'invite personnalisés :

prompt_template = """Résumer le contenu suivant:

{text}

Résumé:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)

Exemple de tâche map_reduce

La tâche map_reduce résume l'article, et bien sûr, cette méthode entraînera plusieurs appels de modèles d'IA.

chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)

Mots personnalisés pour la tâche map_reduce

prompt_template = """Résumez le contenu suivant :

{text}

Résumé :"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="map_reduce", return_intermediate_steps=True, map_prompt=PROMPT, combine_prompt=PROMPT)
chain({"input_documents": docs}, return_only_outputs=True)

Exemple de tâche refine

Il suffit de changer le paramètre chain_type en refine.

chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)

Modèle de mots personnalisés pour la tâche refine

Voici un exemple de mots personnalisés pour la tâche refine :

prompt_template = """Résumez le contenu suivant :

{text}

Résumé :"""

PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])

refine_template = (
    "Votre tâche est de générer un résumé textuel final\n"
    "Voici les informations de résumé existantes : {existing_answer}\n"
    "Améliorez le résumé existant en fonction des nouvelles informations de base\n"
    "Les informations de base sont les suivantes\n"
    "------------\n"
    "{text}\n"
    "------------\n"
    "En fonction des informations de base, améliorez le résumé existant\n"
    "Renvoyez les informations de résumé existantes si les informations de base ne sont pas utiles."
)
refine_prompt = PromptTemplate(
    input_variables=["existing_answer", "text"],
    template=refine_template,
)
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="refine", return_intermediate_steps=True, question_prompt=PROMPT, refine_prompt=refine_prompt)
chain({"input_documents": docs}, return_only_outputs=True)