LangchainJavascriptChatbotLlm
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.