23/09/2025

¿Qué es LangChain? Crea Aplicaciones LLM

En este artículo utilizaremos código Python en una Jupyter Notebook para aprender a usar LangChain con modelos de lenguaje. Repasaremos los bloques básicos para entender cómo funciona el método de “encadenar” prompts y sus ventajas.

Introducción

Para poder aprovechar al máximo este artículo, te recomiendo tener instalado LM Studio con un LLM local como se explica en este artículo ó puedes utilizar tu propio API (de pago) de Open AI u otro modelo de lenguaje como Deepseek o Claude.

La propuesta es entender qué es y cómo funciona LangChain, que nos facilita y ordena el trabajo con LLMs. Lo ideal sería que vayas leyendo el artículo y probando el código en tu ordenador, siguiendo la Jupyter Notebook.

Esta es la serie de Artículos sobre Modelos de Lenguaje:
* ¿Cómo funcionan los Transformers?
* Generación de texto con GPT-2
* ¿Qué son los LLMs?
* Instala un LLM en tu ordenador
* Prompt Engineering
* ¿Qué es LangChain? <– este artículo!
* Crea Agentes Python <– próximamente
* ¿Qué son los RAGs? <– próximamente

En los próximos artículos veremos cómo crear tu propio RAG, “conversar con PDFs” y cómo crear Agentes Avanzados.

¿Qué es LangChain?

LangChain es un framework Open Source que permite a los desarrolladores trabajar con LLMs (Grandes Modelos de Lenguaje) y combinar diversos componentes externos y herramientas para crear Sistemas y Aplicaciones empresariales. Con LangChain podemos enlazar modelos poderosos como ChatGPT, Claude, Llama, Deepseek, Gemini a un conjunto de datasets o fuentes externas y potenciar su sabiduría, limitar las salidas, controlar y/o enriquecer a otros sistemas mediante técnicas de NLP (Procesamiento del lenguaje Natural) ó proporcionar diversa lógica de negocio propia de los casos de uso del proyecto en el cual estemos trabajando.

Desarrolladores, Ingenieros y Científicos de datos con experiencia en lenguajes de programación Python, JavaScript o TypeScript pueden hacer uso de los paquetes ofrecidos por LangChain.

¿Porqué es importante saber usar LangChain?

LangChain es un framework que simplifica el proceso de crear interfaces con Aplicaciones Generativas (GenAI). Ofrece diversas herramientas que permiten crear un “pipeline” (flujo de datos) para poder procesar una entrada y controlar -por ejemplo- el formato de salida, verificar los datos, enriquecerlos. También permite tener control sobre el histórico de mensajes que maneja el LLM, creando una sesión para mantener el hilo de una conversación, dándole capacidad de “Memoria” a nuestra app.

Otro punto importante es la creación de RAGs… Cómo bien sabes, cuando se entrenan los grandes modelos de lenguaje, se utiliza información de internet “temporal”; es decir, imaginemos que entrenamos un modelo con información hasta 2021, pues entonces el modelo entrenado no puede saber quién ganó el mundial de fútbol de 2023. Un RAG (Retrieval Augmented Generation) es un sistema que creamos que inyecta dinámicamente la “nueva información” en el Prompt del modelo para que el LLM pueda responder información actualizada. Otro caso de uso muy común es que tengamos un LLM privado al que proveemos documentos de una empresa, (imaginemos resoluciones legales ó actas) y aprovechamos el RAG para poder hacer consultas sobre esos documentos.

Volviendo a LangChain, posibilita el uso de “templates” que nos facilitan la creación tareas repetitivas, o template de RAGs, por ejemplo con conectores a “bases de datos vectoriales”, necesarios para poder acceder/consultar los documentos privados de manera escalable.

NOTA: Si bien en este artículo veremos la API de Langchain; lo cierto es que en este año (2025) está dando un giro importante sobre su versión “más profesional” llamada LangGraph, sobre la cual hablaremos en un próximo artículo.

Setup inicial – Requerimientos para empezar!

1-Crear un nuevo environment con la version Python 3.11 con Anaconda (o si lo prefieres con Poetry, pyenv, etc).

