Procesamiento de PDFs y creación de resúmenes con LangChain

Clase 7 de 37Curso de LangChain

Resumen

¿Cómo trabajar con cadenas en procesamiento de lenguaje?

Las cadenas son fundamentales en LangChain, ya que permiten crear flujos de trabajo donde cada paso es un proceso diferente. Se ingresa un texto al inicio de la cadena y se transforma a través de diversos eslabones hasta obtener una respuesta utilizando un modelo de lenguaje. En esta guía, nos enfocaremos en las cadenas fundacionales y de utilidad, y en cómo cargarlas y procesarlas con ayuda de herramientas esenciales.

¿Cómo se carga un PDF para procesar con LangChain?

Para manejar documentos no estructurados como PDFs, debes instalar librerías especializadas:

  1. OnStructure: Permite a LangChain trabajar con diversos tipos de documentos no estructurados.
  2. PyPDF: Utilizada por LangChain para cargar y adecuar PDFs.
  3. ChromaDB: Una base de datos vectorial eficiente para gestionar embeddings.

Después de instalar estas herramientas, utiliza la librería requests para descargar un PDF desde una URL específica. Al abrirlo, guárdalo localmente para su posterior tratamiento.

import requests

# Obtención del PDF desde la URL
url = "URL_DEL_PDF"
r = requests.get(url)
with open("publickeycryptography.pdf", "wb") as f:
    f.write(r.content)

¿Cómo se procesa un PDF con PyPDFLoader en LangChain?

Para utilizar LangChain, necesitas su módulo DocumentLoaders y específicamente PyPDFLoader:

from langchain.document_loaders import PyPDFLoader

# Carga del PDF en el formato adecuado
loader = PyPDFLoader("publickeycryptography.pdf")
data = loader.load()

¿Cómo se integran los Embeddings con OpenAI y ChromaDB?

Una vez procesado el PDF, OpenAI embeddings deben importarse para convertir los datos al formato numérico requerido:

from langchain.embeddings import OpenAIEmbeddings

# Conversión del PDF en un formato embebido
embeddings = OpenAIEmbeddings()
embeddings_data = embeddings.embed_documents(data)

Finalmente, almacena estos embeddings en ChromaDB para utilizarlos con las cadenas de utilidad:

from langchain.vectorstores import Chroma

# Almacenamiento de embeddings en ChromaDB
vector_store = Chroma.from_embeddings(embeddings_data)

¿Cómo resumir un texto extenso con LoadSummarizeChain?

LangChain permite resumir documentos largos con herramientas adecuadas, como LoadSummarizeChain. Esta cadena puede manejar documentos extensos dividiéndolos en partes manejables y resumiéndolos individualmente, combinando los resúmenes individuales en uno final usando un enfoque MapReduce:

from langchain.chains import load_summarize_chain

# Configuración y ejecución de la cadena que resume
summary_chain = load_summarize_chain(
    model=LLM_DaVinci,
    chain_type="MapReduce"
)
summary = summary_chain.run(data)

¿Qué beneficios ofrece el uso de prompts?

El uso de prompts personalizados permite mejores resultados en los resúmenes generados. Puedes definir un prompt estilo mexicano, por ejemplo:

from langchain.prompts import PromptTemplate

template_text = "Escribe un resumen bien chido del siguiente rollo: {text}. Resumen corto con slang mexicano."
prompt_template = PromptTemplate(template=template_text, input_variables=["text"])

Con el chain tipo Stuff, utilizas este prompt para generar resúmenes más adaptados culturalmente:

informal_chain = load_summarize_chain(
    model=LLM_DaVinci,
    chain_type="Stuff",
    prompt_template=prompt_template,
    verbose=True
)

# Ejecución de la cadena con un extracto del PDF
resumen_mx = informal_chain.run(data[:2])

En esencia, el tipo Stuff limita el contexto al tamaño del prompt, lo que significa que grandes documentos deben ser acortados antes de ingresar al modelo. Sin embargo, permite la creación de recomendaciones culturalmente apropiadas y específicas.

En resumen, LangChain abre la puerta a una eficiente navegación y procesamiento de grandes cantidades de texto con un grado de personalización notorio, permitiendo a los usuarios crear flujos de trabajo precisos y culturalmente sensibles.