| title | Course RAG Chatbot |
|---|---|
| emoji | đ |
| colorFrom | blue |
| colorTo | purple |
| sdk | docker |
| app_port | 7860 |
| pinned | false |
Assistant conversationnel sur des cours IA DeepLearning.ai â rĂ©ponses sourcĂ©es, Ă©valuation continue, stack d'observabilitĂ© complĂšte.
Tu poses une question en langage naturel sur des cours IA (Anthropic Claude, MCP, RAG, Agent Skills, Claude Code...). Le systÚme retrouve les passages pertinents dans les transcriptions via recherche vectorielle multilingue, génÚre une réponse sourcée en streaming, et évalue la fidélité en temps réel.
"Comment fonctionne le tool use dans Claude ?"
â recherche vectorielle multilingue (paraphrase-multilingual-MiniLM-L12-v2)
â Claude Haiku synthĂ©tise avec les sources (tool use, max 2 rounds)
â RAGAS faithfulness : 0.93 â
â auto-tune MAX_RESULTS
Cette section rectifie ce que le reste de ce document (et CLAUDE.md) dĂ©crit et que le code ne fait pas. Ătabli par audit direct du code et interception du payload API rĂ©ellement envoyĂ© Ă Anthropic â pas par lecture seule.
11 transcriptions de cours DeepLearning.AI (anglais) sur Claude, MCP, RAG et agents. Transcriptions autonomes, sans référence croisée : aucune question multi-hop réelle n'y est testable.
- Le tool use Anthropic n'est pas exercé.
toolsettool_choicesont absents du payload API (vérifié par interception directe declient.messages.create). - Le retrieval est déclenché par un appel Python direct (
search_tool.execute) avant l'appel modĂšle. Architecture rĂ©elle : retrieve-then-stuff, un seul appel LLM par requĂȘte. Le modĂšle ne dĂ©cide jamais de chercher. - Le contexte est concatĂ©nĂ© dans le message utilisateur, prĂ©fixĂ©
"Course content:". CourseSearchTooln'est jamais instancié : code mort, présent uniquement dans sa définition et la documentation. Le tool enregistré estHybridSearchTool.
- Chemin effectif : BM25 + similarité euclidienne exacte (
np.linalg.normsur tout le corpus) + reranking cross-encoder surHYBRID_CANDIDATES=20. - Ce n'est pas l'index HNSW de ChromaDB, sollicité uniquement par
VectorStore.search()et_resolve_course_name(), tous deux hors du chemin exĂ©cutĂ©. - Ă cette Ă©chelle, la recherche exacte est le choix correct : rappel 100 %, pas d'approximation. HNSW Ă©change du rappel contre de la vitesse â sans intĂ©rĂȘt ici.
- Limite : le corpus est encodé intégralement au premier chargement et aprÚs chaque
reset_cache(). Ce coĂ»t d'initialisation â et non la recherche, vectorisĂ©e et O(nĂ384) â est le goulot. Seuil de bascule non mesurĂ©.
- Le
SYSTEM_PROMPTannonce au modÚle jusqu'à 2 recherches séquentielles.MAX_TOOL_ROUNDS=2et_handle_tool_executionexistent. Mais le tool use n'étant pas cùblé, cette capacité est structurellement inaccessible. - Le diagramme de
CLAUDE.md(AIGenerator â tool use â CourseSearchTool) ne reflĂšte plus le code.
- 9 blocs
except Exceptiondevector_store.pyavalaient leurs exceptions avec unprint(). Convertis en logs avec stack trace et contexte, ERROR ou WARNING selon l'impact rĂ©el. Flux de contrĂŽle inchangĂ©, mĂȘmes valeurs de retour. - Un seul est sur le chemin exercĂ© (
get_all_content) et c'Ă©tait le pire : une exception y produisait un corpus vide et le systĂšme rĂ©pondait"No relevant content found"â indiscernable d'une base lĂ©gitimement vide. Un flagcorpus_load_degradedsurHybridRetrieverdistingue dĂ©sormais les deux cas : corpus vide avec des cours indexĂ©s (get_course_count() > 0) dĂ©clenche un message dĂ©diĂ© cĂŽtĂ© utilisateur et un log ERROR cĂŽtĂ© serveur ; corpus lĂ©gitimement vide ne change pas de comportement.
| Niveau | Feature | Impact |
|---|---|---|
| 1 | Chunking sĂ©mantique â split sur headers markdown (###) avant normalisation, chaque section devient son propre vecteur |
recall exact sur termes techniques |
| 2 | Auto-tune MAX_RESULTS â ajuste automatiquement le nombre de chunks selon la moyenne glissante RAGAS (10 derniĂšres requĂȘtes) | fidĂ©litĂ© stable |
| 3 | Multi-round tool calling â jusqu'Ă 2 recherches sĂ©quentielles par requĂȘte pour les comparaisons cross-cours | questions complexes rĂ©solues |
- RAGAS faithfulness calculĂ© en arriĂšre-plan sur chaque requĂȘte, badge colorĂ© inline dans le chat (vert â„80%, orange â„60%, rouge <60%)
- Prometheus scrape
/metricstoutes les 15s â distributions de scores, latences - Grafana dashboards prĂ©configurĂ©s (port 3001)
- Phoenix OTEL traces de chaque appel LLM Anthropic (port 6006)
- INDEX_VERSION â version de schĂ©ma persistĂ©e dans ChromaDB ; bump automatique du rĂ©-index si la version change (chunking ou docs mis Ă jour)
- Scope restriction â le system prompt refuse les questions hors cours et les tentatives de prompt injection
- Pre-indexing build-time â ChromaDB baked dans l'image Docker, dĂ©marrage instantanĂ© (0 indexation Ă chaud)
- Streaming SSE â les tokens arrivent au fur et Ă mesure
- Bouton Copier sur chaque rĂ©ponse (clipboard â checkmark)
- Thumbs up/down sur chaque rĂ©ponse â feedback persistĂ© en JSON +
/api/feedback/summary - Toggle dark/light mode
- Historique de session
- Building Towards Computer Use with Anthropic
- MCP: Build Rich-Context AI Apps with Anthropic
- Prompt Engineering with Anthropic Claude
- Tool Use with Claude
- Agent Skills with Anthropic
- Claude Code: A Highly Agentic Coding Assistant
- Agent Skills Guide
- RAG en Production
- Bases de Récupération d'Informations et de Recherche (TF-IDF, BM25, RRF, embeddings)
- Cours sur le RAG â DeepLearning.ai (HNSW, Weaviate, chunking, re-ranking, ColBERT)
Frontend Vanilla JS + SSE streaming
Backend FastAPI · uvicorn · Python 3.13
LLM Anthropic Claude Haiku (tool use, max 2 rounds)
Fallback Ollama llama3.2:1b (inférence locale)
Vector DB ChromaDB (pré-indexé au build, persisté sur volume Docker)
Embeddings paraphrase-multilingual-MiniLM-L12-v2 (FR + EN)
Evals RAGAS faithfulness (LangchainLLMWrapper + ChatAnthropic)
Observ. Prometheus · Grafana · Arize Phoenix (OTEL)
Deploy HF Spaces (Docker) · Docker Compose local (6 services)
Utilisateur
â
âŒ
FastAPI /api/query/stream
â
ââ RAGSystem.query()
â ââ AIGenerator (tool use, max 2 rounds)
â â ââ CourseSearchTool â ChromaDB
â ââ SessionManager (historique)
â
ââ ragas_evaluator â async, timeout 60s, auto-tune MAX_RESULTS
â ââ Prometheus metrics
â
ââ Phoenix OTEL traces
Le Space est dĂ©ployĂ© sur HuggingFace Spaces â ChromaDB prĂ©-indexĂ© dans l'image, dĂ©marrage en ~30s.
Secret requis : dans les settings du Space â Secrets â ajouter
ANTHROPIC_API_KEY = sk-ant-...Sans cette clĂ©, l'app dĂ©marre mais toutes les requĂȘtes renvoient une erreur 503.
git push origin main && git push hf maincp .env.example .env
# Ajouter ANTHROPIC_API_KEY dans .env
docker compose up --build # premier lancement (~2 min, pull Ollama)
docker compose up # lancements suivants| Service | URL |
|---|---|
| Chatbot | http://localhost:8000 |
| Grafana | http://localhost:3001 · admin/admin |
| Phoenix | http://localhost:6006 |
| Prometheus | http://localhost:9091 |
uv sync
ollama serve # terminal séparé
cd backend && uv run uvicorn app:app --reload --port 8000DĂ©poser un .txt dans docs/ au format suivant, bumper INDEX_VERSION dans config.py, et redĂ©marrer â indexation automatique et idempotente :
Course Title: <titre>
Course Instructor: <nom>
### Lesson 1: <titre>
<contenu>...
### Lesson 2: <titre>
<contenu>...
cd backend && uv run pytest tests/ -v
# Tests comportementaux sur AIGenerator (multi-round tool calling)| Variable | Défaut | Description |
|---|---|---|
ANTHROPIC_API_KEY |
â | Requis |
ANTHROPIC_MODEL |
claude-haiku-4-5-20251001 |
ModĂšle principal |
OLLAMA_MODEL |
llama3.2:1b |
Fallback local |
PHOENIX_ENDPOINT |
http://localhost:6006/v1/traces |
Traces OTEL |
| Pattern | OĂč | Pourquoi |
|---|---|---|
| Facade | RAGSystem |
Interface unique query() sur VectorStore + AIGenerator |
| Strategy | AIGenerator / OllamaGenerator |
Swap LLM provider sans changer le code métier |
| Observer | ragas_evaluator + Prometheus |
MĂ©triques dĂ©couplĂ©es des requĂȘtes |
| Template Method | RAGSystem.query() |
SĂ©quence fixe : retrieve â generate â eval |
| Singleton | config |
Un seul objet Config partagé par tous les composants |