Aller au contenu
Studeia Docs
AI-assisted translation — last updated 2026-06-03. For original (pt-BR or en-US), use the language switcher.

RAG Ingestion : tuteur IA avec le contenu du cours

Ingérez slides, PDF, transcriptions vidéo, quiz et rich text dans le RAG per-tenant du tuteur IA. Embeddings Voyage AI (1024 dims), modes full/incrémental et auto-sync à l'édition des cours.

2026-06-03 6 min
Resposta curta

La RAG Ingestion dans Studeia permet au tuteur IA de citer le contenu de votre cours. POST /api/institution/courses/[id]/rag-ingest extrait le texte des leçons (slides, vidéos avec transcription, PDFs, quizzes), les découpe en chunks de 800 tokens avec un chevauchement de 200, génère des embeddings via Voyage AI (1024 dims, fallback OpenAI) et les stocke avec un filtre tenant+course. Modes full ou incremental. autoSyncRag=true réingère automatiquement lors de la modification des leçons.

Comment ça fonctionne

POST /api/institution/courses/[courseId]/rag-ingest
Body: { "mode": "full" | "incremental" }

  ↓
1. Liste les leçons publiées du cours
2. Pour chaque leçon, extrait le texte par type :
   - rich_text → suppression HTML
   - slides → jointure des éléments texte + notes du présentateur
   - quiz → jointure question + explication par question
   - pdf → document-extractor (PyPDF + Adobe extract fallback)
   - video → LiveClassTranscription.transcriptionText (si approuvée)
   - assignment → instructions
3. Chunking : 800 tokens, 200 de chevauchement, préserve la structure sémantique
4. Embeddings via Voyage AI (1024 dims, fallback OpenAI)
5. Crée ContentBlock + ContentEmbedding avec métadonnées :
   { source: "course_lesson", courseId, lessonId, lessonTitle,
     moduleTitle, ingestionId }
6. Statut final dans CourseRagIngestion

Modes

mode: "full"

Supprime TOUS les ContentBlock + ContentEmbedding du cours et réingère tout.

Quand l'utiliser :

  • Première ingestion du cours
  • Après une réorganisation majeure (modules renommés, leçons réordonnées)
  • Suspicion d'embeddings corrompus

Coût : proportionnel à la taille totale du cours. Typiquement $0.004 pour 30 leçons.

mode: "incremental"

Identifie les leçons modifiées après la dernière ingestion (updatedAt > lastIngestionAt), supprime uniquement les chunks de ces leçons et les réingère.

Quand l'utiliser :

  • Modifications ponctuelles
  • Auto-sync (recommandé pour la production)
  • Ajout de nouvelles leçons

Coût : proportionnel au delta. Typiquement $0.0001 par leçon modifiée.

Auto-sync

Course.autoSyncRag: Boolean @default(false)

Lorsque true :

  • Toute modification de leçon via l'API /api/institution/courses/[id]/modules/[mid]/lessons/[lid] déclenche une réingestion incrémentale
  • S'exécute via Next.js after() (ne bloque pas la requête de l'administrateur)
  • Échec silencieux enregistré dans CourseRagIngestion.errors JSON

Recommandé pour la production. Maintenez désactivé lors de la configuration initiale du cours pour éviter les embeddings gaspillés.

Statut et débogage

GET /api/institution/courses/[courseId]/rag-ingest

Response:
{
  "ingestionId": "uuid",
  "courseId": "uuid",
  "mode": "incremental",
  "status": "completed",  // pending | running | completed | failed
  "startedAt": "2026-05-23T10:00:00Z",
  "completedAt": "2026-05-23T10:01:34Z",
  "stats": {
    "lessonsProcessed": 5,
    "chunksCreated": 47,
    "tokensEmbedded": 12450,
    "costUsd": 0.0006
  },
  "errors": []
}

Fournisseur d'embeddings

FournisseurModèleDimsCoût/1K tokens
Voyage AI (principal)voyage-31024$0.00005
OpenAI (fallback)text-embedding-3-large (avec dimensions: 1024)1024$0.00013

Fetch direct (AI SDK v3 ne supporte pas le paramètre dimensions) :

// Voyage AI
fetch("https://api.voyageai.com/v1/embeddings", {
  body: JSON.stringify({
    model: "voyage-3",
    input: texts,
    input_type: "document"
  })
})

Retrieval en runtime

Durant le chat du tuteur, RetrievalAgent exécute :

const chunks = await retrieve({
  query: reformulatedQuery,
  filters: { tenantId, courseId },
  k: 10,
  tenantOnlyMode: true,  // exclut le fallback vers le contenu global
  boostByWeakAreas: studentModel.quizContext.weakAreas
});

tenantOnlyMode: true garantit que le tuteur ne cite JAMAIS le contenu d'un autre tenant — même si un contenu similaire existe dans la base de données.

Supprimer le RAG d'un cours

DELETE /api/institution/courses/[courseId]/rag-ingest

Supprime tous les ContentBlock + ContentEmbedding + CourseRagIngestion du cours. Utile pour archiver des cours sans occuper pgvector.

Limitations

  • Images : ne sont pas converties en embeddings. Feuille de route : description automatique via vision LLM avant l'embedding.
  • Équations mathématiques : extraites sous forme de texte de type LaTeX. Le RAG fonctionne mais la qualité dépend du balisage d'origine.
  • Vidéos sans transcription : ne sont pas ingérées. Configurez la transcription automatique dans MediaAsset (Whisper → Google STT) au préalable.
  • Taille maximale par cours : pgvector supporte des millions de vecteurs mais la latence de retrieval augmente. >10K chunks par cours peut devenir lent — envisagez de diviser en sous-cours.

Voir aussi

FAQ

Le tuteur IA cite-t-il le contenu de mon cours ?

Oui, mais vous devez d'abord ingérer le cours dans le RAG. POST /api/institution/courses/[id]/rag-ingest (modes : full | incremental). Le système extrait le texte de toutes les leçons publiées, les découpe en chunks, génère des embeddings via Voyage AI et les stocke avec un filtre par tenantId+courseId. Après cela, toutes les conversations du tuteur relatives au cours citent le bon contenu.

Comment mettre à jour le RAG lorsque je modifie une leçon ?

Définissez Course.autoSyncRag=true. Toute modification de leçon via l'API déclenche une réingestion incrémentale via after() (en arrière-plan, ne bloque pas l'administrateur). Alternativement, déclenchez manuellement : POST /api/institution/courses/[id]/rag-ingest body {mode: 'incremental'}.

Quel est le coût d'ingestion d'un cours ?

Embeddings via Voyage AI : ~$0.00005/1K tokens. Un cours moyen (30 leçons, 50K mots = ~70K tokens) coûte ~$0.004 en embeddings lors de la première ingestion. L'incrémental est proportionnel au delta. Aucun coût récurrent — les embeddings sont stockés dans pgvector.

Quels types de leçons sont ingérés ?

rich_text (suppression HTML), slides (éléments texte + notes du présentateur), quiz (question + explication), pdf (document-extractor : PyPDF→Adobe extract fallback), video (LiveClassTranscription.transcriptionText lorsque disponible), assignment (instructions). Les types external_link et live_class sans transcription ne sont pas ingérés.

Veja tambem

RAG Ingestion : tuteur IA avec le contenu du cours