Resumen de IA de Texto

Los diferentes Modelos de Lenguaje Grande (LLM) tienen limitaciones de longitud diferentes para las palabras en la entrada de la solicitud. Si necesitamos resumir un extenso artículo, pero la longitud del artículo excede el límite máximo de longitud del modelo, no podemos alimentar directamente todo el artículo al modelo de IA. En tales escenarios, LangChain proporciona estrategias y encapsulamiento para manejar esto. Este capítulo principalmente presenta cómo LangChain resuelve la resumen de texto.

Preprocesamiento de Datos

Primero, preparamos los datos de prueba. En este ejemplo, cargamos un documento largo y luego dividimos el documento en múltiples fragmentos de pequeños documentos.

  • Nota: Cargar datos de archivo local aquí es solo para fines ilustrativos. En escenarios comerciales reales, es posible que cargues datos de documentos desde tu propia base de datos.
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]]

Empezando

La forma más fácil de resumir un texto largo es usar la tarea load_summarize_chain proporcionada por LangChain para ejecutar la tarea de resumen de texto.

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

Usar el Chain encapsulado de resumen de texto proporcionado por LangChain es simple. Sin embargo, si necesitas ajustar algunos parámetros, consulta el siguiente contenido. Por ejemplo, el ejemplo anterior usa una plantilla de palabras de solicitud incorporada, que puede no ser amigable para el chino. Puedes cambiarla a tu propia plantilla de palabras de solicitud, etc.

Explicación del Parámetro chain_type

LangChain ha diseñado 4 métodos de manejo para el caso en el que la palabra de solicitud de la tarea Chain exceda el límite de longitud del token del LLM.

Los 4 tipos de chain_type son los siguientes:

  • stuff
  • map_reduce
  • refine
  • map_rerank

Tipo stuff

Este es el tipo predeterminado de LangChain, que envía todo el contenido del documento al modelo LLM para resumirlo de una vez. Por lo tanto, se llama modo de relleno. Si el contenido del documento es demasiado largo, definitivamente excederá el límite de tokens de LLM.

Tipo map_reduce

Este método primero envía cada fragmento del documento al modelo LLM para resumirlo individualmente, luego combina todos los resúmenes y finalmente proporciona un resumen general a la IA, que es similar al concepto de bibliotecas de funciones map-reduce en muchos lenguajes de programación.

Tipo refine

Este método genera un resumen de texto de manera resumida. Primero envía el contenido del primer documento al modelo llm para resumirlo, luego envía el contenido del resumen del primer documento + el contenido del segundo documento al modelo llm para resumirlo, y así sucesivamente, para obtener un resumen final para un texto largo.

Tipo map_rerank

Esto se utiliza en tareas de preguntas y respuestas. Selecciona fragmentos de documentos con alta relevancia a la pregunta y luego los envía al modelo llm para responder la pregunta.

Ejemplo de tarea stuff

Aquí hay un ejemplo de resumir un artículo usando el tipo stuff, que es adecuado para artículos que no exceden el límite de longitud de tokens de LLM:

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

Palabras de Solicitud Personalizadas

Para el tipo stuff, aquí hay un ejemplo de palabras de solicitud personalizadas:

prompt_template = """Resumir el siguiente contenido:

{text}

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

Ejemplo de tarea map_reduce

map_reduce resume el artículo, y por supuesto, este método dará como resultado múltiples llamadas al modelo de inteligencia artificial.

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

Palabras de indicación personalizadas para la tarea map_reduce

prompt_template = """Resume el siguiente contenido:

{text}

Resumen:"""
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)

Ejemplo de tarea refine

Simplemente cambia el parámetro chain_type a refine.

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

Plantilla de palabras de indicación personalizadas para la tarea de refinamiento

Aquí tienes un ejemplo de palabras de indicación personalizadas para la tarea de refinamiento:

prompt_template = """Resume el siguiente contenido:

{text}

Resumen:"""

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

refine_template = (
    "Tu tarea es generar un resumen final en texto\n"
    "Aquí está la información de resumen existente: {existing_answer}\n"
    "Mejora el resumen existente basado en la nueva información de fondo\n"
    "La información de fondo es la siguiente\n"
    "------------\n"
    "{text}\n"
    "------------\n"
    "Basándote en la información de fondo, mejora el resumen existente\n"
    "Devuelve la información de resumen existente si la información de fondo no es útil."
)
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)