Las cadenas son el corazón de LangChain y dan nombre a la librería. Si quieres aprender cómo usar chains en LangChain para resumir documentos PDF largos, aquí encontrarás el flujo completo: desde cargar el archivo hasta generar resúmenes con prompts personalizados. Es un recurso útil para desarrolladores que trabajan con modelos de lenguaje y necesitan procesar contexto extenso.
¿Qué es una cadena en LangChain y cómo funciona?
Una cadena es una secuencia de eslabones donde cada uno representa un proceso distinto. Tú ingresas un texto al inicio, ese texto pasa por varios puntos del flujo y al final recibes una respuesta generada por un modelo de lenguaje.
En esta sesión nos enfocamos en dos tipos: las cadenas fundacionales y las de utilidad. Las de utilidad resuelven tareas específicas como resumir, y son las que vas a ver en acción con un PDF de 18 páginas sobre criptografía de clave pública [0:30].
¿Qué hace una chain en LangChain? Conecta varios pasos (carga de datos, embeddings, modelo, prompt) en una secuencia única. Tú das una entrada, la cadena la procesa por etapas y devuelve una salida final.
¿Qué librerías necesitas para cargar un PDF en LangChain?
Antes de tocar LangChain, necesitas tres dependencias clave que trabajan en conjunto para preparar el documento.
- Unstructured: librería que permite tratar documentos no estructurados, como el texto crudo de un PDF [1:05].
- PyPDF: se encarga de cargar PDFs y dejarlos en el formato adecuado para LangChain [1:18].
- Chroma DB: base de datos vectorial donde guardas los embeddings del documento [1:25].
Una vez instaladas, usas la librería Requests para descargar el PDF desde una URL y guardarlo localmente como public-key-cryptography.pdf. Hasta ahí no estás usando LangChain todavía, solo preparando el archivo.
¿Cómo cargar el PDF con PyPDFLoader?
Desde document_loaders de LangChain importas PyPDFLoader. Le pasas el path del archivo y llamas al método load() para obtener los datos en una variable. Ese objeto contiene las 18 páginas listas para procesarse [2:30].
¿Cómo generar embeddings y guardarlos en Chroma?
Importas OpenAIEmbeddings desde la librería de embeddings de LangChain. Esto convierte el texto a un formato numérico que el modelo entiende. Luego, desde vectorstores traes Chroma y guardas todo en una variable llamada vectorstore [3:00].
Con eso ya tienes el documento vectorizado y listo para alimentar una cadena de utilidad.
¿Cómo resumir un PDF largo con load_summarize_chain?
Un PDF de 18 páginas no cabe en el contexto de un modelo como ChatGPT por la interfaz gráfica. Aquí entra la cadena de utilidad load_summarize_chain, que importas desde la librería de chains de LangChain [4:00].
Creas una variable, por ejemplo cadena_que_resume_documentos, y le pasas dos argumentos:
- El modelo LLM, en este caso Davinci de OpenAI ya cargado previamente.
- El tipo de cadena:
map_reduce.
¿Qué hace map_reduce en LangChain? Genera un resumen de cada página por separado y luego combina todos esos resúmenes en uno final. Así procesa documentos que no caben de golpe en el prompt.
Llamas al método run() pasándole data y obtienes el resumen completo de las 18 páginas. Ese es el poder de map_reduce: trabaja iterativamente para sortear el límite de contexto.
¿Cuándo usar el tipo de cadena Stuff con un prompt personalizado?
Map_reduce no te deja inyectar un prompt propio. Si quieres personalizar las instrucciones, debes usar el tipo Stuff. La diferencia clave: Stuff mete todo el contexto en un solo prompt, así que el texto debe caber dentro del límite del modelo.
¿Cómo crear un PromptTemplate en LangChain?
Defines una plantilla con tu instrucción, por ejemplo: "Escribe un resumen bien chido del siguiente rollo", y dejas una variable llamada text que se rellenará con el contenido del PDF [6:30].
Luego importas PromptTemplate y le pasas dos parámetros:
- La plantilla que escribiste.
- Una lista de
input_variables, en este caso ["text"].
Con eso tienes un prompt reutilizable que la cadena va a inyectar dinámicamente.
¿Cómo configurar load_summarize_chain con tipo Stuff?
Creas otra variable, por ejemplo cadena_que_resume_con_slang, y vuelves a usar load_summarize_chain con estos argumentos:
llm: el modelo Davinci.
chain_type: "stuff".
prompt: el PromptTemplate que acabas de armar.
verbose=True: te deja ver el proceso interno de la cadena [8:00].
Como Stuff no parte el documento, solo le puedes pasar dos páginas del PDF, no las 18. Esa es su limitación principal.
¿Qué muestra el modo verbose al ejecutar una chain?
Al correr la cadena con run(), verbose imprime el prompt que se construye en tiempo real. Verás tu instrucción inicial, seguida del texto inyectado en la variable text (las primeras páginas del PDF en inglés), y al final la señal de que el modelo debe responder.
El resultado: un resumen en español con slang mexicano, aunque el texto fuente esté en inglés. Eso confirma que el PromptTemplate dirige el comportamiento del modelo.
En producción, pones verbose=False porque el usuario solo necesita ver el resultado, no el prompt interno.
¿Qué elementos básicos necesita una chain en LangChain?
Para armar una cadena funcional como las que viste, necesitas tres piezas mínimas:
- Un modelo de lenguaje (como Davinci cargado vía LangChain).
- Un tipo de cadena (stuff es el más usado porque acepta prompts personalizados).
- Un PromptTemplate con sus input_variables bien definidas.
La elección entre stuff y map_reduce depende del tamaño del documento y de si necesitas controlar el prompt. ¿Tú con cuál tipo de cadena empezarías para tu próximo proyecto? Cuéntame en los comentarios.