Visitar URL original
GitHub - iaacsolution/starting-ragchatbot-codebase · GitHub
Skip to content

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

 
 

Latest commit

 

History

100 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

title Course RAG Chatbot
emoji 🎓
colorFrom blue
colorTo purple
sdk docker
app_port 7860
pinned false

Course RAG Chatbot

Assistant conversationnel sur des cours IA DeepLearning.ai — rĂ©ponses sourcĂ©es, Ă©valuation continue, stack d'observabilitĂ© complĂšte.

Python FastAPI Claude RAGAS Docker HF Spaces


Ce que ça fait

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

Note de rĂ©vision — 2026-07-19

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.

Corpus

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.

Architecture réelle

  • Le tool use Anthropic n'est pas exercĂ©. tools et tool_choice sont absents du payload API (vĂ©rifiĂ© par interception directe de client.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:".
  • CourseSearchTool n'est jamais instanciĂ© : code mort, prĂ©sent uniquement dans sa dĂ©finition et la documentation. Le tool enregistrĂ© est HybridSearchTool.

Retrieval

  • Chemin effectif : BM25 + similaritĂ© euclidienne exacte (np.linalg.norm sur tout le corpus) + reranking cross-encoder sur HYBRID_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Ă©.

Incohérences identifiées, non corrigées

  • Le SYSTEM_PROMPT annonce au modĂšle jusqu'Ă  2 recherches sĂ©quentielles. MAX_TOOL_ROUNDS=2 et _handle_tool_execution existent. 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.

Robustesse — corrections apportĂ©es (commit 4d41034)

  • 9 blocs except Exception de vector_store.py avalaient leurs exceptions avec un print(). 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 flag corpus_load_degraded sur HybridRetriever distingue 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.

Fonctionnalités

RAG Pipeline — amĂ©liorations progressives

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

Observabilité complÚte

  • 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 /metrics toutes les 15s — distributions de scores, latences
  • Grafana dashboards prĂ©configurĂ©s (port 3001)
  • Phoenix OTEL traces de chaque appel LLM Anthropic (port 6006)

Guardrails qualité

  • 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)

UX

  • 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

Cours indexés (10 cours DeepLearning.ai / Anthropic)

  • 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)

Stack

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)

Architecture

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

Déploiement

HF Spaces (production)

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 main

Docker local (dev complet avec observabilité)

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

Local sans Docker (dev rapide)

uv sync
ollama serve                          # terminal séparé
cd backend && uv run uvicorn app:app --reload --port 8000

Ajouter un cours

DĂ©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>...

Tests

cd backend && uv run pytest tests/ -v
# Tests comportementaux sur AIGenerator (multi-round tool calling)

Variables d'environnement

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

Patterns d'architecture

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

About

No description, website, or topics provided.

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages