Compare commits
3 Commits
ccc730f8c8
...
647ffa7a84
| Author | SHA1 | Date | |
|---|---|---|---|
|
647ffa7a84
|
|||
|
abe9e38628
|
|||
|
195b3c05c8
|
25
data/source/bilan_comptable_2024.csv
Normal file
25
data/source/bilan_comptable_2024.csv
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
"Category","Item","Value"
|
||||||
|
"ACTIF","Matériel sérigraphie","18 000"
|
||||||
|
"ACTIF","Mobilier & informatique","10 500"
|
||||||
|
"ACTIF","Stocks (marchandises)","42 300"
|
||||||
|
"ACTIF","Créances clients","18 720"
|
||||||
|
"ACTIF","Banque","35 600"
|
||||||
|
"ACTIF","Caisse","1 200"
|
||||||
|
"ACTIF","TOTAL ACTIF","126 320"
|
||||||
|
"PASSIF","Capital social","50 000"
|
||||||
|
"PASSIF","Réserves","15 000"
|
||||||
|
"PASSIF","Résultat 2024 (bénéfice)","22 400"
|
||||||
|
"PASSIF","Dettes fournisseurs","28 920"
|
||||||
|
"PASSIF","Dettes sociales & fiscales","8 000"
|
||||||
|
"PASSIF","Emprunt bancaire (reste à payer)","2 000"
|
||||||
|
"PASSIF","TOTAL PASSIF","126 320"
|
||||||
|
"COMPTE DE RÉSULTAT","Chiffre d'affaires HT","185 400"
|
||||||
|
"COMPTE DE RÉSULTAT","Achats de marchandises","-98 200"
|
||||||
|
"COMPTE DE RÉSULTAT","Variation de stock","+5 100"
|
||||||
|
"COMPTE DE RÉSULTAT","Marge brute","92 300"
|
||||||
|
"COMPTE DE RÉSULTAT","Charges externes","-28 500"
|
||||||
|
"COMPTE DE RÉSULTAT","Salaires & charges sociales","-38 000"
|
||||||
|
"COMPTE DE RÉSULTAT","Dotations aux amortissements","-3 400"
|
||||||
|
"COMPTE DE RÉSULTAT","Résultat d'exploitation","22 400"
|
||||||
|
"COMPTE DE RÉSULTAT","Impôt sur les sociétés (15%)","-3 360"
|
||||||
|
"COMPTE DE RÉSULTAT","RÉSULTAT NET","19 040"
|
||||||
|
9
data/source/employes.csv
Normal file
9
data/source/employes.csv
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
"Matricule","Nom Prénom","Poste","Date embauche","Contrat","Salaire brut mensuel (€)","Temps plein","N° Sécurité Sociale"
|
||||||
|
"EMP001","John Doe","Dirigeant","01/01/2020","CDI","5500","Oui","1 85 01 75 123 456 78"
|
||||||
|
"EMP002","Claire Moreau","Responsable production","15/02/2020","CDI","3200","Oui","2 92 03 75 987 654 32"
|
||||||
|
"EMP003","Ahmed Benali","Opérateur sérigraphie","10/06/2021","CDI","2100","Oui","1 97 06 13 456 789 01"
|
||||||
|
"EMP004","Léa Garnier","Graphiste","03/09/2022","CDI","2800","Oui","2 98 09 75 321 098 76"
|
||||||
|
"EMP005","Marc Duval","Logisticien","01/04/2023","CDI","2400","Oui","1 85 04 75 654 321 09"
|
||||||
|
"EMP006","Sarah Klein","Commerciale","12/11/2023","CDI","2600 + primes","Oui","2 93 11 75 123 456 78"
|
||||||
|
"EMP007","Tom Lemoine","Stagiaire graphisme","01/09/2024","Stage","800","Non","1 04 09 75 987 654 32"
|
||||||
|
"EMP008","Inès Ferreira","Apprentie logistique","01/09/2024","Apprent.","1200","Non","2 04 09 75 456 789 01"
|
||||||
|
4
data/source/fournisseurs.csv
Normal file
4
data/source/fournisseurs.csv
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
"Nom","SIRET","Contact","Produits fournis","Délai paiement","Note"
|
||||||
|
"TShirtFactory","987 654 321 00056","M. Dupont","T-shirts blancs & colorés","30 jours","5/5"
|
||||||
|
"CotonBio Europe","456 789 123 00045","Mme Rossi","Coton bio (Pologne, Hongrie)","45 jours","4/5"
|
||||||
|
"Encres ÉcoPrint","321 098 765 00034","M. Klein","Encres sérigraphie écologiques","30 jours","5/5"
|
||||||
|
19
data/source/historique_commandes.csv
Normal file
19
data/source/historique_commandes.csv
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
"Numéro de Commande","Date","Client","Email","Couleur","Motif","Taille","Quantité","Montant HT (€)","TVA (20%)","Montant TTC (€)","Statut"
|
||||||
|
"CMD-2024-001","15/03/2024","Marie Dupont","marie.dupont@gmail.com","Rouge","Motif1","M","2","58.50","11.70","70.20","Livrée"
|
||||||
|
"CMD-2024-001","15/03/2024","Marie Dupont","marie.dupont@gmail.com","Bleu","Motif5","L","1","58.50","11.70","70.20","Livrée"
|
||||||
|
"CMD-2024-002","22/04/2024","Lucas Martin","lucas.martin@orange.fr","Vert","Motif2","XL","3","80.10","16.02","96.12","Livrée"
|
||||||
|
"CMD-2024-002","22/04/2024","Lucas Martin","lucas.martin@orange.fr","Blanc","Motif7","S","2","80.10","16.02","96.12","Livrée"
|
||||||
|
"CMD-2024-003","10/05/2024","Emma Bernard","emma.b@free.fr","Noir","Motif10","L","1","79.20","15.84","95.04","En cours"
|
||||||
|
"CMD-2024-003","10/05/2024","Emma Bernard","emma.b@free.fr","Rose","Motif9","M","2","79.20","15.84","95.04","En cours"
|
||||||
|
"CMD-2024-004","03/06/2024","Association EcoPrint","contact@ecoprint.org","Jaune","Motif3","M","50 (personnalisé)","955.00","191.00","1146.00","Livrée"
|
||||||
|
"CMD-2024-005","18/07/2024","Paul Richard","paul.richard@yahoo.com","Orange","Motif5","XL","1","39.60","7.92","47.52","Livrée"
|
||||||
|
"CMD-2024-005","18/07/2024","Paul Richard","paul.richard@yahoo.com","Violet","Motif4","S","1","39.60","7.92","47.52","Livrée"
|
||||||
|
"CMD-2025-001","12/01/2025","Sophie Leroy","sophie.leroy@outlook.com","Gris","Motif1","L","2","58.10","11.62","69.72","Payée"
|
||||||
|
"CMD-2025-001","12/01/2025","Sophie Leroy","sophie.leroy@outlook.com","Blanc","Motif3","M","1","58.10","11.62","69.72","Payée"
|
||||||
|
"CMD-2025-002","25/02/2025","Entreprise TechWear","rh@techwear.fr","Bleu","Motif8","XL","100 (logo entreprise)","2090.00","418.00","2508.00","En préparation"
|
||||||
|
"CMD-2025-003","05/03/2025","Tom Durand","tom.durand@gmail.com","Rouge","Motif4","S","1","39.40","7.88","47.28","Annulée"
|
||||||
|
"CMD-2025-003","05/03/2025","Tom Durand","tom.durand@gmail.com","Vert","Motif10","M","1","39.40","7.88","47.28","Annulée"
|
||||||
|
"CMD-2025-004","14/03/2025","Léa Moreau","lea.moreau@wanadoo.fr","Rose","Motif6","L","2","59.60","11.92","71.52","Livrée"
|
||||||
|
"CMD-2025-004","14/03/2025","Léa Moreau","lea.moreau@wanadoo.fr","Jaune","Motif8","M","1","59.60","11.92","71.52","Livrée"
|
||||||
|
"CMD-2025-005","28/03/2025","Collectif ArtVif","artvif@asso.fr","Violet","Motif7","M","30","780.00","156.00","936.00","Planifiée"
|
||||||
|
"CMD-2025-005","28/03/2025","Collectif ArtVif","artvif@asso.fr","Orange","Motif1","L","20","780.00","156.00","936.00","Planifiée"
|
||||||
|
BIN
data/source/informations_entreprise.pdf
Normal file
BIN
data/source/informations_entreprise.pdf
Normal file
Binary file not shown.
7
data/source/planning_production_mars_2025.csv
Normal file
7
data/source/planning_production_mars_2025.csv
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
"Date","Opérateur","Commande","Article","Motif personnalisé","Qté","Statut"
|
||||||
|
"24/03","Ahmed Benali","CMD-2025-002","Bleu","Motif8","100","En cours"
|
||||||
|
"25/03","Ahmed + Marc","CMD-2025-005","Violet","Motif7","30","Planifié"
|
||||||
|
"26/03","Ahmed Benali","CMD-2025-005","Orange","Motif1","20","Planifié"
|
||||||
|
"27/03","Claire Moreau","Stock","Rouge","Motif1","50","Validé"
|
||||||
|
"28/03","Ahmed + Léa","CMD-2025-001","Gris","Motif1","2","Terminé"
|
||||||
|
"29/03","Marc Duval","Expédition","CMD-2025-004","2 colis (Léa + Sophie)","-","Expédié"
|
||||||
|
101
data/source/stock_tshirt.csv
Normal file
101
data/source/stock_tshirt.csv
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
Couleur;Motif;Fabrique;Prix (€);Grammage (g/m²);Stock;Endroit de fabrication;Provenance des matériaux;Taille disponible
|
||||||
|
Rouge;Motif1;TShirtFactory;18.5;148;182;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Rouge;Motif2;TShirtFactory;21.5;155;178;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Rouge;Motif3;TShirtFactory;21.6;74;190;France;Coton de Suisse;S, M, L, XL
|
||||||
|
Rouge;Motif4;TShirtFactory;21.4;161;176;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Rouge;Motif5;TShirtFactory;18.5;120;183;France;Coton de Suisse;S, M, L, XL
|
||||||
|
Rouge;Motif6;TShirtFactory;21.5;166;176;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Rouge;Motif7;TShirtFactory;19.8;172;102;France;Coton de République tchèque;S, M, L, XL
|
||||||
|
Rouge;Motif8;TShirtFactory;20.1;91;179;France;Coton de Norvège;S, M, L, XL
|
||||||
|
Rouge;Motif9;TShirtFactory;20.1;191;172;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Rouge;Motif10;TShirtFactory;19.5;103;185;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Bleu;Motif1;TShirtFactory;21.4;149;186;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Bleu;Motif2;TShirtFactory;21.0;169;181;France;Coton de Belgique;S, M, L, XL
|
||||||
|
Bleu;Motif3;TShirtFactory;19.6;156;180;France;Coton de Espagne;S, M, L, XL
|
||||||
|
Bleu;Motif4;TShirtFactory;20.3;100;170;France;Coton de Portugal;S, M, L, XL
|
||||||
|
Bleu;Motif5;TShirtFactory;18.7;71;173;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Bleu;Motif6;TShirtFactory;20.0;72;179;France;Coton de Grèce;S, M, L, XL
|
||||||
|
Bleu;Motif7;TShirtFactory;18.2;66;177;France;Coton de Danemark;S, M, L, XL
|
||||||
|
Bleu;Motif8;TShirtFactory;20.9;160;186;France;Coton de Espagne;S, M, L, XL
|
||||||
|
Bleu;Motif9;TShirtFactory;20.7;177;145;France;Coton de République tchèque;S, M, L, XL
|
||||||
|
Bleu;Motif10;TShirtFactory;20.7;70;171;France;Coton de Suède;S, M, L, XL
|
||||||
|
Vert;Motif1;TShirtFactory;18.8;62;175;France;Coton de Pays-Bas;S, M, L, XL
|
||||||
|
Vert;Motif2;TShirtFactory;19.8;190;172;France;Coton de Suède;S, M, L, XL
|
||||||
|
Vert;Motif3;TShirtFactory;21.8;160;182;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Vert;Motif4;TShirtFactory;20.6;181;181;France;Coton de France;S, M, L, XL
|
||||||
|
Vert;Motif5;TShirtFactory;20.6;162;175;France;Coton de Finlande;S, M, L, XL
|
||||||
|
Vert;Motif6;TShirtFactory;21.0;179;174;France;Coton de Italie;S, M, L, XL
|
||||||
|
Vert;Motif7;TShirtFactory;21.1;90;171;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Vert;Motif8;TShirtFactory;21.5;194;172;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Vert;Motif9;TShirtFactory;18.8;166;173;France;Coton de Belgique;S, M, L, XL
|
||||||
|
Vert;Motif10;TShirtFactory;18.0;154;173;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Jaune;Motif1;TShirtFactory;20.9;106;187;France;Coton de Suède;S, M, L, XL
|
||||||
|
Jaune;Motif2;TShirtFactory;20.7;97;182;France;Coton de Grèce;S, M, L, XL
|
||||||
|
Jaune;Motif3;TShirtFactory;19.1;194;189;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
Jaune;Motif4;TShirtFactory;20.2;136;173;France;Coton de Norvège;S, M, L, XL
|
||||||
|
Jaune;Motif5;TShirtFactory;19.2;169;171;France;Coton de Pays-Bas;S, M, L, XL
|
||||||
|
Jaune;Motif6;TShirtFactory;19.1;99;182;France;Coton de Pays-Bas;S, M, L, XL
|
||||||
|
Jaune;Motif7;TShirtFactory;19.6;98;181;France;Coton de Grèce;S, M, L, XL
|
||||||
|
Jaune;Motif8;TShirtFactory;20.0;146;188;France;Coton de Italie;S, M, L, XL
|
||||||
|
Jaune;Motif9;TShirtFactory;20.0;61;171;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
Jaune;Motif10;TShirtFactory;21.6;76;172;France;Coton de Suisse;S, M, L, XL
|
||||||
|
Noir;Motif1;TShirtFactory;21.7;185;141;France;Coton de République tchèque;S, M, L, XL
|
||||||
|
Noir;Motif2;TShirtFactory;18.3;94;173;France;Coton de Suède;S, M, L, XL
|
||||||
|
Noir;Motif3;TShirtFactory;21.2;109;173;France;Coton de France;S, M, L, XL
|
||||||
|
Noir;Motif4;TShirtFactory;20.3;56;184;France;Coton de Suisse;S, M, L, XL
|
||||||
|
Noir;Motif5;TShirtFactory;19.6;196;187;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Noir;Motif6;TShirtFactory;19.3;62;184;France;Coton de Espagne;S, M, L, XL
|
||||||
|
Noir;Motif7;TShirtFactory;19.3;65;177;France;Coton de Pays-Bas;S, M, L, XL
|
||||||
|
Noir;Motif8;TShirtFactory;19.0;110;187;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Noir;Motif9;TShirtFactory;18.5;80;177;France;Coton de Danemark;S, M, L, XL
|
||||||
|
Noir;Motif10;TShirtFactory;21.9;152;184;France;Coton de Suède;S, M, L, XL
|
||||||
|
Blanc;Motif1;TShirtFactory;18.4;99;183;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Blanc;Motif2;TShirtFactory;19.8;120;185;France;Coton de Finlande;S, M, L, XL
|
||||||
|
Blanc;Motif3;TShirtFactory;19.3;95;181;France;Coton de Espagne;S, M, L, XL
|
||||||
|
Blanc;Motif4;TShirtFactory;18.7;187;189;France;Coton de Portugal;S, M, L, XL
|
||||||
|
Blanc;Motif5;TShirtFactory;20.7;178;157;France;Coton de République tchèque;S, M, L, XL
|
||||||
|
Blanc;Motif6;TShirtFactory;21.4;119;185;France;Coton de Italie;S, M, L, XL
|
||||||
|
Blanc;Motif7;TShirtFactory;21.1;59;187;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Blanc;Motif8;TShirtFactory;18.7;165;186;France;Coton de Suisse;S, M, L, XL
|
||||||
|
Blanc;Motif9;TShirtFactory;20.2;141;171;France;Coton de Suède;S, M, L, XL
|
||||||
|
Blanc;Motif10;TShirtFactory;18.3;136;186;France;Coton de Suisse;S, M, L, XL
|
||||||
|
Orange;Motif1;TShirtFactory;19.4;140;171;France;Coton de Suisse;S, M, L, XL
|
||||||
|
Orange;Motif2;TShirtFactory;18.1;189;186;France;Coton de Finlande;S, M, L, XL
|
||||||
|
Orange;Motif3;TShirtFactory;18.4;164;182;France;Coton de Danemark;S, M, L, XL
|
||||||
|
Orange;Motif4;TShirtFactory;19.5;72;181;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Orange;Motif5;TShirtFactory;21.3;105;177;France;Coton de France;S, M, L, XL
|
||||||
|
Orange;Motif6;TShirtFactory;18.8;186;184;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Orange;Motif7;TShirtFactory;20.1;54;185;France;Coton de Suède;S, M, L, XL
|
||||||
|
Orange;Motif8;TShirtFactory;20.8;145;190;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Orange;Motif9;TShirtFactory;19.3;141;187;France;Coton de Norvège;S, M, L, XL
|
||||||
|
Orange;Motif10;TShirtFactory;20.3;106;174;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Violet;Motif1;TShirtFactory;18.6;138;184;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
Violet;Motif2;TShirtFactory;20.0;150;183;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Violet;Motif3;TShirtFactory;21.4;189;177;France;Coton de Pays-Bas;S, M, L, XL
|
||||||
|
Violet;Motif4;TShirtFactory;18.1;182;183;France;Coton de Finlande;S, M, L, XL
|
||||||
|
Violet;Motif5;TShirtFactory;18.5;134;184;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Violet;Motif6;TShirtFactory;20.6;175;174;France;Coton de Danemark;S, M, L, XL
|
||||||
|
Violet;Motif7;TShirtFactory;18.4;183;187;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Violet;Motif8;TShirtFactory;18.5;179;179;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
Violet;Motif9;TShirtFactory;18.5;114;180;France;Coton de Belgique;S, M, L, XL
|
||||||
|
Violet;Motif10;TShirtFactory;18.0;114;175;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Rose;Motif1;TShirtFactory;19.8;144;190;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Rose;Motif2;TShirtFactory;18.8;59;179;France;Coton de Pays-Bas;S, M, L, XL
|
||||||
|
Rose;Motif3;TShirtFactory;21.4;110;174;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Rose;Motif4;TShirtFactory;19.7;59;176;France;Coton de Belgique;S, M, L, XL
|
||||||
|
Rose;Motif5;TShirtFactory;19.8;92;170;France;Coton de Autriche;S, M, L, XL
|
||||||
|
Rose;Motif6;TShirtFactory;19.6;67;177;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
Rose;Motif7;TShirtFactory;20.6;89;173;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Rose;Motif8;TShirtFactory;21.8;132;190;France;Coton de Pologne;S, M, L, XL
|
||||||
|
Rose;Motif9;TShirtFactory;19.7;183;191;France;Coton de République tchèque;S, M, L, XL
|
||||||
|
Rose;Motif10;TShirtFactory;20.5;110;175;France;Coton de Suède;S, M, L, XL
|
||||||
|
Gris;Motif1;TShirtFactory;20.2;117;171;France;Coton de Danemark;S, M, L, XL
|
||||||
|
Gris;Motif2;TShirtFactory;21.6;146;171;France;Coton de Danemark;S, M, L, XL
|
||||||
|
Gris;Motif3;TShirtFactory;18.8;154;170;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Gris;Motif4;TShirtFactory;21.1;88;172;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
Gris;Motif5;TShirtFactory;19.6;124;190;France;Coton de Hongrie;S, M, L, XL
|
||||||
|
Gris;Motif6;TShirtFactory;21.1;179;77;France;Coton de République tchèque;S, M, L, XL
|
||||||
|
Gris;Motif7;TShirtFactory;18.4;57;188;France;Coton de Italie;S, M, L, XL
|
||||||
|
Gris;Motif8;TShirtFactory;20.9;179;170;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
Gris;Motif9;TShirtFactory;20.0;132;173;France;Coton de Espagne;S, M, L, XL
|
||||||
|
Gris;Motif10;TShirtFactory;19.5;72;177;France;Coton de Allemagne;S, M, L, XL
|
||||||
|
@ -13,4 +13,4 @@ pydantic>=2.0.0 # For data validation
|
|||||||
lancedb==0.6.13
|
lancedb==0.6.13
|
||||||
docling==2.31.0
|
docling==2.31.0
|
||||||
cohere==5.15.0
|
cohere==5.15.0
|
||||||
|
requests>=2.31.0
|
||||||
|
|||||||
49
src/RAG_pipeline.py
Normal file
49
src/RAG_pipeline.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
from typing import List, Optional, Dict
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from .interface.base_datastore import BaseDatastore
|
||||||
|
from .interface.base_evaluator import BaseEvaluator
|
||||||
|
from .interface.base_indexer import BaseIndexer
|
||||||
|
from .interface.base_response_generator import BaseResponseGenerator
|
||||||
|
from .interface.base_retriever import BaseRetriever
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class RAGpipeline:
|
||||||
|
|
||||||
|
indexer: BaseIndexer
|
||||||
|
datastore: BaseDatastore
|
||||||
|
retriever: BaseRetriever
|
||||||
|
response_generator: BaseResponseGenerator
|
||||||
|
evaluator: Optional[BaseEvaluator] = None
|
||||||
|
|
||||||
|
def reset(self) -> None:
|
||||||
|
self.datastore.reset_table()
|
||||||
|
|
||||||
|
def add_documents(self, documents: List[str]) -> None:
|
||||||
|
items = self.indexer.index(documents)
|
||||||
|
self.datastore.add_items(items= items)
|
||||||
|
return
|
||||||
|
|
||||||
|
def process_query(self, query: str, top_k: int = 5, source: bool = False) -> str:
|
||||||
|
"""Génère la réponse à la requête à partir du contexte récupéré.
|
||||||
|
Affiche éventuellement les sources.
|
||||||
|
Args:
|
||||||
|
query (str): Requête
|
||||||
|
top_k (int, optional): Nombre de documents à renvoyer. Defaults to 5.
|
||||||
|
source (bool, optional): Afficher ou non les sources. Default to false
|
||||||
|
Returns:
|
||||||
|
str: Réponse générée
|
||||||
|
"""
|
||||||
|
context = self.retriever.search_retriever(query, top_k= top_k)
|
||||||
|
|
||||||
|
if( source):
|
||||||
|
for i, doc in enumerate(context):
|
||||||
|
print(f"Based on the document {i+1}: {doc} \n")
|
||||||
|
|
||||||
|
response = self.response_generator.generate_response(query= query, context= context)
|
||||||
|
return response
|
||||||
|
|
||||||
|
def evaluate(self) -> None:
|
||||||
|
"""A compléter lors de l'ajout de l'évaluateur
|
||||||
|
"""
|
||||||
|
print("Function not completed.")
|
||||||
|
pass
|
||||||
@ -1,7 +1,8 @@
|
|||||||
from typing import List
|
from typing import List, Optional
|
||||||
from ..interface.base_response_generator import BaseResponseGenerator
|
from ..interface.base_response_generator import BaseResponseGenerator
|
||||||
import requests
|
from groq import Groq
|
||||||
import json
|
import os
|
||||||
|
|
||||||
|
|
||||||
SYSTEM_PROMPT = """Tu es un assistant intelligent qui répond aux questions en te basant sur le contexte fourni.
|
SYSTEM_PROMPT = """Tu es un assistant intelligent qui répond aux questions en te basant sur le contexte fourni.
|
||||||
|
|
||||||
@ -14,13 +15,32 @@ Règles importantes:
|
|||||||
|
|
||||||
|
|
||||||
class ResponseGenerator(BaseResponseGenerator):
|
class ResponseGenerator(BaseResponseGenerator):
|
||||||
|
|
||||||
def __init__(self, model_name: str = "llama3.2:3b", base_url: str = "http://localhost:11434"):
|
def __init__(self, api_key: Optional[str] = None):
|
||||||
self.model_name = model_name
|
try :
|
||||||
self.base_url = base_url
|
self.api_key = api_key or os.getenv("GROQ_API_KEY")
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError(f"erreur avec la clé API: {e}")
|
||||||
|
|
||||||
def generate_response(self, query: str, context: List[str]) -> str:
|
try:
|
||||||
"""Génère une réponse basée sur la requête et le contexte."""
|
self.client = Groq(api_key=self.api_key)
|
||||||
|
self.model = "llama-3.1-8b-instant" # Rapide et gratuit
|
||||||
|
print("✅ Générateur Groq initialisé avec succès")
|
||||||
|
except Exception as e:
|
||||||
|
raise ValueError(f"❌ Erreur lors de l'initialisation de Groq: {e}")
|
||||||
|
|
||||||
|
def generate_response(self, query: str, context: List[str], max_tokens: int = 512) -> str:
|
||||||
|
"""
|
||||||
|
Génère une réponse basée sur la requête et le contexte.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
query: Question de l'utilisateur
|
||||||
|
context: Liste de documents pertinents
|
||||||
|
max_tokens: Longueur maximale de la réponse
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Réponse générée
|
||||||
|
"""
|
||||||
|
|
||||||
# Formater le contexte
|
# Formater le contexte
|
||||||
formatted_context = "\n\n".join([f"Document {i+1}:\n{doc}" for i, doc in enumerate(context)])
|
formatted_context = "\n\n".join([f"Document {i+1}:\n{doc}" for i, doc in enumerate(context)])
|
||||||
@ -36,48 +56,31 @@ class ResponseGenerator(BaseResponseGenerator):
|
|||||||
|
|
||||||
# Appeler Ollama via l'API
|
# Appeler Ollama via l'API
|
||||||
try:
|
try:
|
||||||
response = requests.post(
|
response = self.client.chat.completions.create(
|
||||||
f"{self.base_url}/api/generate",
|
model=self.model,
|
||||||
json={
|
messages=[
|
||||||
"model": self.model_name,
|
{"role": "system", "content": SYSTEM_PROMPT},
|
||||||
"prompt": prompt,
|
{"role": "user", "content": prompt}
|
||||||
"stream": False,
|
],
|
||||||
"options": {
|
temperature=0.7,
|
||||||
"temperature": 0.7,
|
max_tokens=max_tokens,
|
||||||
"top_p": 0.9,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Vérifier le statut de la réponse
|
|
||||||
response.raise_for_status()
|
|
||||||
|
|
||||||
# Parser le JSON
|
answer = response.choices[0].message.content.strip()
|
||||||
result = response.json()
|
|
||||||
|
|
||||||
# DEBUG: Afficher la structure de la réponse
|
if not answer:
|
||||||
print(f"DEBUG - Structure de la réponse: {result.keys()}")
|
return "⚠️ Le modèle n'a pas pu générer de réponse."
|
||||||
|
|
||||||
# Vérifier les différentes clés possibles
|
return answer
|
||||||
if "response" in result:
|
|
||||||
return result["response"]
|
|
||||||
elif "message" in result:
|
|
||||||
return result["message"]
|
|
||||||
elif "content" in result:
|
|
||||||
return result["content"]
|
|
||||||
else:
|
|
||||||
# Si aucune clé attendue n'est trouvée
|
|
||||||
print(f"DEBUG - Réponse complète: {result}")
|
|
||||||
return f"Erreur: Format de réponse inattendu. Clés disponibles: {list(result.keys())}"
|
|
||||||
|
|
||||||
except requests.exceptions.ConnectionError:
|
|
||||||
return "❌ Impossible de se connecter au serveur Ollama. Vérifiez qu'Ollama est en cours d'exécution avec: ollama serve"
|
|
||||||
|
|
||||||
except requests.exceptions.Timeout:
|
|
||||||
return "⚠️ La génération a pris trop de temps. Essayez avec un modèle plus petit."
|
|
||||||
|
|
||||||
except requests.exceptions.HTTPError as e:
|
|
||||||
return f"❌ Erreur HTTP {response.status_code}: {e}"
|
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return f"❌ Erreur lors de la génération: {str(e)}"
|
error_msg = str(e).lower()
|
||||||
|
|
||||||
|
# Erreurs spécifiques
|
||||||
|
if "rate" in error_msg or "limit" in error_msg:
|
||||||
|
return "⚠️ Limite de requêtes atteinte. Attendez 1 minute et réessayez."
|
||||||
|
elif "authentication" in error_msg or "api" in error_msg:
|
||||||
|
return "❌ Erreur d'authentification. Vérifiez votre clé API dans le fichier .env"
|
||||||
|
else:
|
||||||
|
return f"❌ Erreur lors de la génération: {str(e)}"
|
||||||
|
|
||||||
Reference in New Issue
Block a user