- Python 3.10+ installé
- Bases de Python (variables, fonctions, listes)
- Une clé API OpenAI (ou Ollama pour un usage 100% local)
- Environnement virtuel Python recommandé
Pourquoi LangChain ?
LangChain est le framework Python qui a standardisé la façon de construire des applications avec des LLM. Ses atouts :
- Compatible avec tous les LLM : OpenAI, Anthropic, Google, Ollama, HuggingFace…
- Abstractions réutilisables : chaînes, mémoire, retrieval, agents
- Écosystème riche : 300+ intégrations (bases de données, APIs, outils…)
- LangSmith : observabilité native pour le debugging
- Large communauté : 92k+ stars GitHub, documentation exhaustive
Installation
python -m venv .venv
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windows
# Installer LangChain et ses dépendances
pip install langchain langchain-openai langchain-community python-dotenv
# Créer le fichier .env
echo "OPENAI_API_KEY=votre-cle-api-ici" > .env
Étape 1 — Votre premier appel LLM
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
load_dotenv()
# Initialiser le modèle
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
# Premier appel
messages = [
SystemMessage(content="Tu es un assistant expert en IA pour PME."),
HumanMessage(content="Qu'est-ce qu'un agent IA en 2 phrases ?")
]
reponse = llm.invoke(messages)
print(reponse.content)
Étape 2 — Prompt Templates (réutilisables)
# Créer un template de prompt réutilisable
template = ChatPromptTemplate.from_messages([
("system", "Tu es un expert en {domaine}. Réponds en français, concis."),
("human", "{question}")
])
# Chaîner le template avec le modèle (LCEL - LangChain Expression Language)
chaine = template | llm
# Utiliser la chaîne
reponse = chaine.invoke({
"domaine": "cybersécurité pour PME",
"question": "Quelles sont les 3 menaces IA les plus courantes ?"
})
print(reponse.content)
Étape 3 — Mémoire conversationnelle
from langchain_core.runnables.history import RunnableWithMessageHistory
# Stocker l'historique en mémoire
historiques = {}
def obtenir_historique(session_id: str):
if session_id not in historiques:
historiques[session_id] = InMemoryChatMessageHistory()
return historiques[session_id]
# Ajouter la mémoire à la chaîne
chaine_avec_memoire = RunnableWithMessageHistory(
chaine,
obtenir_historique,
input_messages_key="question",
history_messages_key="history"
)
# Conversation avec mémoire
config = {"configurable": {"session_id": "user_1"}}
rep1 = chaine_avec_memoire.invoke({"question": "Je m'appelle Marc."}, config)
rep2 = chaine_avec_memoire.invoke({"question": "Comment je m'appelle ?"}, config)
print(rep2.content) # → "Vous vous appelez Marc."
Étape 4 — RAG avec LangChain
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# 1. Charger vos documents
loader = TextLoader("ma_documentation.txt", encoding="utf-8")
documents = loader.load()
# 2. Découper en chunks
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
chunks = splitter.split_documents(documents)
# 3. Créer la base vectorielle
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(chunks, embeddings)
# 4. Créer la chaîne RAG
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 3}),
return_source_documents=True
)
# 5. Interroger vos documents
resultat = qa_chain.invoke({"query": "Quelle est notre politique de remboursement ?"})
print(resultat["result"])
print(resultat["source_documents"]) # Sources citées
Pour une explication complète du RAG, voir notre article : RAG expliqué simplement.
Étape 5 — Votre premier agent avec outils
from langchain_core.tools import tool
# Définir des outils personnalisés
@tool
def calculer_tva(montant_ht: float) -> str:
"""Calcule le montant TTC à partir d'un montant HT (TVA 20%)."""
tva = montant_ht * 0.20
ttc = montant_ht + tva
return f"HT: {montant_ht}€, TVA: {tva:.2f}€, TTC: {ttc:.2f}€"
@tool
def rechercher_client(nom: str) -> str:
"""Recherche un client dans la base de données par nom."""
# En production : requête SQL ou API CRM
clients = {"Dupont": "SARL Dupont, 10 rue de Paris, CA: 500k€"}
return clients.get(nom, "Client non trouvé")
outils = [calculer_tva, rechercher_client]
# Créer le prompt de l'agent
prompt = ChatPromptTemplate.from_messages([
("system", "Tu es un assistant commercial pour PME. Utilise les outils disponibles."),
("human", "{input}"),
("placeholder", "{agent_scratchpad}")
])
# Créer et lancer l'agent
agent = create_tool_calling_agent(llm, outils, prompt)
executor = AgentExecutor(agent=agent, tools=outils, verbose=True)
resultat = executor.invoke({"input": "Quel est le TTC pour un devis de 2500€ HT ?"})
print(resultat["output"])
Utiliser LangChain avec Ollama (100% local)
from langchain_ollama import ChatOllama
# Remplacer OpenAI par Ollama — aucune autre modification nécessaire !
llm_local = ChatOllama(model="qwen2.5:14b", base_url="http://localhost:11434")
# Tout le reste du code fonctionne identiquement
Déboguer avec LangSmith
LangSmith est l'outil d'observabilité officiel de LangChain. Activez-le en ajoutant ces variables d'environnement :
LANGCHAIN_API_KEY=votre-cle-langsmith
LANGCHAIN_PROJECT=mon-projet-pme
Chaque appel LLM apparaît dans le dashboard LangSmith avec les tokens utilisés, la latence, et les entrées/sorties. Gratuit jusqu'à 5 000 traces/mois.
FAQ — LangChain
LangChain est-il toujours pertinent en 2026 face à CrewAI et LangGraph ?
Oui. LangChain est la fondation sur laquelle LangGraph est construit. CrewAI utilise aussi LangChain en interne. LangChain reste la bibliothèque la plus complète pour les intégrations (200+ connecteurs). En 2026, la recommandation est : LangChain pour les briques de base, LangGraph pour les agents stateful complexes, CrewAI pour les systèmes multi-agents simples à configurer.
Pourquoi ma chaîne LangChain est lente en production ?
Les causes les plus fréquentes : latence de l'API LLM (inévitable, 0.5-3s), re-calcul des embeddings à chaque requête (solution : persister la base vectorielle), chargement des documents à chaque appel (solution : charger une fois au démarrage), absence de streaming (solution : utiliser llm.stream() pour afficher les tokens en temps réel).