Quand un assistant conversationnel répond à « Comment contacter le service X ? », il invente parfois un numéro de téléphone ou un email plausible mais faux. Le problème vient d’un biais d’entraînement : un modèle a vu des milliers de numéros et est très bon pour en générer un qui « ressemble à un vrai ». Le RAG seul ne suffit pas, parce que si le contact n’apparaît pas dans les passages récupérés, le modèle comble le vide. La parade fiable est d’injecter un registry de contacts vérifié dans le system prompt avec une instruction stricte. Ce pattern réduit drastiquement les hallucinations LLM sur les données structurées.
Définir le registry comme source de vérité
Le registry est une liste maintenue à part du contenu RAG. On le stocke en CSV ou JSON, on le parse au démarrage de l’app, et on le formate pour le prompt à chaque requête. Le format CSV permet à un admin non-technique de mettre à jour les contacts via l’UI sans déploiement.
interface ServiceEntry {
name: string;
phone: string;
email: string;
contactUrl: string;
}
function parseRegistry(csv: string): ServiceEntry[] {
return csv
.split('\n')
.filter((line) => line && !line.startsWith('#'))
.slice(1)
.map((row) => {
const [name, phone, email, contactUrl] = row.split(';').map((f) => f.trim());
return { name, phone, email, contactUrl };
});
}Injecter le registry dans le system prompt
Le format envoyé au LLM doit rester compact et explicite. Une instruction négative en majuscules, placée avant la liste, réduit fortement les hallucinations LLM dans les tests A/B internes.
function buildSystemPrompt(registry: ServiceEntry[]): string {
const lines = registry
.map((s) => `- ${s.name}: tel ${s.phone}, email ${s.email}, ${s.contactUrl}`)
.join('\n');
return `Tu es l'assistant officiel de l'organisation.
RÈGLE STRICTE : pour toute question de contact, réponds UNIQUEMENT
avec les données ci-dessous. N'invente jamais un numéro ni un email.
REGISTRY DES CONTACTS :
${lines}`;
}Hallucinations LLM : le registry complète le RAG
Le RAG reste utile pour le contenu textuel libre comme les procédures, les FAQs ou les articles. Le registry couvre les données structurées critiques où une hallucination LLM est inacceptable : contacts, horaires, prix, identifiants. Cette séparation rend les hallucinations rares même avec un petit modèle, et le registry est facile à auditer parce qu’il est versionné indépendamment des chunks RAG.
