02-ce-que-je-construis/specs/ia-chatbot.md

Lot 2 — Chatbot RAG : spécification

Spécification de l'assistant documentaire : une interface web de questions/réponses sur la doc, qui réutilise le cœur RAG (retrieval) et Claude (génération), avec citations. Rattaché au cadre : specs/ia-vitrine.md. Socle : specs/ia-coeur.md. Statut : implémenté en prod (telaria.dev) — voir « Surfaces livrées » ci-dessous.


1. Objectif et périmètre

Le chatbot est la surface visible de l'initiative : poser une question en langage naturel et obtenir une réponse fondée sur la doc, avec ses sources. C'est aussi un actif réutilisable : pointé sur la doc d'un autre projet, il devient l'assistant de ce projet.

  • RĂ©utilise le retrieval du cĹ“ur (L0) et le port LLM (Claude).
  • Usage initial : dĂ©mos par l'auteur (pas d'accès public) → latence tolĂ©rable, faible volume.

Périmètre V1 : page de chat, question → retrieval → génération Claude → réponse avec citations. Hors V1 : historique multi-sessions, comptes, multi-projets simultanés, retour utilisateur (feedback).


Surfaces livrées (« l'assistant » et « le chat »)

La spécification ci-dessus est implémentée et déployée (telaria.dev) sous deux surfaces qui partagent le namespace App\Chat et le cœur RAG (retrieval) ; seule la résolution des réglages diffère :

  • « L'assistant » — page publique /assistant (ex-/chat), vocation dĂ©mo / exploration : le visiteur Ă©dite les rĂ©glages en live (modèle, k, seuil, tempĂ©rature, max_tokens, historique), stockĂ©s en session (un jeu par navigateur). RĂ©solution : forAssistant() (.env + session).
  • « Le chat » — assistant embarquĂ© dans le viewer /docs (offcanvas rĂ©tractable), vocation assistance de production : aucun rĂ©glage visiteur, paramètres figĂ©s en back-office (/admin/chat/params, entitĂ© ChatConfig). Les sources d'une rĂ©ponse sont des liens qui rechargent le document dans le viewer (navigation AJAX). RĂ©solution : forEmbeddedChat() (config BO).

Décisions d'implémentation : pas de streaming en V1 (rendu serveur) ; garde-fou hors-périmètre (score sous le seuil → « pas dans la doc », sans appel LLM). Réf. coordination codexia #40/#41.


2. Flux

Question ──▶ Retrieval (cœur L0) ──▶ Assemblage du prompt ──▶ Claude (génération) ──▶ Réponse + citations
            top-k passages              system + contexte         (streaming optionnel)
            + sources                   + question

3. Composants

3.1 Front (Symfony / Twig)

  • Page de chat : zone de saisie, fil de la conversation, rĂ©ponse avec liste des sources.
  • AmĂ©lioration progressive : un envoi form POST sans JavaScript renvoie une rĂ©ponse complète (rendu serveur). Le JavaScript (streaming, confort) est un plus, pas un prĂ©requis.
  • Design system existant (design.md, ui.md, bootstrap.md) ; conformitĂ© RGAA 4.1 AA (accessibility.md).

3.2 Orchestration (ChatService)

  1. Récupère les passages pertinents via le RetrievalService du cœur (top-k + sources).
  2. Assemble le prompt : system + contexte (passages + sources) + question.
  3. Appelle le port LLM (Claude) et récupère la réponse.
  4. Retourne la réponse et la liste des sources utilisées.

3.3 Port LLM (Claude)

  • Abstraction d'appel (modèle, max tokens, tempĂ©rature basse pour la factualitĂ©).
  • Prompt caching sur le bloc stable (system + contexte) pour rĂ©duire le coĂ»t (cf. cadre §3).

4. Conception du prompt

  • System prompt : rĂ´le (« assistant documentaire »), consignes strictes :
    • rĂ©pondre uniquement Ă  partir du contexte fourni ;
    • citer les passages utilisĂ©s ;
    • si le contexte ne contient pas la rĂ©ponse, le dire (ne pas inventer).
  • Contexte : les passages rĂ©cupĂ©rĂ©s, chacun avec sa source (chemin, section).
  • Prompt caching : le bloc system (+ contexte, si rĂ©utilisĂ©) est marquĂ© pour mise en cache.

5. Citations

Chaque réponse s'accompagne de ses sources : pour chaque passage utilisé, chemin + section + lien vers le document. Une réponse sans source pertinente est signalée comme telle (voir §8).


6. Périmètre V1 / hors V1

Aspect V1 Hors V1
Q/R sur la doc ✅ —
Citations des sources ✅ —
Rendu sans JS (amélioration progressive) ✅ —
Streaming de la réponse optionnel —
Historique de conversation session courante seulement multi-sessions, comptes
Multi-projets un projet à la fois sélecteur de projet

7. Accessibilité et design

  • RGAA 4.1 AA : structure en landmarks, libellĂ©s explicites, focus visible et logique, pas de piège clavier.
  • RĂ©ponse rendue dans une rĂ©gion aria-live="polite" pour annonce aux lecteurs d'Ă©cran.
  • CohĂ©rence visuelle avec le design system ; Ă©tats (chargement, erreur) accessibles.

8. Gouvernance et garde-fous

  • RĂ©ponses ancrĂ©es : si aucun passage pertinent (score sous un seuil), rĂ©pondre « cette information n'est pas dans la documentation » plutĂ´t que d'inventer (cf. fiche 6.1 — hallucinations).
  • Citations obligatoires : pas d'affirmation sans source dans le pĂ©rimètre documentaire.
  • Pas de donnĂ©es personnelles ; coĂ»t maĂ®trisĂ© (prompt caching, quotas) ; le RAG bien fait est dĂ©taillĂ© en fiche 4.3.

9. Configuration

  • chatbot.model : modèle Claude.
  • chatbot.k : nombre de passages rĂ©cupĂ©rĂ©s.
  • chatbot.temperature : basse (factualitĂ©).
  • chatbot.max_tokens : borne de la rĂ©ponse.
  • chatbot.score_threshold : seuil en deçà duquel on rĂ©pond « hors pĂ©rimètre ».
  • chatbot.prompt_cache : activation du caching.

10. Tests unitaires (cas concrets)

Orchestration (ChatService)

  • La question est transmise au RetrievalService (mockĂ©) ; le prompt assemblĂ© contient les passages rĂ©cupĂ©rĂ©s et la question.
  • Retrieval vide (ou scores sous le seuil) → rĂ©ponse « hors pĂ©rimètre », sans appel au LLM.
  • La rĂ©ponse expose les sources des passages effectivement utilisĂ©s (aucune source absente du contexte).

Port LLM (Claude mocké)

  • Les paramètres (modèle, tempĂ©rature, max tokens) sont transmis.
  • Le prompt caching est activĂ© sur le bloc stable.

Front (amélioration progressive)

  • form POST sans JS → rĂ©ponse complète rendue cĂ´tĂ© serveur.
  • La rĂ©ponse est rendue dans une rĂ©gion aria-live ; les liens de sources sont prĂ©sents et corrects.

Garde-fous

  • Aucune source inventĂ©e : toute source citĂ©e provient du contexte rĂ©cupĂ©rĂ©.
  • Une question hors doc dĂ©clenche le message « pas dans la documentation ».

Accessibilité

  • Landmarks prĂ©sents, libellĂ© du champ de saisie, ordre de tabulation logique, focus visible.

11. Démo

  • ScĂ©nario : 3-4 questions couvrant des thèmes de la doc (ex. RGPD, MCP, accessibilitĂ©) → rĂ©ponses sourcĂ©es.
  • Capture d'Ă©cran pour la vitrine (accès public non requis).

12. Production documentaire d'accompagnement (doctrine)

Concept introduit Forme Emplacement Statut
RAG de bout en bout (cœur + chatbot + Claude) Tuto rag-bout-en-bout.md ✅ produit
Prompt caching (réduire le coût Claude) Tuto prompt-caching-claude.md ✅ produit
Accessibilité d'une interface de chat Tuto accessibilite-chatbot.md ✅ produit

13. Points ouverts (à trancher à l'implémentation)

  1. Streaming : SSE / Mercure, ou réponse complète seulement en V1 ?
  2. Persistance de l'historique : session uniquement, ou stockage ?
  3. Seuil de score « hors périmètre » : valeur à calibrer.
  4. Sélecteur de projet (multi-projets) : V1 mono-projet, à étendre ensuite.

Documents liés

  • Cadre : specs/ia-vitrine.md
  • CĹ“ur RAG (retrieval) : specs/ia-coeur.md
  • Serveur MCP (autre surface) : specs/ia-mcp.md
  • Fiche RAG : agents/4-interagir-avec-l-ia/4-3-le-prompt-engineering-niveau-avance.md
  • Fiche hallucinations : agents/6-ethique-risques-et-limites/6-1-les-hallucinations.md

Implémentation

Aspect Localisation
Bundle principal telaria-app — namespace App\Chat
Service orchestration src/Chat/ChatService.php dans telaria-app
Page démo Route /assistant (ex-/chat) — réglages en session
Chat embarqué Offcanvas dans viewer /docs — paramètres figés via ChatConfig BO
Entité config src/Entity/ChatConfig.php (singleton) — administré via /admin/chat/params
Port LLM Abstraction Claude via telaria/rag-bundle (RetrievalService)
Config config/packages/telaria_rag.yaml (k, seuil, modèle)
Tests tutos/ia/rag-bout-en-bout.md, tutos/ia/prompt-caching-claude.md

Historique des décisions

Version Date Décision
1.0 2026-06-14 Version initiale — première formalisation du versioning des specs.
— 2026-06-04 Livré en prod sous deux surfaces : page /assistant (réglages session) et chat embarqué viewer /docs (réglages BO). Coordination codexia #40/#41.
— 2026-06-04 Pas de streaming en V1 (rendu serveur). Garde-fou hors-périmètre : score sous le seuil → « pas dans la doc », sans appel LLM.

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #