LCEL, le LangChain Expression Language, compose des Runnables en pipelines à l’aide d’opérateurs. Cette approche reste utile dans langchain-core, mais LangChain 1.x a recentré le package principal sur les agents. De nombreuses chaînes historiques ont été déplacées vers langchain-classic. Il faut donc distinguer le concept de composition de l’ancien catalogue de classes.
Le modèle mental des Runnables
Un Runnable reçoit une entrée et produit une sortie. Prompt, modèle, parser ou fonction peuvent être enchaînés si leurs contrats correspondent. La composition apporte invoke, batch, streaming et configuration communes. Gardez toutefois les types explicites : une chaîne compacte peut devenir illisible si les dictionnaires changent de forme à chaque étape.
Quand utiliser LCEL
LCEL convient à un pipeline borné : préparer un prompt, appeler un modèle, parser la sortie et éventuellement enrichir les données. Il permet parallélisme et branches simples sans créer un agent. Pour des boucles, un état durable, des interruptions ou une reprise, utilisez plutôt LangGraph ou une orchestration métier explicite.
LangChain 1.x et langchain-classic
Les anciennes classes comme plusieurs chains et retrievers vivent désormais dans langchain-classic. Elles peuvent maintenir un système existant, mais un nouveau flux simple gagne souvent à être écrit avec Runnables, fonctions ou create_agent selon le besoin. Épinglez séparément les packages d’intégration, dont les politiques de stabilité peuvent différer.
FAQ
LCEL est-il supprimé ?
Non. Les primitives Runnable restent importantes ; c’est surtout l’organisation des API haut niveau qui a changé.
Faut-il remplacer chaque chaîne historique ?
Pas immédiatement. Isolez-la, testez son comportement et migrez lorsqu’une alternative apporte un bénéfice.
LCEL remplace-t-il LangGraph ?
Non. LCEL compose des étapes ; LangGraph gère mieux état, boucles et reprise.
Une chaîne LCEL observable et testable
~~~python from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template( "Réponds en une phrase à partir de ce contexte :\n{context}\n\n{question}" ) chain = ( prompt | ChatOpenAI(model="gpt-4.1-mini", temperature=0) | StrOutputParser() ).with_config({"run_name": "answer_from_context"})
answer = chain.invoke({ "context": "Payload stocke les contenus éditoriaux.", "question": "Quel est le rôle de Payload ?", }) ~~~
LCEL est adapté aux pipelines déterministes : préparer, appeler, parser, enrichir. Utilisez RunnableParallel pour des branches indépendantes et RunnableLambda pour une petite transformation, mais évitez d’y cacher une orchestration complexe. Dès que le flux comporte boucles, reprise, validation humaine ou état persistant, un graphe LangGraph devient généralement plus lisible.