2-Instalar librerías y versiones. Para esta jupyter notebook utilizaremos:

3-Ejecutar el servidor de LM Studio con un modelo local (gratis!) ó necesitas la suscripción de pago a un proveedor y modelo por ej. GPT4o-mini de OpenAI, para ello, agrega la API_KEY en el ambiente de trabajo.

Modelos, Prompts y Parsers

Veamos algunos conceptos básicos que utilizaremos en LangChain para comenzar. Con “modelos” nos referimos a los modelos de lenguaje; por ejemplo si usamos un modelo “Llama” en Local, o DeepSeek o si usamos gpt-4o mediante API. Los Prompts son inputs para pasar al modelo, la entrada con las instrucciones. Y los parsers son los que toman la salida del modelo y modifican el formato para que sea útil.

Cuando haces una app con LangChain la idea es que tu “motor” sea el LLM; por lo tanto estará “repitiendo tareas” (automatizando) y necesitarás tener control tanto sobre las entradas, como de las salidas, para que la maquinaria funcione a la perfección, tal y como lo esperas.

Para empezar a hacer código creamos un objeto “Chat” de LangChain, desde donde conectamos cualquier modelo que tengamos corriendo en local, en nuestro ejemplo mediante LMStudio. Si utilizas un API utiliza este enlace de LangChain donde te muestra como instanciar el mismo objeto para diversos modelos que soporta: Groq, Mistral, Gemini, Antropic…

En nuestro ejemplo usamos el tipo “ChatOpenAI” que nos sirve de wrapper, aunque realmente conectaremos cualquier modelo local.

Usamos el chat, de manera directa llamando al método invoke() enviando un string e imprimimos la salida (atributo content). Aprovechamos en la Jupyter Notebook la función de Markdown para que imprima “bonito” en pantalla.

Ahora, en vez de pasar un string directamente, usaremos un Template, que nos empezará a dar juego por ejemplo para el reemplazo de variables:

Vamos a crear un Parser de texto para utilizar a continuación; este parser es muy sencillo pero luego veremos que hay parsers más avanzados para formato Json u objetos Pydantic.

Cadenas!

Veamos cómo podemos ejecutar el Template en formato cadena. Para ello usamos el carácter especial “pipe” | de la siguiente manera:

Entonces cuando llamamos al método “invoke()” de la cadena, pasamos las variables de entrada como un diccionario python. En nuestro ejemplo son cantidad y lugar. El método invoke llamará en cadena la implementación de esa función en cada una de las componentes hasta finalizar.

Para hacer la salida con formato JSON, usamos el parser ya existente de LangChain:

Salida Estructurada: Objetos Python con Pydantic

Podemos aprovechar las ventajas de Pydantic para definir objetos Python y tener validación automática. Para ello utilizamos el PydanticOutputParser; vemos un ejemplo:

NOTA: no todos los modelos soportan salida estructurada! Revisa en la tabla de Featured Providers si el modelo que vas a utilizar acepta “Structured Output“. En caso de no soportarlo recibiras un error de tipo “NotImplemented” o similar.

El objeto que retorna es un objeto Python y puedes acceder a sus atributos, iterar, etc.

Memoria

Cuando interactúas con un LLM por defecto no recuerdan las conversaciones previas. Cada request es “stateless” (sin estado) e independiente de los anteriores.

Cada vez que hacemos una consulta al LLM, deberemos pasar el historial previo, si queremos que tenga el contexto del pasado. De otro modo, en vez de ser un “chat”, o una charla, serán peticiones aisladas.

LangChain ofrece diversos mecanismos para administrar memoria. En este ejemplo administraremos la memoria manualmente usando una cola de Python que mantendrá los últimos 50 mensajes. Veamos el código:

Y ahora ponemos a prueba su memoria:

Si todo va bien, deberá recordar que el color favorito era el azul.

Flujo de Datos: Secuencial, Paralelo y Router

