Un RAG comporte deux chemins : l’indexation transforme les documents en chunks et embeddings ; la requête retrouve quelques chunks puis les transmet au modèle.
Installer
~~~bash npm install langchain @langchain/openai @langchain/community @langchain/textsplitters chromadb ~~~
Indexer
~~~typescript import { Document } from '@langchain/core/documents'; import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters'; import { OpenAIEmbeddings } from '@langchain/openai'; import { Chroma } from '@langchain/community/vectorstores/chroma';
const docs = [ new Document({ pageContent: 'Paris est la capitale de la France.', metadata: { source: 'geo.md' } }), new Document({ pageContent: 'Lyon se trouve au confluent du Rhône et de la Saône.', metadata: { source: 'geo.md' } }), ]; const splitter = new RecursiveCharacterTextSplitter({ chunkSize: 500, chunkOverlap: 60 }); const chunks = await splitter.splitDocuments(docs); const embeddings = new OpenAIEmbeddings({ model: process.env.EMBEDDING_MODEL }); const store = await Chroma.fromDocuments(chunks, embeddings, { collectionName: 'demo-rag' }); ~~~
Retrouver
~~~typescript const retriever = store.asRetriever({ k: 3 }); const contextDocs = await retriever.invoke('Quelle est la capitale française ?'); console.table(contextDocs.map(d => ({ source: d.metadata.source, text: d.pageContent }))); ~~~
Inspectez ce résultat avant d’ajouter un LLM. Le bon passage doit figurer dans les premiers candidats.
Générer avec sources
Assemblez un prompt contenant la question et les chunks numérotés. Demandez de répondre uniquement à partir du contexte, de citer les numéros et de dire information absente si nécessaire. Conservez la correspondance entre numéro et metadata.source pour afficher de vrais liens.
Évaluer
Préparez des questions avec sources attendues et une question sans réponse. Mesurez recall@k, puis fidélité de la réponse. Ne choisissez pas un seuil de similarité sans le calibrer sur ces exemples.
Production
Persistez Chroma, protégez son endpoint et séparez collections par droits. Versionnez modèle d’embeddings et index. Lors d’un changement, créez une nouvelle collection plutôt que de mélanger deux espaces vectoriels.
FAQ
Pourquoi le RAG hallucine-t-il malgré un bon document ?
Vérifiez le prompt, la longueur du contexte et que le document est réellement transmis au modèle.
Chroma convient-il à la production ?
Cela dépend du volume et de l’exploitation souhaitée. Testez sauvegarde, concurrence, authentification et restauration.