LangChain.js : créer un chatbot avec mémoire

🏷️ Intelligence Artificielle 📅 12/04/2026 13:00:00 👤 Mezgani said
LangchainJavascriptChatbotLlm
LangChain.js : créer un chatbot avec mémoire

Utiliser LangChain.js pour construire un chatbot intelligent avec mémoire conversationnelle, chains et agents.

Installation

LangChain.js est le portage JavaScript/TypeScript du framework Python LangChain.

npm install langchain @langchain/openai @langchain/core
A retenir : LangChain.js est modulaire — tu n'installes que les intégrations dont tu as besoin : @langchain/openai, @langchain/anthropic, @langchain/google-genai, etc.

LLM basique

Instancie un modèle et appelle invoke() pour envoyer un message.

import { ChatOpenAI } from '@langchain/openai';

const model = new ChatOpenAI({
  model: 'gpt-4o',
  temperature: 0.7,
});

const response = await model.invoke('Explique les Signals Angular.');
console.info(((response.content);

Utilise @langchain/anthropic ou @langchain/google-genai pour changer de provider sans modifier le reste du code.

Prompt Templates

Les ChatPromptTemplate permettent de créer des prompts réutilisables avec des variables.

import { ChatPromptTemplate } from '@langchain/core/prompts';
import { ChatOpenAI } from '@langchain/openai';

const prompt = ChatPromptTemplate.fromMessages([
  ['system', 'Tu es un expert en {language}. Réponds en français.'],
  ['human',  'Explique {concept} avec un exemple de code.'],
]);

const model = new ChatOpenAI({ model: 'gpt-4o' });

// Chain = prompt | model
const chain = prompt.pipe(model);

const response = await chain.invoke({
  language: 'TypeScript',
  concept: 'les génériques',
});
console.info((response.content);

Mémoire conversationnelle

La ChatMessageHistory stocke l'historique et le passe automatiquement dans le contexte.

import { ChatOpenAI } from '@langchain/openai';
import { ChatMessageHistory } from 'langchain/stores/message/in_memory';
import { RunnableWithMessageHistory } from '@langchain/core/runnables';
import { ChatPromptTemplate, MessagesPlaceholder } from '@langchain/core/prompts';

const model = new ChatOpenAI({ model: 'gpt-4o' });

const prompt = ChatPromptTemplate.fromMessages([
  ['system', 'Tu es un assistant développeur web.'],
  new MessagesPlaceholder('history'),
  ['human', '{input}'],
]);

const chain = prompt.pipe(model);

// Stocker l'historique par session
const sessions = {};
const getHistory = (sessionId) => {
  if (!sessions[sessionId]) sessions[sessionId] = new ChatMessageHistory();
  return sessions[sessionId];
};

const chainWithMemory = new RunnableWithMessageHistory({
  runnable: chain,
  getMessageHistory: getHistory,
  inputMessagesKey: 'input',
  historyMessagesKey: 'history',
});

// Utilisation
const config = { configurable: { sessionId: 'user-123' } };
const r1 = await chainWithMemory.invoke({ input: 'Je m\'appelle Alice.' }, config);
const r2 = await chainWithMemory.invoke({ input: 'Comment je m\'appelle ?' }, config);
console.info(r2.content); // "Tu t'appelles Alice."
A retenir : RunnableWithMessageHistory gère automatiquement le chargement et la sauvegarde de l'historique à chaque appel.

Chains LCEL

LCEL (LangChain Expression Language) permet de composer des chaînes avec l'opérateur |.

import { ChatOpenAI } from '@langchain/openai';
import { ChatPromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';

const model = new ChatOpenAI({ model: 'gpt-4o' });
const parser = new StringOutputParser();

// Chain : prompt → model → parser (string)
const chain = ChatPromptTemplate.fromTemplate(
  'Traduis ce texte en anglais : {text}'
).pipe(model).pipe(parser);

const result = await chain.invoke({ text: 'Bonjour le monde' });
console.info(result); // "Hello world"

// Streaming avec LCEL
const stream = await chain.stream({ text: 'Je code en Angular' });
for await (const chunk of stream) {
  process.stdout.write(chunk);
}

Retrieval (RAG simple)

Intègre un vector store pour répondre en se basant sur tes propres documents.

import { MemoryVectorStore } from 'langchain/vectorstores/memory';
import { OpenAIEmbeddings } from '@langchain/openai';
import { Document } from '@langchain/core/documents';

// Indexer des documents
const docs = [
  new Document({ pageContent: 'Angular est un framework front-end de Google.' }),
  new Document({ pageContent: 'React est une bibliothèque JavaScript de Meta.' }),
];

const vectorStore = await MemoryVectorStore.fromDocuments(
  docs,
  new OpenAIEmbeddings()
);

// Rechercher les documents pertinents
const results = await vectorStore.similaritySearch('framework Google', 1);
console.info(results[0].pageContent); // "Angular est un framework front-end de Google."
Note : En production, remplace MemoryVectorStore par Pinecone, Chroma, pgvector ou Supabase pour persister les vecteurs.