Otro aspecto que nos permite realizar LangChain, son diversos flujos de datos, en donde podemos diagramar distintas arquitecturas para nuestro sistema. Los 3 bloques básicos que veremos a continuación, con ejemplos en código, son la ejecución en secuencia, en paralelo y ramificaciones utilizando un router. Estos son los “ladrillos básicos”; esto quiere decir, que podemos seguir extendiendo el pipeline combinando esos mismos 3 bloques y aumentando el tamaño de nuestras cadenas.

Sequential chains

Para ejecutar en secuencia, podemos simplemente extender la cadena que utilizamos e ir alimentando con la salidas “previas” al próximo llamado. En este ejemplo veremos que utilizamos la salida del primer Prompt como entrada en el segundo.

Cadenas en Paralelo

Ahora usaremos consultas en paralelo al LLM (realmente al proveedor del servicio). Si ejecutamos en local, dependiendo del poder de nuestro ordenador, podrá manejar en simultáneo las peticiones, o será lento y parecido a un llamado secuencial. Pero en la práctica si utilizamos un servicio API externo como Google Gemini, OpenAi u otro, notaremos un aumento sustancial en la velocidad de procesamiento del pipeline.

En el siguiente ejemplo, realizamos 2 peticiones en simultáneo y unimos el resultado para generar una salida con las 2 respuestas anteriores.

Cuando invocamos la cadena principal, ésta se encargará de llamar en paralelo las sub-tareas pasando el mismo parámetro de entrada.

Ramificaciones mediante Router

En este caso, decidimos el camino que ejecutará la cadena, dependiendo de alguno de los outputs. Entonces el flujo tomará un camino especializado.

Una buena idea sería aprovechar las salidas estructuradas (como la de Pydantic que vimos antes) en el Router, y luego continuar el flujo.

Agentes

Por último, veamos el uso de un agente sencillo; dotamos de diversas herramientas al agente y luego preguntamos. El Agente deberá seleccionar la herramienta adecuada y responder.

En este caso le daremos acceso a Wikipedia, al buscador DuckDuckGo y a un motor interno para operaciones matemáticas.

Primero hacemos los imports

Definimos las herramientas

Y creamos al agente utilizando la función initialize_agent que provee Langchain:

Y ahora hacemos la consulta; en este ejemplo lo resuelve consultando Wikipedia (o a veces buscando con DuckDuckGo).

Al crear el agente con “verbose = True” nos permite ver “el pensamiento” y herramientas usadas por el agente.

Dale TUS herramientas

También podemos crear herramientas propias y asignarlas al agente para que las use si lo ve necesario:

Esto es muy útil para el ámbito empresarial, pues podemos aprovechar funcionalidad que ya tenemos hecha y dar acceso al agente para que le saque provecho.

Conclusión

El uso de LangChain se ha popularizado para el desarrollo de apps que utilizan Modelos de Lenguaje, hay personas que lo aman y otras que lo odian. A mi personalmente me parece que ofrece algunas ventajas para “estandarizar” y poder ordenar un poco el código, ofreciendo algunos patrones de diseño o “marco de trabajo” que podemos aprovechar y reutilizar. Además, permite crear una capa (bastante) independiente para poder usar un LLM y cambiarlo por otro sin conflicto. Esto es importante, porque al momento en el que queramos actualizar de gpt-3.5 a gpt-4 o a DeepSeek porque es más económico, lo podríamos hacer rápidamente; no tiene gran impacto a nivel código y puesta en producción. Inclusive si pasáramos de un modelo “sólo texto” a uno multimodal, con soporte a imágenes, video, sonido.

En el artículo vimos que podemos valernos de templates y parsers para controlar las entradas y salidas y también valernos de los bloques básicos secuencial, paralelo y router y combinarlos para construir flujos de datos complejos.

Finalmente dimos herramientas a un agente sencillo para delegar algunas funciones y darle mayor poder de actuación y decisión.

Tienes todo el código en el Repo de Github, cualquier duda o consulta, déjame tus comentarios.

En los próximos artículos, hablaremos más profundo sobre agentes y distintos tipos de RAGs.

Na8

Ingeniero en Sistemas, escribo sobre Machine Learning

View all posts by Na8 →

Leave a Reply