Skip to content

[Feature]: Job d'indexation (index time : PostgreSQL → Qdrant) #109

@mhd-hi

Description

@mhd-hi

Feature description

Implémenter le job NestJS one-shot qui lit la vue v_courses_for_embedding, construit le text blob et le payload pour chaque cours, génère le vecteur via bge-m3 (Transformers.js), et upsert dans la collection Qdrant courses_bge_m3. Le job est déclenché après le sync des jobs existants.

Proposed solution

Construction du text blob. Sérialisation en français naturel depuis les colonnes de la vue. Mapping de type appliqué ici (pas dans la vue) :

CONCE → "cours optionnel" | TRONC → "tronc commun" | PROFI → "cours de profil"

Format cible :

LOG635 — Intelligence artificielle. [description]. Préalables : LOG320. 
Type : cours optionnel. Programmes : génie logiciel. Cycle : 1.

Embedding. Appel à bge-m3 quantisé via Transformers.js avec input_type=passage. Exécuté dans un worker_threads Worker pour ne pas bloquer l'event loop NestJS. Dimension de sortie : 1024.

Payload. Construit depuis les mêmes colonnes de la vue, clés en anglais, types strictement typés (pas de null dans les tableaux).

Upsert Qdrant. upsertPoints avec id=course_id, vector, payload. Opération par batch de 50 cours (ou plus, à voir) pour limiter la pression mémoire.

Gestion d'erreurs. Échec sur un cours → log warning + skip, le job continue. Échec Qdrant persistant → log error, wait, retry, if its not a transient error, log error and exit.

Definition of Done

  • Job exécutable en one-shot (yarn run job:index ou équivalent)
  • Collection courses_bge_m3 créée avec la bonne dimension (1024) si elle n'existe pas
  • Tous les cours de la vue sont upsertés sans erreur sur un environnement local et dev si c'est disponible à temps
  • Le text blob généré pour LOG635 correspond au format attendu
  • Le payload stocké dans Qdrant correspond au schéma défini (vérifié via Qdrant dashboard ou getPoints)
  • Les erreurs d'embedding ou d'upsert individuelles n'interrompent pas le job — elles sont loggées
  • Durée d'exécution mesurée et loguée à la fin (N cours indexés en X secondes, M erreurs)

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Type

No type
No fields configured for issues without a type.

Projects

Status
Done

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions