El LangChain Expression Language (LCEL) es una forma declarativa y composable de construir cadenas (chains) en LangChain usando el operador | (pipe), lo que permite conectar componentes como si estuviéramos creando una tubería de procesamiento.
En lugar de crear objetos complejos o clases personalizadas, LCEL permite escribir flujos de trabajo de forma mucho más clara, modular y reutilizable.
Desde que lo uso, he notado tres mejoras claras:
Y lo mejor: funciona de manera natural con async, streaming y paralelización. 🔥
Antes de LCEL, construir cadenas en LangChain implicaba definir LLMChain, SequentialChain y otras estructuras que podían volverse verbosas rápidamente.
Con LCEL podemos hacer algo como esto:
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("Explica qué es {topic}")
model = ChatOpenAI()
chain = prompt | model
response = chain.invoke({"topic": "LangChain"})
print(response)
Así de simple.
LCEL convierte los flujos de LLM en algo más cercano a la programación funcional que a la programación orientada a objetos.
Y eso, desde mi punto de vista, lo hace mucho más potente y mantenible. 💡
Cuando trabajo con LCEL, suelo pensar en bloques conectables. Cada bloque implementa la interfaz Runnable.
Todo en LCEL es un Runnable. Puede ser:
Lo interesante es que puedes combinarlos usando el operador |.
Ejemplo:
chain = prompt | model | output_parser
|)
El operador | es el corazón de LCEL.
Permite:
Personalmente, cuando empecé a usarlo, sentí que estaba trabajando con algo similar a Unix pipes o a flujos de datos en frameworks funcionales. ⚙️
Una de las cosas que más me gusta de LCEL es que todas las cadenas soportan:
Para ejecutar una sola entrada:
chain.invoke({"topic": "Inteligencia Artificial"})
Para múltiples entradas:
chain.batch([
{"topic": "Python"},
{"topic": "Machine Learning"}
])
Para recibir resultados en tiempo real:
for chunk in chain.stream({"topic": "LangChain"}):
print(chunk)
Si estás trabajando con aplicaciones en tiempo real (chatbots, asistentes, dashboards), stream() cambia completamente la experiencia de usuario. 🚀
Voy a mostrarte cómo lo utilizo normalmente en producción.
from langchain.schema.output_parser import StrOutputParser
prompt = ChatPromptTemplate.from_template(
"Resume el siguiente texto en una frase:\n\n{text}"
)
model = ChatOpenAI(temperature=0)
parser = StrOutputParser()
chain = prompt | model | parser
resultado = chain.invoke({
"text": "LangChain es un framework para construir aplicaciones basadas en modelos de lenguaje..."
})
print(resultado)
Aquí estamos:
Todo en una sola línea declarativa.
Desde mi experiencia, estas son las principales ventajas:
Puedes crear piezas reutilizables y combinarlas como bloques LEGO.
LCEL permite ejecutar componentes en paralelo usando RunnableParallel.
Ejemplo:
from langchain.schema.runnable import RunnableParallel
chain = RunnableParallel({
"explicacion": prompt | model,
"resumen": otro_prompt | model
})
Esto es increíblemente útil cuando necesitas múltiples respuestas en una sola llamada. ⚡
En lugar de escribir:
chain = LLMChain(llm=model, prompt=prompt)
Ahora simplemente:
chain = prompt | model
Mucho más limpio.
Si trabajas con aplicaciones web (FastAPI, Django, Node backend, etc.), LCEL tiene soporte nativo para asincronía.
await chain.ainvoke({"topic": "LangChain"})
Esto hace que escalar aplicaciones con LLM sea mucho más sencillo.
Yo lo he integrado en APIs REST y la diferencia en rendimiento es notable cuando trabajas con muchas solicitudes concurrentes. 📈
Después de varios proyectos, estas son mis recomendaciones:
No mezcles lógica de negocio con definición de prompts.
Aunque el modelo parezca devolver texto simple, un OutputParser te da mayor control.
Divide procesos complejos en subcadenas reutilizables.
En producción suelo usar:
ChatOpenAI(temperature=0)
Para obtener resultados más deterministas.
| Característica | Enfoque clásico | LCEL |
|---|---|---|
| -------------- | --------------- | ----------- |
| Sintaxis | Verbosa | Declarativa |
| Composición | Más rígida | Flexible |
| Async | Limitado | Nativo |
| Streaming | Más complejo | Integrado |
Desde mi punto de vista, LCEL no es solo una mejora, es prácticamente la dirección futura de LangChain. 🔮
Te recomiendo usar LCEL si:
Si solo estás haciendo pruebas simples, puede parecer innecesario, pero en cuanto el proyecto crece… LCEL se vuelve imprescindible.
Después de varios meses utilizándolo, puedo decir que LangChain Expression Language ha cambiado completamente mi forma de construir aplicaciones con modelos de lenguaje.
Es:
Si estás trabajando con IA generativa en 2026 y aún no estás usando LCEL, te recomiendo empezar hoy mismo.
En mi caso, ya no concibo construir pipelines sin el operador |. Se siente natural, elegante y extremadamente poderoso. 💙
Jorge García
Fullstack developer