Spaces:
Sleeping
Sleeping
Commit ·
eff6ee6
0
Parent(s):
Initial commit - Mini chatbot RAG
Browse files- .gitignore +5 -0
- README.md +63 -0
- app.py +309 -0
- app_gpt2.py +396 -0
- corpus/diffusion_models.txt +39 -0
- corpus/ethique_ia.txt +49 -0
- corpus/gan.txt +44 -0
- corpus/ia_act.txt +50 -0
- corpus/ia_art.txt +45 -0
- corpus/ia_cybersecurite.txt +45 -0
- corpus/ia_education.txt +46 -0
- corpus/ia_finance.txt +46 -0
- corpus/ia_medecine.txt +45 -0
- corpus/ia_rh.txt +49 -0
- corpus/llm.txt +50 -0
- corpus/rag.txt +52 -0
- corpus/rgpd_ia.txt +51 -0
- corpus/transformers.txt +43 -0
- corpus/vae.txt +45 -0
- rag.py +199 -0
- rag_gpt2.py +178 -0
- requirements.txt +6 -0
.gitignore
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
venv/
|
| 2 |
+
__pycache__/
|
| 3 |
+
*.pyc
|
| 4 |
+
.env
|
| 5 |
+
.cache/
|
README.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Mini Chatbot RAG — IA Générative
|
| 2 |
+
|
| 3 |
+
## Présentation du projet
|
| 4 |
+
|
| 5 |
+
Ce projet consiste en la création d’un mini système **RAG (Retrieval-Augmented Generation)** capable de répondre à des questions sur l’intelligence artificielle générative à partir d’un corpus documentaire personnalisé.
|
| 6 |
+
|
| 7 |
+
L’objectif pédagogique est de :
|
| 8 |
+
|
| 9 |
+
- comprendre le fonctionnement d’un système RAG ;
|
| 10 |
+
- comparer différents modèles génératifs ;
|
| 11 |
+
- analyser les limites des modèles de langage ;
|
| 12 |
+
- réduire les hallucinations grâce à un corpus documentaire.
|
| 13 |
+
|
| 14 |
+
Le projet utilise :
|
| 15 |
+
|
| 16 |
+
- un corpus thématique de 15 fichiers ;
|
| 17 |
+
- TF-IDF pour la recherche documentaire ;
|
| 18 |
+
- plusieurs modèles génératifs (FLAN-T5 et GPT-2) ;
|
| 19 |
+
- une interface interactive Gradio.
|
| 20 |
+
|
| 21 |
+
---
|
| 22 |
+
|
| 23 |
+
## Fonctionnement général du système
|
| 24 |
+
|
| 25 |
+
Le système fonctionne en plusieurs étapes :
|
| 26 |
+
|
| 27 |
+
1. L’utilisateur pose une question.
|
| 28 |
+
2. Le moteur RAG recherche les passages les plus pertinents dans le corpus.
|
| 29 |
+
3. Les documents récupérés sont classés selon leur pertinence.
|
| 30 |
+
4. Une réponse est générée ou extraite à partir du contexte trouvé.
|
| 31 |
+
5. Les sources utilisées sont affichées.
|
| 32 |
+
|
| 33 |
+
---
|
| 34 |
+
|
| 35 |
+
## Structure du projet
|
| 36 |
+
|
| 37 |
+
```bash
|
| 38 |
+
|
| 39 |
+
Mini_chatbot_RAG/
|
| 40 |
+
│
|
| 41 |
+
├── corpus/
|
| 42 |
+
│ ├── diffusion_models.txt
|
| 43 |
+
│ ├── ethique_ia.txt
|
| 44 |
+
│ ├── gan.txt
|
| 45 |
+
│ ├── ia_act.txt
|
| 46 |
+
│ ├── ia_art.txt
|
| 47 |
+
│ ├── ia_cybersecurite.txt
|
| 48 |
+
│ ├── ia_education.txt
|
| 49 |
+
│ ├── ia_finance.txt
|
| 50 |
+
│ ├── ia_medecine.txt
|
| 51 |
+
│ ├── ia_rh.txt
|
| 52 |
+
│ ├── llm.txt
|
| 53 |
+
│ ├── rag.txt
|
| 54 |
+
│ ├── rgpd_ia.txt
|
| 55 |
+
│ ├── transformers.txt
|
| 56 |
+
│ └── vae.txt
|
| 57 |
+
│
|
| 58 |
+
├── app.py
|
| 59 |
+
├── rag.py
|
| 60 |
+
├── app_gpt2.py
|
| 61 |
+
├── rag_gpt2.py
|
| 62 |
+
├── README.md
|
| 63 |
+
└── venv/
|
app.py
ADDED
|
@@ -0,0 +1,309 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import gradio as gr
|
| 2 |
+
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, pipeline
|
| 3 |
+
from rag import RAGEngine
|
| 4 |
+
|
| 5 |
+
|
| 6 |
+
# ───────── INITIALISATION RAG ─────────
|
| 7 |
+
rag = RAGEngine("corpus/")
|
| 8 |
+
|
| 9 |
+
|
| 10 |
+
# ───────── MODÈLE FLAN-T5 ─────────
|
| 11 |
+
model_name = "google/flan-t5-base"
|
| 12 |
+
|
| 13 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
| 14 |
+
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
|
| 15 |
+
|
| 16 |
+
|
| 17 |
+
def generate_answer(prompt, temperature=0.0, max_new_tokens=160):
|
| 18 |
+
inputs = tokenizer(
|
| 19 |
+
prompt,
|
| 20 |
+
return_tensors="pt",
|
| 21 |
+
truncation=True,
|
| 22 |
+
max_length=768
|
| 23 |
+
)
|
| 24 |
+
|
| 25 |
+
outputs = model.generate(
|
| 26 |
+
**inputs,
|
| 27 |
+
max_new_tokens=max_new_tokens,
|
| 28 |
+
do_sample=False,
|
| 29 |
+
repetition_penalty=1.5,
|
| 30 |
+
no_repeat_ngram_size=3,
|
| 31 |
+
early_stopping=True
|
| 32 |
+
)
|
| 33 |
+
|
| 34 |
+
return tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 35 |
+
|
| 36 |
+
|
| 37 |
+
# ───────── RÉPONSE CONTRÔLÉE POUR LE CHATBOT RAG ─────────
|
| 38 |
+
def controlled_answer(question, sources_found):
|
| 39 |
+
best = sources_found[0]
|
| 40 |
+
|
| 41 |
+
text = rag._clean_for_prompt(best.text)
|
| 42 |
+
|
| 43 |
+
sentences = [
|
| 44 |
+
s.strip()
|
| 45 |
+
for s in text.split(".")
|
| 46 |
+
if len(s.strip()) > 40
|
| 47 |
+
]
|
| 48 |
+
|
| 49 |
+
question_lower = question.lower()
|
| 50 |
+
|
| 51 |
+
if "risque" in question_lower:
|
| 52 |
+
keywords = [
|
| 53 |
+
"risque", "biais", "erreur",
|
| 54 |
+
"confidentialité", "sécurité",
|
| 55 |
+
"RGPD", "discrimination"
|
| 56 |
+
]
|
| 57 |
+
|
| 58 |
+
elif "application" in question_lower or "utilisation" in question_lower:
|
| 59 |
+
keywords = [
|
| 60 |
+
"utilisé", "applications",
|
| 61 |
+
"diagnostic", "analyse",
|
| 62 |
+
"détection"
|
| 63 |
+
]
|
| 64 |
+
|
| 65 |
+
elif "avantage" in question_lower or "importance" in question_lower:
|
| 66 |
+
keywords = [
|
| 67 |
+
"améliorer", "optimiser",
|
| 68 |
+
"aider", "utile"
|
| 69 |
+
]
|
| 70 |
+
|
| 71 |
+
else:
|
| 72 |
+
keywords = []
|
| 73 |
+
|
| 74 |
+
selected = [
|
| 75 |
+
s for s in sentences
|
| 76 |
+
if any(k.lower() in s.lower() for k in keywords)
|
| 77 |
+
]
|
| 78 |
+
|
| 79 |
+
if not selected:
|
| 80 |
+
selected = sentences[:4]
|
| 81 |
+
|
| 82 |
+
final_answer = ". ".join(selected[:4]).strip()
|
| 83 |
+
|
| 84 |
+
if not final_answer.endswith("."):
|
| 85 |
+
final_answer += "."
|
| 86 |
+
|
| 87 |
+
return (
|
| 88 |
+
final_answer
|
| 89 |
+
+ f"\n\nSource utilisée : {best.filename}"
|
| 90 |
+
)
|
| 91 |
+
# ───────── SENTIMENT ─────────
|
| 92 |
+
sentiment = pipeline(
|
| 93 |
+
"sentiment-analysis",
|
| 94 |
+
model="nlptown/bert-base-multilingual-uncased-sentiment"
|
| 95 |
+
)
|
| 96 |
+
|
| 97 |
+
|
| 98 |
+
# ───────── CHATBOT RAG ─────────
|
| 99 |
+
def chatbot_response(message, history, temperature, top_k):
|
| 100 |
+
if history is None:
|
| 101 |
+
history = []
|
| 102 |
+
|
| 103 |
+
if not message or not message.strip():
|
| 104 |
+
return history, "", "Veuillez poser une question."
|
| 105 |
+
|
| 106 |
+
# Pour stabiliser la démo, on force le meilleur passage uniquement
|
| 107 |
+
sources_found = rag.search(message, top_k=1)
|
| 108 |
+
|
| 109 |
+
if not sources_found:
|
| 110 |
+
answer = (
|
| 111 |
+
"Je ne dispose pas d’assez d’informations dans le corpus "
|
| 112 |
+
"pour répondre correctement à cette question."
|
| 113 |
+
)
|
| 114 |
+
|
| 115 |
+
history.append({"role": "user", "content": message})
|
| 116 |
+
history.append({"role": "assistant", "content": answer})
|
| 117 |
+
|
| 118 |
+
return history, "", "Aucune source suffisamment pertinente trouvée."
|
| 119 |
+
|
| 120 |
+
answer = controlled_answer(message, sources_found)
|
| 121 |
+
|
| 122 |
+
source_text = ""
|
| 123 |
+
for src in sources_found:
|
| 124 |
+
source_text += f"### {src.filename} — score : {src.score:.3f}\n"
|
| 125 |
+
source_text += f"{src.text[:400]}...\n\n"
|
| 126 |
+
|
| 127 |
+
history.append({"role": "user", "content": message})
|
| 128 |
+
history.append({"role": "assistant", "content": answer})
|
| 129 |
+
|
| 130 |
+
return history, "", source_text
|
| 131 |
+
|
| 132 |
+
|
| 133 |
+
# ───────── EXPLORATION CORPUS ─────────
|
| 134 |
+
def search_corpus(query, top_k):
|
| 135 |
+
if not query or not query.strip():
|
| 136 |
+
return "Entrez une requête de recherche."
|
| 137 |
+
|
| 138 |
+
results = rag.search(query, top_k=top_k)
|
| 139 |
+
|
| 140 |
+
if not results:
|
| 141 |
+
return "Aucun passage pertinent trouvé dans le corpus."
|
| 142 |
+
|
| 143 |
+
output = ""
|
| 144 |
+
|
| 145 |
+
for result in results:
|
| 146 |
+
output += f"## {result.filename} — score : {result.score:.3f}\n"
|
| 147 |
+
output += f"{result.text[:900]}...\n\n"
|
| 148 |
+
|
| 149 |
+
return output
|
| 150 |
+
|
| 151 |
+
|
| 152 |
+
# ───────── ANALYSE DE SENTIMENT ─────────
|
| 153 |
+
def analyse_sentiment(text):
|
| 154 |
+
if not text or not text.strip():
|
| 155 |
+
return "Entrez un texte à analyser."
|
| 156 |
+
|
| 157 |
+
result = sentiment(text)[0]
|
| 158 |
+
|
| 159 |
+
return f"""
|
| 160 |
+
Résultat : **{result['label']}**
|
| 161 |
+
|
| 162 |
+
Score de confiance : **{result['score']:.2f}**
|
| 163 |
+
"""
|
| 164 |
+
|
| 165 |
+
|
| 166 |
+
# ───────── GÉNÉRATION SANS RAG ─────────
|
| 167 |
+
def free_generation(prompt, temperature):
|
| 168 |
+
if not prompt or not prompt.strip():
|
| 169 |
+
return "Entrez un prompt."
|
| 170 |
+
|
| 171 |
+
return generate_answer(
|
| 172 |
+
prompt,
|
| 173 |
+
temperature=temperature,
|
| 174 |
+
max_new_tokens=220
|
| 175 |
+
)
|
| 176 |
+
|
| 177 |
+
|
| 178 |
+
# ───────── INTERFACE GRADIO ─────────
|
| 179 |
+
with gr.Blocks(title="Assistant RAG IA Générative") as app:
|
| 180 |
+
|
| 181 |
+
gr.Markdown("# Assistant RAG — IA Générative")
|
| 182 |
+
gr.Markdown(
|
| 183 |
+
"""
|
| 184 |
+
Cette application répond aux questions sur l’intelligence artificielle générative,
|
| 185 |
+
ses modèles, ses usages métier et ses enjeux éthiques à partir d’un corpus documentaire.
|
| 186 |
+
"""
|
| 187 |
+
)
|
| 188 |
+
|
| 189 |
+
with gr.Tab("Chatbot RAG"):
|
| 190 |
+
chatbot = gr.Chatbot(label="Conversation")
|
| 191 |
+
|
| 192 |
+
question = gr.Textbox(
|
| 193 |
+
label="Votre question",
|
| 194 |
+
placeholder="Exemple : Quels sont les risques de l'IA dans la médecine ?",
|
| 195 |
+
lines=2
|
| 196 |
+
)
|
| 197 |
+
|
| 198 |
+
with gr.Row():
|
| 199 |
+
temperature = gr.Slider(
|
| 200 |
+
minimum=0.0,
|
| 201 |
+
maximum=1.0,
|
| 202 |
+
value=0.0,
|
| 203 |
+
step=0.1,
|
| 204 |
+
label="Température"
|
| 205 |
+
)
|
| 206 |
+
|
| 207 |
+
top_k = gr.Slider(
|
| 208 |
+
minimum=1,
|
| 209 |
+
maximum=5,
|
| 210 |
+
value=1,
|
| 211 |
+
step=1,
|
| 212 |
+
label="Nombre de passages utilisés"
|
| 213 |
+
)
|
| 214 |
+
|
| 215 |
+
send_btn = gr.Button("Envoyer", variant="primary")
|
| 216 |
+
reset_btn = gr.Button("Réinitialiser la conversation")
|
| 217 |
+
|
| 218 |
+
sources = gr.Markdown(label="Sources utilisées")
|
| 219 |
+
|
| 220 |
+
send_btn.click(
|
| 221 |
+
chatbot_response,
|
| 222 |
+
inputs=[question, chatbot, temperature, top_k],
|
| 223 |
+
outputs=[chatbot, question, sources]
|
| 224 |
+
)
|
| 225 |
+
|
| 226 |
+
reset_btn.click(
|
| 227 |
+
lambda: ([], "", ""),
|
| 228 |
+
outputs=[chatbot, question, sources]
|
| 229 |
+
)
|
| 230 |
+
|
| 231 |
+
with gr.Tab("Explorer le corpus"):
|
| 232 |
+
gr.Markdown(
|
| 233 |
+
f"""
|
| 234 |
+
**Nombre de fichiers chargés :** {len(set(rag.chunk_sources))}
|
| 235 |
+
**Nombre de passages indexés :** {len(rag.chunks)}
|
| 236 |
+
"""
|
| 237 |
+
)
|
| 238 |
+
|
| 239 |
+
search_query = gr.Textbox(
|
| 240 |
+
label="Recherche dans la base de connaissances",
|
| 241 |
+
placeholder="Exemple : IA et finance"
|
| 242 |
+
)
|
| 243 |
+
|
| 244 |
+
search_top_k = gr.Slider(
|
| 245 |
+
minimum=1,
|
| 246 |
+
maximum=5,
|
| 247 |
+
value=3,
|
| 248 |
+
step=1,
|
| 249 |
+
label="Nombre de résultats"
|
| 250 |
+
)
|
| 251 |
+
|
| 252 |
+
search_btn = gr.Button("Rechercher")
|
| 253 |
+
search_output = gr.Markdown()
|
| 254 |
+
|
| 255 |
+
search_btn.click(
|
| 256 |
+
search_corpus,
|
| 257 |
+
inputs=[search_query, search_top_k],
|
| 258 |
+
outputs=search_output
|
| 259 |
+
)
|
| 260 |
+
|
| 261 |
+
with gr.Tab("Analyse de sentiment"):
|
| 262 |
+
sent_text = gr.Textbox(
|
| 263 |
+
label="Texte à analyser",
|
| 264 |
+
placeholder="Exemple : Ce projet est très intéressant et utile.",
|
| 265 |
+
lines=4
|
| 266 |
+
)
|
| 267 |
+
|
| 268 |
+
sent_btn = gr.Button("Analyser")
|
| 269 |
+
sent_output = gr.Markdown()
|
| 270 |
+
|
| 271 |
+
sent_btn.click(
|
| 272 |
+
analyse_sentiment,
|
| 273 |
+
inputs=sent_text,
|
| 274 |
+
outputs=sent_output
|
| 275 |
+
)
|
| 276 |
+
|
| 277 |
+
with gr.Tab("Génération sans RAG"):
|
| 278 |
+
gr.Markdown(
|
| 279 |
+
"""
|
| 280 |
+
Cet onglet permet de comparer une réponse générée sans contexte documentaire
|
| 281 |
+
avec une réponse enrichie par le RAG.
|
| 282 |
+
"""
|
| 283 |
+
)
|
| 284 |
+
|
| 285 |
+
free_prompt = gr.Textbox(
|
| 286 |
+
label="Prompt libre",
|
| 287 |
+
placeholder="Exemple : Explique les modèles de diffusion.",
|
| 288 |
+
lines=4
|
| 289 |
+
)
|
| 290 |
+
|
| 291 |
+
free_temp = gr.Slider(
|
| 292 |
+
minimum=0.0,
|
| 293 |
+
maximum=1.0,
|
| 294 |
+
value=0.0,
|
| 295 |
+
step=0.1,
|
| 296 |
+
label="Température"
|
| 297 |
+
)
|
| 298 |
+
|
| 299 |
+
free_btn = gr.Button("Générer")
|
| 300 |
+
free_output = gr.Textbox(label="Réponse sans RAG", lines=8)
|
| 301 |
+
|
| 302 |
+
free_btn.click(
|
| 303 |
+
free_generation,
|
| 304 |
+
inputs=[free_prompt, free_temp],
|
| 305 |
+
outputs=free_output
|
| 306 |
+
)
|
| 307 |
+
|
| 308 |
+
|
| 309 |
+
app.launch()
|
app_gpt2.py
ADDED
|
@@ -0,0 +1,396 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import re
|
| 2 |
+
import gradio as gr
|
| 3 |
+
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
|
| 4 |
+
|
| 5 |
+
from rag_gpt2 import RAGEngineGPT2
|
| 6 |
+
|
| 7 |
+
|
| 8 |
+
# ───────── INITIALISATION RAG ─────────
|
| 9 |
+
rag = RAGEngineGPT2("corpus/")
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
# ───────── MODÈLE GPT-2 ─────────
|
| 13 |
+
# Critique : GPT-2 standard est surtout anglophone et moins bon en instruction.
|
| 14 |
+
# On l'utilise ici pour comparer avec FLAN-T5, pas comme meilleur modèle.
|
| 15 |
+
model_name = "dbddv01/gpt2-french-small"
|
| 16 |
+
|
| 17 |
+
tokenizer = AutoTokenizer.from_pretrained(model_name)
|
| 18 |
+
model = AutoModelForCausalLM.from_pretrained(model_name)
|
| 19 |
+
|
| 20 |
+
if tokenizer.pad_token is None:
|
| 21 |
+
tokenizer.pad_token = tokenizer.eos_token
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
def generate_gpt2(prompt, max_new_tokens=120, temperature=0.7):
|
| 25 |
+
inputs = tokenizer(
|
| 26 |
+
prompt,
|
| 27 |
+
return_tensors="pt",
|
| 28 |
+
truncation=True,
|
| 29 |
+
max_length=768
|
| 30 |
+
)
|
| 31 |
+
|
| 32 |
+
outputs = model.generate(
|
| 33 |
+
**inputs,
|
| 34 |
+
max_new_tokens=max_new_tokens,
|
| 35 |
+
do_sample=True,
|
| 36 |
+
temperature=temperature,
|
| 37 |
+
top_p=0.9,
|
| 38 |
+
repetition_penalty=1.25,
|
| 39 |
+
no_repeat_ngram_size=3,
|
| 40 |
+
pad_token_id=tokenizer.eos_token_id
|
| 41 |
+
)
|
| 42 |
+
|
| 43 |
+
decoded = tokenizer.decode(outputs[0], skip_special_tokens=True)
|
| 44 |
+
|
| 45 |
+
# On enlève le prompt recopié par GPT-2
|
| 46 |
+
if decoded.startswith(prompt):
|
| 47 |
+
decoded = decoded[len(prompt):]
|
| 48 |
+
|
| 49 |
+
return decoded.strip()
|
| 50 |
+
|
| 51 |
+
|
| 52 |
+
def is_bad_generation(text: str) -> bool:
|
| 53 |
+
if not text or len(text.strip()) < 20:
|
| 54 |
+
return True
|
| 55 |
+
|
| 56 |
+
bad_patterns = [
|
| 57 |
+
"Question:",
|
| 58 |
+
"Questions:",
|
| 59 |
+
"Réponse en français",
|
| 60 |
+
"Contexte:",
|
| 61 |
+
"http",
|
| 62 |
+
]
|
| 63 |
+
|
| 64 |
+
if any(p.lower() in text.lower() for p in bad_patterns):
|
| 65 |
+
return True
|
| 66 |
+
|
| 67 |
+
words = text.split()
|
| 68 |
+
if len(words) > 10:
|
| 69 |
+
unique_ratio = len(set(words)) / len(words)
|
| 70 |
+
if unique_ratio < 0.45:
|
| 71 |
+
return True
|
| 72 |
+
|
| 73 |
+
return False
|
| 74 |
+
|
| 75 |
+
|
| 76 |
+
# ───────── RÉPONSE EXTRACTIVE CONTRÔLÉE ─────────
|
| 77 |
+
def extractive_answer(question, sources_found):
|
| 78 |
+
best = sources_found[0]
|
| 79 |
+
text = rag._clean_for_prompt(best.text)
|
| 80 |
+
|
| 81 |
+
sentences = [
|
| 82 |
+
s.strip()
|
| 83 |
+
for s in text.split(".")
|
| 84 |
+
if len(s.strip()) > 35
|
| 85 |
+
]
|
| 86 |
+
|
| 87 |
+
question_lower = question.lower()
|
| 88 |
+
|
| 89 |
+
if "risque" in question_lower:
|
| 90 |
+
keywords = [
|
| 91 |
+
"risque", "biais", "erreur", "erreurs",
|
| 92 |
+
"confidentialité", "données", "sécurité",
|
| 93 |
+
"RGPD", "discrimination", "supervision"
|
| 94 |
+
]
|
| 95 |
+
|
| 96 |
+
elif "application" in question_lower or "utilisation" in question_lower:
|
| 97 |
+
keywords = [
|
| 98 |
+
"utilisé", "utilisée", "applications",
|
| 99 |
+
"diagnostic", "analyse", "détection",
|
| 100 |
+
"générer", "prédire"
|
| 101 |
+
]
|
| 102 |
+
|
| 103 |
+
elif "avantage" in question_lower or "importance" in question_lower:
|
| 104 |
+
keywords = [
|
| 105 |
+
"améliorer", "optimiser", "aider",
|
| 106 |
+
"utile", "rapidité", "permet"
|
| 107 |
+
]
|
| 108 |
+
|
| 109 |
+
elif "définition" in question_lower or "c'est quoi" in question_lower or "qu'est-ce" in question_lower:
|
| 110 |
+
keywords = [
|
| 111 |
+
"désigne", "définition", "est", "sont"
|
| 112 |
+
]
|
| 113 |
+
|
| 114 |
+
else:
|
| 115 |
+
keywords = []
|
| 116 |
+
|
| 117 |
+
if keywords:
|
| 118 |
+
selected = [
|
| 119 |
+
s for s in sentences
|
| 120 |
+
if any(k.lower() in s.lower() for k in keywords)
|
| 121 |
+
]
|
| 122 |
+
else:
|
| 123 |
+
selected = sentences[:4]
|
| 124 |
+
|
| 125 |
+
if not selected:
|
| 126 |
+
selected = sentences[:4]
|
| 127 |
+
|
| 128 |
+
answer = ". ".join(selected[:4]).strip()
|
| 129 |
+
|
| 130 |
+
if not answer.endswith("."):
|
| 131 |
+
answer += "."
|
| 132 |
+
|
| 133 |
+
return answer
|
| 134 |
+
|
| 135 |
+
|
| 136 |
+
# ───────── RÉPONSE RAG + GPT-2 AVEC SÉCURITÉ ─────────
|
| 137 |
+
def gpt2_rag_answer(question, sources_found, temperature):
|
| 138 |
+
base_answer = extractive_answer(question, sources_found)
|
| 139 |
+
best = sources_found[0]
|
| 140 |
+
|
| 141 |
+
rewrite_prompt = f"""
|
| 142 |
+
Réécris ce texte en français clair et naturel sans ajouter d'information.
|
| 143 |
+
|
| 144 |
+
Texte :
|
| 145 |
+
{base_answer}
|
| 146 |
+
|
| 147 |
+
Réponse :
|
| 148 |
+
"""
|
| 149 |
+
|
| 150 |
+
generated = generate_gpt2(
|
| 151 |
+
rewrite_prompt,
|
| 152 |
+
max_new_tokens=100,
|
| 153 |
+
temperature=temperature
|
| 154 |
+
)
|
| 155 |
+
|
| 156 |
+
# GPT-2 est instable : si la génération est mauvaise, on garde la réponse extractive.
|
| 157 |
+
if is_bad_generation(generated):
|
| 158 |
+
final_answer = base_answer
|
| 159 |
+
else:
|
| 160 |
+
final_answer = generated
|
| 161 |
+
|
| 162 |
+
return final_answer + f"\n\nSource utilisée : {best.filename}"
|
| 163 |
+
|
| 164 |
+
|
| 165 |
+
# ───────── SENTIMENT ─────────
|
| 166 |
+
sentiment = pipeline(
|
| 167 |
+
"sentiment-analysis",
|
| 168 |
+
model="nlptown/bert-base-multilingual-uncased-sentiment"
|
| 169 |
+
)
|
| 170 |
+
|
| 171 |
+
|
| 172 |
+
# ───────── CHATBOT RAG GPT-2 ─────────
|
| 173 |
+
def chatbot_response(message, history, temperature, top_k, use_gpt2_rewrite):
|
| 174 |
+
if history is None:
|
| 175 |
+
history = []
|
| 176 |
+
|
| 177 |
+
if not message or not message.strip():
|
| 178 |
+
return history, "", "Veuillez poser une question."
|
| 179 |
+
|
| 180 |
+
# Pour stabiliser la réponse RAG, on utilise le meilleur passage.
|
| 181 |
+
sources_found = rag.search(message, top_k=1)
|
| 182 |
+
|
| 183 |
+
if not sources_found:
|
| 184 |
+
answer = (
|
| 185 |
+
"Je ne dispose pas d’assez d’informations dans le corpus "
|
| 186 |
+
"pour répondre correctement à cette question."
|
| 187 |
+
)
|
| 188 |
+
|
| 189 |
+
history.append({"role": "user", "content": message})
|
| 190 |
+
history.append({"role": "assistant", "content": answer})
|
| 191 |
+
|
| 192 |
+
return history, "", "Aucune source suffisamment pertinente trouvée."
|
| 193 |
+
|
| 194 |
+
if use_gpt2_rewrite:
|
| 195 |
+
answer = gpt2_rag_answer(message, sources_found, temperature)
|
| 196 |
+
else:
|
| 197 |
+
answer = extractive_answer(message, sources_found)
|
| 198 |
+
answer += f"\n\nSource utilisée : {sources_found[0].filename}"
|
| 199 |
+
|
| 200 |
+
source_text = ""
|
| 201 |
+
for src in sources_found:
|
| 202 |
+
source_text += f"### {src.filename} — score : {src.score:.3f}\n"
|
| 203 |
+
source_text += f"{src.text[:450]}...\n\n"
|
| 204 |
+
|
| 205 |
+
history.append({"role": "user", "content": message})
|
| 206 |
+
history.append({"role": "assistant", "content": answer})
|
| 207 |
+
|
| 208 |
+
return history, "", source_text
|
| 209 |
+
|
| 210 |
+
|
| 211 |
+
# ───────── EXPLORATION CORPUS ─────────
|
| 212 |
+
def search_corpus(query, top_k):
|
| 213 |
+
if not query or not query.strip():
|
| 214 |
+
return "Entrez une requête de recherche."
|
| 215 |
+
|
| 216 |
+
results = rag.search(query, top_k=top_k)
|
| 217 |
+
|
| 218 |
+
if not results:
|
| 219 |
+
return "Aucun passage pertinent trouvé dans le corpus."
|
| 220 |
+
|
| 221 |
+
output = ""
|
| 222 |
+
|
| 223 |
+
for result in results:
|
| 224 |
+
output += f"## {result.filename} — score : {result.score:.3f}\n"
|
| 225 |
+
output += f"{result.text[:900]}...\n\n"
|
| 226 |
+
|
| 227 |
+
return output
|
| 228 |
+
|
| 229 |
+
|
| 230 |
+
# ───────── SENTIMENT ─────────
|
| 231 |
+
def analyse_sentiment(text):
|
| 232 |
+
if not text or not text.strip():
|
| 233 |
+
return "Entrez un texte à analyser."
|
| 234 |
+
|
| 235 |
+
result = sentiment(text)[0]
|
| 236 |
+
|
| 237 |
+
return f"""
|
| 238 |
+
Résultat : **{result['label']}**
|
| 239 |
+
|
| 240 |
+
Score de confiance : **{result['score']:.2f}**
|
| 241 |
+
"""
|
| 242 |
+
|
| 243 |
+
|
| 244 |
+
# ───────── GÉNÉRATION LIBRE GPT-2 ─────────
|
| 245 |
+
def free_generation(prompt, temperature):
|
| 246 |
+
if not prompt or not prompt.strip():
|
| 247 |
+
return "Entrez un prompt."
|
| 248 |
+
|
| 249 |
+
generated = generate_gpt2(
|
| 250 |
+
prompt,
|
| 251 |
+
max_new_tokens=180,
|
| 252 |
+
temperature=temperature
|
| 253 |
+
)
|
| 254 |
+
|
| 255 |
+
return generated if generated else "GPT-2 n'a pas généré de réponse exploitable."
|
| 256 |
+
|
| 257 |
+
|
| 258 |
+
# ───────── INTERFACE GRADIO ─────────
|
| 259 |
+
with gr.Blocks(title="Assistant RAG GPT-2 — IA Générative") as app:
|
| 260 |
+
|
| 261 |
+
gr.Markdown("# Assistant RAG GPT-2 — IA Générative")
|
| 262 |
+
gr.Markdown(
|
| 263 |
+
"""
|
| 264 |
+
Cette version teste GPT-2 avec le même corpus documentaire.
|
| 265 |
+
|
| 266 |
+
**Critique importante :** GPT-2 est moins fiable que FLAN-T5 pour suivre des consignes.
|
| 267 |
+
Le mode RAG utilise donc une réponse extractive contrôlée, avec une option de reformulation par GPT-2.
|
| 268 |
+
"""
|
| 269 |
+
)
|
| 270 |
+
|
| 271 |
+
with gr.Tab("Chatbot RAG GPT-2"):
|
| 272 |
+
chatbot = gr.Chatbot(label="Conversation")
|
| 273 |
+
|
| 274 |
+
question = gr.Textbox(
|
| 275 |
+
label="Votre question",
|
| 276 |
+
placeholder="Exemple : Quels sont les risques de l'IA dans la médecine ?",
|
| 277 |
+
lines=2
|
| 278 |
+
)
|
| 279 |
+
|
| 280 |
+
with gr.Row():
|
| 281 |
+
temperature = gr.Slider(
|
| 282 |
+
minimum=0.1,
|
| 283 |
+
maximum=1.0,
|
| 284 |
+
value=0.5,
|
| 285 |
+
step=0.1,
|
| 286 |
+
label="Température GPT-2"
|
| 287 |
+
)
|
| 288 |
+
|
| 289 |
+
top_k = gr.Slider(
|
| 290 |
+
minimum=1,
|
| 291 |
+
maximum=5,
|
| 292 |
+
value=1,
|
| 293 |
+
step=1,
|
| 294 |
+
label="Nombre de passages utilisés"
|
| 295 |
+
)
|
| 296 |
+
|
| 297 |
+
use_gpt2_rewrite = gr.Checkbox(
|
| 298 |
+
label="Utiliser GPT-2 pour reformuler la réponse",
|
| 299 |
+
value=False
|
| 300 |
+
)
|
| 301 |
+
|
| 302 |
+
send_btn = gr.Button("Envoyer", variant="primary")
|
| 303 |
+
reset_btn = gr.Button("Réinitialiser la conversation")
|
| 304 |
+
|
| 305 |
+
sources = gr.Markdown(label="Sources utilisées")
|
| 306 |
+
|
| 307 |
+
send_btn.click(
|
| 308 |
+
chatbot_response,
|
| 309 |
+
inputs=[question, chatbot, temperature, top_k, use_gpt2_rewrite],
|
| 310 |
+
outputs=[chatbot, question, sources]
|
| 311 |
+
)
|
| 312 |
+
|
| 313 |
+
reset_btn.click(
|
| 314 |
+
lambda: ([], "", ""),
|
| 315 |
+
outputs=[chatbot, question, sources]
|
| 316 |
+
)
|
| 317 |
+
|
| 318 |
+
with gr.Tab("Explorer le corpus"):
|
| 319 |
+
gr.Markdown(
|
| 320 |
+
f"""
|
| 321 |
+
**Nombre de fichiers chargés :** {len(set(rag.chunk_sources))}
|
| 322 |
+
**Nombre de passages indexés :** {len(rag.chunks)}
|
| 323 |
+
"""
|
| 324 |
+
)
|
| 325 |
+
|
| 326 |
+
search_query = gr.Textbox(
|
| 327 |
+
label="Recherche dans la base de connaissances",
|
| 328 |
+
placeholder="Exemple : IA et finance"
|
| 329 |
+
)
|
| 330 |
+
|
| 331 |
+
search_top_k = gr.Slider(
|
| 332 |
+
minimum=1,
|
| 333 |
+
maximum=5,
|
| 334 |
+
value=3,
|
| 335 |
+
step=1,
|
| 336 |
+
label="Nombre de résultats"
|
| 337 |
+
)
|
| 338 |
+
|
| 339 |
+
search_btn = gr.Button("Rechercher")
|
| 340 |
+
search_output = gr.Markdown()
|
| 341 |
+
|
| 342 |
+
search_btn.click(
|
| 343 |
+
search_corpus,
|
| 344 |
+
inputs=[search_query, search_top_k],
|
| 345 |
+
outputs=search_output
|
| 346 |
+
)
|
| 347 |
+
|
| 348 |
+
with gr.Tab("Analyse de sentiment"):
|
| 349 |
+
sent_text = gr.Textbox(
|
| 350 |
+
label="Texte à analyser",
|
| 351 |
+
placeholder="Exemple : Ce projet est très intéressant et utile.",
|
| 352 |
+
lines=4
|
| 353 |
+
)
|
| 354 |
+
|
| 355 |
+
sent_btn = gr.Button("Analyser")
|
| 356 |
+
sent_output = gr.Markdown()
|
| 357 |
+
|
| 358 |
+
sent_btn.click(
|
| 359 |
+
analyse_sentiment,
|
| 360 |
+
inputs=sent_text,
|
| 361 |
+
outputs=sent_output
|
| 362 |
+
)
|
| 363 |
+
|
| 364 |
+
with gr.Tab("Génération libre GPT-2"):
|
| 365 |
+
gr.Markdown(
|
| 366 |
+
"""
|
| 367 |
+
Cet onglet montre GPT-2 sans RAG.
|
| 368 |
+
Il permet de comparer une génération libre avec une réponse appuyée sur le corpus.
|
| 369 |
+
"""
|
| 370 |
+
)
|
| 371 |
+
|
| 372 |
+
free_prompt = gr.Textbox(
|
| 373 |
+
label="Prompt libre",
|
| 374 |
+
placeholder="Exemple : Artificial intelligence in medicine is",
|
| 375 |
+
lines=4
|
| 376 |
+
)
|
| 377 |
+
|
| 378 |
+
free_temp = gr.Slider(
|
| 379 |
+
minimum=0.1,
|
| 380 |
+
maximum=1.0,
|
| 381 |
+
value=0.7,
|
| 382 |
+
step=0.1,
|
| 383 |
+
label="Température"
|
| 384 |
+
)
|
| 385 |
+
|
| 386 |
+
free_btn = gr.Button("Générer")
|
| 387 |
+
free_output = gr.Textbox(label="Réponse GPT-2", lines=8)
|
| 388 |
+
|
| 389 |
+
free_btn.click(
|
| 390 |
+
free_generation,
|
| 391 |
+
inputs=[free_prompt, free_temp],
|
| 392 |
+
outputs=free_output
|
| 393 |
+
)
|
| 394 |
+
|
| 395 |
+
|
| 396 |
+
app.launch()
|
corpus/diffusion_models.txt
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
Modèles de diffusion
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Les modèles de diffusion sont des modèles génératifs capables de créer des images, du son ou d’autres données à partir de bruit aléatoire. Ils sont notamment utilisés dans des outils comme Stable Diffusion, DALL-E ou Midjourney.
|
| 6 |
+
|
| 7 |
+
[FONCTIONNEMENT]
|
| 8 |
+
Le principe consiste à ajouter progressivement du bruit à une image pendant l’entraînement, puis à apprendre le processus inverse : retirer le bruit étape par étape pour reconstruire une image cohérente.
|
| 9 |
+
|
| 10 |
+
[APPLICATIONS]
|
| 11 |
+
Les modèles de diffusion sont utilisés pour :
|
| 12 |
+
- générer des images à partir de texte ;
|
| 13 |
+
- créer des illustrations artistiques ;
|
| 14 |
+
- améliorer la qualité d’images ;
|
| 15 |
+
- générer des images médicales synthétiques ;
|
| 16 |
+
- produire des contenus pour le design, la publicité ou les jeux vidéo.
|
| 17 |
+
|
| 18 |
+
[EXEMPLES]
|
| 19 |
+
Stable Diffusion permet de produire une image à partir d’un prompt textuel. DALL-E peut générer des scènes réalistes ou imaginaires en fonction d’une description écrite.
|
| 20 |
+
|
| 21 |
+
[AVANTAGES]
|
| 22 |
+
Les modèles de diffusion produisent souvent des images très détaillées et réalistes. Ils sont plus stables à entraîner que certains GAN et permettent un contrôle créatif important grâce aux prompts.
|
| 23 |
+
|
| 24 |
+
[RISQUES]
|
| 25 |
+
Les risques principaux sont :
|
| 26 |
+
- création de deepfakes ;
|
| 27 |
+
- génération de fausses images ;
|
| 28 |
+
- désinformation visuelle ;
|
| 29 |
+
- atteinte au droit d’auteur ;
|
| 30 |
+
- utilisation non autorisée du style d’artistes.
|
| 31 |
+
|
| 32 |
+
[LIMITES]
|
| 33 |
+
Ces modèles demandent beaucoup de puissance de calcul. Ils peuvent aussi générer des erreurs visuelles, comme des mains mal formées, des textes illisibles ou des incohérences dans les détails.
|
| 34 |
+
|
| 35 |
+
[ETHIQUE]
|
| 36 |
+
L’usage des modèles de diffusion doit être encadré pour éviter les contenus trompeurs, protéger les artistes et signaler clairement les images générées par IA.
|
| 37 |
+
|
| 38 |
+
[CONCLUSION]
|
| 39 |
+
Les modèles de diffusion représentent une avancée majeure de l’IA générative, surtout dans la création d’images, mais ils nécessitent une utilisation responsable.
|
corpus/ethique_ia.txt
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
Éthique de l’intelligence artificielle
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
L’éthique de l’intelligence artificielle désigne l’ensemble des principes qui permettent de concevoir, utiliser et contrôler des systèmes IA de manière responsable, équitable et respectueuse des droits humains.
|
| 6 |
+
|
| 7 |
+
[OBJECTIF]
|
| 8 |
+
L’objectif principal de l’éthique IA est d’éviter que les systèmes automatisés produisent des décisions injustes, discriminatoires, opaques ou dangereuses pour les individus.
|
| 9 |
+
|
| 10 |
+
[PRINCIPES]
|
| 11 |
+
Les grands principes de l’éthique IA sont :
|
| 12 |
+
- équité ;
|
| 13 |
+
- transparence ;
|
| 14 |
+
- explicabilité ;
|
| 15 |
+
- responsabilité ;
|
| 16 |
+
- sécurité ;
|
| 17 |
+
- respect de la vie privée ;
|
| 18 |
+
- supervision humaine ;
|
| 19 |
+
- inclusion.
|
| 20 |
+
|
| 21 |
+
[BIAIS]
|
| 22 |
+
Les biais algorithmiques apparaissent lorsqu’un modèle reproduit ou amplifie des inégalités présentes dans les données. Un système de recrutement entraîné sur des données historiques biaisées peut par exemple défavoriser certains candidats.
|
| 23 |
+
|
| 24 |
+
[TRANSPARENCE]
|
| 25 |
+
Les utilisateurs doivent être informés lorsqu’ils interagissent avec une IA. Dans les domaines sensibles, ils doivent aussi comprendre les critères utilisés par le système.
|
| 26 |
+
|
| 27 |
+
[EXPLICABILITE]
|
| 28 |
+
L’explicabilité consiste à rendre les décisions du modèle compréhensibles. Elle est importante dans la santé, la finance, le recrutement, la justice ou l’éducation.
|
| 29 |
+
|
| 30 |
+
[RISQUES]
|
| 31 |
+
Les principaux risques éthiques sont :
|
| 32 |
+
- discrimination ;
|
| 33 |
+
- surveillance excessive ;
|
| 34 |
+
- perte de contrôle humain ;
|
| 35 |
+
- atteinte à la vie privée ;
|
| 36 |
+
- décisions automatisées injustes ;
|
| 37 |
+
- diffusion de fausses informations.
|
| 38 |
+
|
| 39 |
+
[MESURES]
|
| 40 |
+
Pour réduire ces risques, il faut :
|
| 41 |
+
- auditer les données ;
|
| 42 |
+
- tester les biais ;
|
| 43 |
+
- documenter les modèles ;
|
| 44 |
+
- mettre en place une supervision humaine ;
|
| 45 |
+
- prévoir des mécanismes de contestation ;
|
| 46 |
+
- former les équipes.
|
| 47 |
+
|
| 48 |
+
[CONCLUSION]
|
| 49 |
+
L’éthique IA est indispensable pour construire des systèmes fiables, utiles et dignes de confiance.
|
corpus/gan.txt
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
GAN — Generative Adversarial Networks
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Les GAN, ou réseaux antagonistes génératifs, sont des modèles d’intelligence artificielle générative introduits par Ian Goodfellow en 2014. Ils permettent de générer de nouvelles données ressemblant à des données réelles.
|
| 6 |
+
|
| 7 |
+
[FONCTIONNEMENT]
|
| 8 |
+
Un GAN fonctionne avec deux réseaux de neurones :
|
| 9 |
+
- le générateur ;
|
| 10 |
+
- le discriminateur.
|
| 11 |
+
|
| 12 |
+
Le générateur crée de fausses données. Le discriminateur essaie de distinguer les vraies données des données générées. Les deux réseaux s’améliorent en compétition.
|
| 13 |
+
|
| 14 |
+
[APPLICATIONS]
|
| 15 |
+
Les GAN sont utilisés pour :
|
| 16 |
+
- générer des visages artificiels ;
|
| 17 |
+
- créer des images réalistes ;
|
| 18 |
+
- améliorer la résolution d’images ;
|
| 19 |
+
- coloriser des images anciennes ;
|
| 20 |
+
- générer des données synthétiques ;
|
| 21 |
+
- produire des images médicales artificielles.
|
| 22 |
+
|
| 23 |
+
[EXEMPLES]
|
| 24 |
+
Un GAN peut créer un visage humain qui n’existe pas réellement. Il peut aussi transformer une image basse résolution en image plus nette.
|
| 25 |
+
|
| 26 |
+
[AVANTAGES]
|
| 27 |
+
Les GAN peuvent produire des résultats très réalistes. Ils sont utiles lorsque les données réelles sont rares ou difficiles à obtenir.
|
| 28 |
+
|
| 29 |
+
[RISQUES]
|
| 30 |
+
Les principaux risques sont :
|
| 31 |
+
- création de deepfakes ;
|
| 32 |
+
- usurpation d’identité ;
|
| 33 |
+
- désinformation ;
|
| 34 |
+
- génération d’images trompeuses ;
|
| 35 |
+
- exploitation malveillante des contenus synthétiques.
|
| 36 |
+
|
| 37 |
+
[LIMITES]
|
| 38 |
+
L’entraînement des GAN est instable. Il peut être difficile d’équilibrer le générateur et le discriminateur. Les GAN peuvent aussi produire des images incohérentes ou manquer de diversité.
|
| 39 |
+
|
| 40 |
+
[ETHIQUE]
|
| 41 |
+
L’utilisation des GAN doit être transparente. Les contenus générés artificiellement devraient être signalés pour éviter la manipulation des utilisateurs.
|
| 42 |
+
|
| 43 |
+
[CONCLUSION]
|
| 44 |
+
Les GAN sont une technologie importante de l’IA générative, mais leur puissance impose un encadrement éthique fort.
|
corpus/ia_act.txt
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
AI Act européen
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Le AI Act est le règlement européen destiné à encadrer les systèmes d’intelligence artificielle. Il vise à protéger les citoyens tout en permettant l’innovation.
|
| 6 |
+
|
| 7 |
+
[OBJECTIF]
|
| 8 |
+
L’objectif du AI Act est de garantir que les systèmes IA utilisés en Europe soient sûrs, transparents, contrôlables et respectueux des droits fondamentaux.
|
| 9 |
+
|
| 10 |
+
[NIVEAUX DE RISQUE]
|
| 11 |
+
Le AI Act classe les systèmes IA selon quatre niveaux :
|
| 12 |
+
- risque minimal ;
|
| 13 |
+
- risque limité ;
|
| 14 |
+
- haut risque ;
|
| 15 |
+
- risque inacceptable.
|
| 16 |
+
|
| 17 |
+
[RISQUE MINIMAL]
|
| 18 |
+
Les systèmes à risque minimal, comme les filtres anti-spam ou certaines recommandations simples, ont peu d’obligations spécifiques.
|
| 19 |
+
|
| 20 |
+
[RISQUE LIMITE]
|
| 21 |
+
Les systèmes à risque limité, comme les chatbots, doivent respecter des obligations de transparence. L’utilisateur doit savoir qu’il interagit avec une IA.
|
| 22 |
+
|
| 23 |
+
[HAUT RISQUE]
|
| 24 |
+
Les systèmes à haut risque concernent des domaines sensibles comme :
|
| 25 |
+
- santé ;
|
| 26 |
+
- recrutement ;
|
| 27 |
+
- finance ;
|
| 28 |
+
- éducation ;
|
| 29 |
+
- justice ;
|
| 30 |
+
- sécurité ;
|
| 31 |
+
- infrastructures critiques.
|
| 32 |
+
|
| 33 |
+
[OBLIGATIONS]
|
| 34 |
+
Les systèmes à haut risque doivent prévoir :
|
| 35 |
+
- documentation technique ;
|
| 36 |
+
- gestion des risques ;
|
| 37 |
+
- qualité des données ;
|
| 38 |
+
- supervision humaine ;
|
| 39 |
+
- traçabilité ;
|
| 40 |
+
- tests de robustesse ;
|
| 41 |
+
- contrôle des biais.
|
| 42 |
+
|
| 43 |
+
[RISQUE INACCEPTABLE]
|
| 44 |
+
Certains usages sont interdits, comme la notation sociale, la manipulation comportementale ou certaines formes de surveillance biométrique abusive.
|
| 45 |
+
|
| 46 |
+
[IA GENERATIVE]
|
| 47 |
+
Les modèles d’IA générative doivent respecter des exigences de transparence, notamment sur les contenus générés, les données d’entraînement et le respect du droit d’auteur.
|
| 48 |
+
|
| 49 |
+
[CONCLUSION]
|
| 50 |
+
Le AI Act cherche à construire une IA fiable, responsable et compatible avec les valeurs européennes.
|
corpus/ia_art.txt
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
IA et art
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
L’intelligence artificielle dans l’art désigne l’utilisation de modèles génératifs pour créer ou assister la création d’images, de musiques, de textes, de vidéos ou d’œuvres numériques.
|
| 6 |
+
|
| 7 |
+
[APPLICATIONS]
|
| 8 |
+
L’IA est utilisée pour :
|
| 9 |
+
- générer des images artistiques ;
|
| 10 |
+
- composer de la musique ;
|
| 11 |
+
- créer des vidéos ;
|
| 12 |
+
- produire des illustrations ;
|
| 13 |
+
- assister le design graphique ;
|
| 14 |
+
- générer des textes créatifs.
|
| 15 |
+
|
| 16 |
+
[EXEMPLES]
|
| 17 |
+
Des outils comme Midjourney, DALL-E ou Stable Diffusion peuvent produire une image à partir d’une description textuelle. Des modèles audio peuvent composer une mélodie ou générer une voix synthétique.
|
| 18 |
+
|
| 19 |
+
[IMPORTANCE]
|
| 20 |
+
L’IA permet aux artistes d’explorer rapidement plusieurs idées, styles et variations. Elle peut accélérer le processus créatif et ouvrir de nouvelles formes d’expression.
|
| 21 |
+
|
| 22 |
+
[AVANTAGES]
|
| 23 |
+
Les avantages sont :
|
| 24 |
+
- créativité augmentée ;
|
| 25 |
+
- production rapide ;
|
| 26 |
+
- exploration de styles variés ;
|
| 27 |
+
- accessibilité à des outils créatifs avancés ;
|
| 28 |
+
- aide à l’inspiration.
|
| 29 |
+
|
| 30 |
+
[RISQUES]
|
| 31 |
+
Les principaux risques sont :
|
| 32 |
+
- violation du droit d’auteur ;
|
| 33 |
+
- imitation du style d’artistes sans autorisation ;
|
| 34 |
+
- perte de valeur du travail humain ;
|
| 35 |
+
- production massive de contenus artificiels ;
|
| 36 |
+
- confusion entre création humaine et création IA.
|
| 37 |
+
|
| 38 |
+
[LIMITES]
|
| 39 |
+
L’IA ne possède pas d’intention artistique propre. Elle génère à partir de données apprises et peut produire des œuvres sans profondeur émotionnelle ou sans contexte culturel réel.
|
| 40 |
+
|
| 41 |
+
[ETHIQUE]
|
| 42 |
+
Il est important de signaler les œuvres générées par IA, de respecter les droits des artistes et de clarifier la propriété intellectuelle des créations.
|
| 43 |
+
|
| 44 |
+
[CONCLUSION]
|
| 45 |
+
L’IA transforme fortement l’art, mais son usage doit préserver la place de la créativité humaine et le respect des créateurs.
|
corpus/ia_cybersecurite.txt
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
IA et cybersécurité
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
L’intelligence artificielle en cybersécurité désigne l’utilisation de modèles IA pour détecter, prévenir et analyser les menaces informatiques.
|
| 6 |
+
|
| 7 |
+
[APPLICATIONS]
|
| 8 |
+
L’IA est utilisée pour :
|
| 9 |
+
- détecter les intrusions ;
|
| 10 |
+
- analyser les comportements suspects ;
|
| 11 |
+
- identifier les logiciels malveillants ;
|
| 12 |
+
- détecter les fraudes ;
|
| 13 |
+
- surveiller les réseaux ;
|
| 14 |
+
- automatiser la réponse aux incidents.
|
| 15 |
+
|
| 16 |
+
[EXEMPLES]
|
| 17 |
+
Un système IA peut repérer une connexion inhabituelle, détecter une activité anormale sur un serveur ou identifier une tentative de phishing.
|
| 18 |
+
|
| 19 |
+
[IMPORTANCE]
|
| 20 |
+
Les cyberattaques produisent de grandes quantités de signaux. L’IA permet d’analyser rapidement ces données et d’aider les équipes sécurité à réagir plus vite.
|
| 21 |
+
|
| 22 |
+
[AVANTAGES]
|
| 23 |
+
Les avantages sont :
|
| 24 |
+
- détection rapide ;
|
| 25 |
+
- analyse en temps réel ;
|
| 26 |
+
- réduction du temps de réaction ;
|
| 27 |
+
- amélioration de la surveillance ;
|
| 28 |
+
- automatisation de tâches répétitives.
|
| 29 |
+
|
| 30 |
+
[RISQUES]
|
| 31 |
+
Les risques sont :
|
| 32 |
+
- faux positifs ;
|
| 33 |
+
- surveillance excessive ;
|
| 34 |
+
- collecte massive de données ;
|
| 35 |
+
- dépendance aux systèmes automatisés ;
|
| 36 |
+
- utilisation de l’IA par les cybercriminels.
|
| 37 |
+
|
| 38 |
+
[IA MALVEILLANTE]
|
| 39 |
+
Les attaquants peuvent utiliser l’IA pour générer des emails de phishing crédibles, automatiser des attaques ou créer des deepfakes.
|
| 40 |
+
|
| 41 |
+
[RGPD]
|
| 42 |
+
Les systèmes de cybersécurité doivent respecter le RGPD lorsqu’ils traitent des données personnelles, comme les logs de connexion ou les informations utilisateurs.
|
| 43 |
+
|
| 44 |
+
[CONCLUSION]
|
| 45 |
+
L’IA est un outil puissant pour renforcer la cybersécurité, mais elle doit être encadrée pour éviter la surveillance abusive et les usages malveillants.
|
corpus/ia_education.txt
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
IA et éducation
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
L’intelligence artificielle dans l’éducation désigne l’utilisation de systèmes IA pour personnaliser l’apprentissage, accompagner les élèves et aider les enseignants.
|
| 6 |
+
|
| 7 |
+
[APPLICATIONS]
|
| 8 |
+
L’IA est utilisée pour :
|
| 9 |
+
- adapter les exercices au niveau de l’élève ;
|
| 10 |
+
- générer des quiz ;
|
| 11 |
+
- corriger automatiquement certains travaux ;
|
| 12 |
+
- détecter les risques de décrochage ;
|
| 13 |
+
- proposer des recommandations pédagogiques ;
|
| 14 |
+
- assister les enseignants.
|
| 15 |
+
|
| 16 |
+
[EXEMPLES]
|
| 17 |
+
Une plateforme éducative peut analyser les erreurs d’un étudiant et lui proposer des exercices plus adaptés. Un chatbot peut répondre à des questions de cours.
|
| 18 |
+
|
| 19 |
+
[IMPORTANCE]
|
| 20 |
+
L’IA peut rendre l’apprentissage plus personnalisé et aider les enseignants à mieux suivre les difficultés des élèves.
|
| 21 |
+
|
| 22 |
+
[AVANTAGES]
|
| 23 |
+
Les avantages sont :
|
| 24 |
+
- personnalisation des parcours ;
|
| 25 |
+
- feedback rapide ;
|
| 26 |
+
- meilleure identification des difficultés ;
|
| 27 |
+
- gain de temps pour les enseignants ;
|
| 28 |
+
- accès à une aide pédagogique continue.
|
| 29 |
+
|
| 30 |
+
[RISQUES]
|
| 31 |
+
Les principaux risques sont :
|
| 32 |
+
- profilage excessif des élèves ;
|
| 33 |
+
- atteinte à la vie privée ;
|
| 34 |
+
- biais socio-économiques ;
|
| 35 |
+
- orientation injuste ;
|
| 36 |
+
- dépendance aux outils numériques ;
|
| 37 |
+
- réduction du rôle humain de l’enseignant.
|
| 38 |
+
|
| 39 |
+
[MINEURS]
|
| 40 |
+
Les élèves sont souvent mineurs. Les données scolaires et comportementales doivent donc être protégées avec une attention particulière.
|
| 41 |
+
|
| 42 |
+
[SUPERVISION HUMAINE]
|
| 43 |
+
L’IA ne doit pas décider seule de l’avenir scolaire d’un élève. Les enseignants doivent garder la responsabilité des décisions pédagogiques.
|
| 44 |
+
|
| 45 |
+
[CONCLUSION]
|
| 46 |
+
L’IA peut améliorer l’éducation, mais elle doit être utilisée avec prudence pour éviter les discriminations et protéger les élèves.
|
corpus/ia_finance.txt
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
IA et finance
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
L’intelligence artificielle en finance désigne l’utilisation de modèles IA pour analyser des données financières, automatiser des décisions et améliorer la gestion des risques.
|
| 6 |
+
|
| 7 |
+
[APPLICATIONS]
|
| 8 |
+
L’IA est utilisée pour :
|
| 9 |
+
- détecter les fraudes bancaires ;
|
| 10 |
+
- évaluer le risque de crédit ;
|
| 11 |
+
- analyser les marchés financiers ;
|
| 12 |
+
- automatiser le support client ;
|
| 13 |
+
- prédire des comportements financiers ;
|
| 14 |
+
- détecter des transactions suspectes.
|
| 15 |
+
|
| 16 |
+
[EXEMPLES]
|
| 17 |
+
Une banque peut utiliser l’IA pour repérer une transaction inhabituelle. Un système de scoring peut estimer la probabilité qu’un client rembourse un prêt.
|
| 18 |
+
|
| 19 |
+
[IMPORTANCE]
|
| 20 |
+
La finance produit de nombreuses données. L’IA permet d’analyser rapidement ces informations et d’améliorer la prise de décision.
|
| 21 |
+
|
| 22 |
+
[AVANTAGES]
|
| 23 |
+
Les avantages sont :
|
| 24 |
+
- détection rapide des fraudes ;
|
| 25 |
+
- meilleure analyse du risque ;
|
| 26 |
+
- automatisation des tâches ;
|
| 27 |
+
- amélioration du service client ;
|
| 28 |
+
- réduction des pertes financières.
|
| 29 |
+
|
| 30 |
+
[RISQUES]
|
| 31 |
+
Les principaux risques sont :
|
| 32 |
+
- discrimination dans l’accès au crédit ;
|
| 33 |
+
- manque de transparence ;
|
| 34 |
+
- décisions automatisées injustes ;
|
| 35 |
+
- utilisation de données sensibles ;
|
| 36 |
+
- dépendance aux algorithmes ;
|
| 37 |
+
- erreurs dans les prédictions financières.
|
| 38 |
+
|
| 39 |
+
[REGLEMENTATION]
|
| 40 |
+
Les décisions financières automatisées doivent être explicables. Un client doit pouvoir comprendre pourquoi un prêt est refusé ou pourquoi une transaction est bloquée.
|
| 41 |
+
|
| 42 |
+
[CYBERSECURITE]
|
| 43 |
+
Les données financières sont très sensibles. Elles doivent être protégées contre les cyberattaques, les fuites et les accès non autorisés.
|
| 44 |
+
|
| 45 |
+
[CONCLUSION]
|
| 46 |
+
L’IA améliore la finance, mais elle doit être encadrée pour garantir l’équité, la transparence et la sécurité des données.
|
corpus/ia_medecine.txt
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
IA en médecine
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
L’intelligence artificielle en médecine désigne l’utilisation de modèles IA pour assister les professionnels de santé dans le diagnostic, l’analyse de données médicales et la gestion hospitalière.
|
| 6 |
+
|
| 7 |
+
[APPLICATIONS]
|
| 8 |
+
Les systèmes IA sont utilisés pour :
|
| 9 |
+
- l’analyse de scanners et IRM ;
|
| 10 |
+
- la détection de tumeurs ;
|
| 11 |
+
- la prédiction de maladies ;
|
| 12 |
+
- l’aide au diagnostic ;
|
| 13 |
+
- la gestion hospitalière.
|
| 14 |
+
|
| 15 |
+
[EXEMPLES]
|
| 16 |
+
Des modèles de deep learning peuvent détecter :
|
| 17 |
+
- des cancers ;
|
| 18 |
+
- des fractures ;
|
| 19 |
+
- des maladies pulmonaires.
|
| 20 |
+
|
| 21 |
+
[IMPORTANCE]
|
| 22 |
+
L’IA permet :
|
| 23 |
+
- d’améliorer la rapidité des diagnostics ;
|
| 24 |
+
- de réduire certaines erreurs médicales ;
|
| 25 |
+
- d’optimiser les ressources hospitalières.
|
| 26 |
+
|
| 27 |
+
[RISQUES]
|
| 28 |
+
Les principaux risques sont :
|
| 29 |
+
- les biais algorithmiques ;
|
| 30 |
+
- les erreurs de diagnostic ;
|
| 31 |
+
- les discriminations médicales ;
|
| 32 |
+
- les problèmes de confidentialité des données ;
|
| 33 |
+
- la dépendance excessive à l’IA.
|
| 34 |
+
|
| 35 |
+
[RGPD]
|
| 36 |
+
Les données médicales sont considérées comme sensibles par le RGPD. Les systèmes IA doivent garantir :
|
| 37 |
+
- la sécurité ;
|
| 38 |
+
- la confidentialité ;
|
| 39 |
+
- la traçabilité des données patients.
|
| 40 |
+
|
| 41 |
+
[SUPERVISION HUMAINE]
|
| 42 |
+
L’IA ne doit pas remplacer les médecins. La supervision humaine reste essentielle pour garantir la sécurité des patients.
|
| 43 |
+
|
| 44 |
+
[CONCLUSION]
|
| 45 |
+
L’IA en médecine représente une avancée importante mais nécessite un encadrement éthique et réglementaire strict.
|
corpus/ia_rh.txt
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
IA et ressources humaines
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
L’intelligence artificielle dans les ressources humaines désigne l’utilisation de systèmes IA pour assister le recrutement, la gestion des talents, la formation et l’analyse des performances.
|
| 6 |
+
|
| 7 |
+
[APPLICATIONS]
|
| 8 |
+
L’IA est utilisée pour :
|
| 9 |
+
- trier automatiquement des CV ;
|
| 10 |
+
- classer des candidatures ;
|
| 11 |
+
- répondre aux candidats via chatbot ;
|
| 12 |
+
- analyser les compétences ;
|
| 13 |
+
- prédire les risques de départ ;
|
| 14 |
+
- recommander des formations.
|
| 15 |
+
|
| 16 |
+
[EXEMPLES]
|
| 17 |
+
Un outil de recrutement peut analyser des CV et proposer une liste de candidats correspondant à une offre d’emploi.
|
| 18 |
+
|
| 19 |
+
[IMPORTANCE]
|
| 20 |
+
L’IA peut faire gagner du temps aux équipes RH et améliorer la gestion des candidatures lorsque les volumes sont importants.
|
| 21 |
+
|
| 22 |
+
[AVANTAGES]
|
| 23 |
+
Les avantages sont :
|
| 24 |
+
- automatisation du tri ;
|
| 25 |
+
- traitement rapide des candidatures ;
|
| 26 |
+
- aide à la décision ;
|
| 27 |
+
- amélioration du suivi des employés ;
|
| 28 |
+
- personnalisation des parcours de formation.
|
| 29 |
+
|
| 30 |
+
[RISQUES]
|
| 31 |
+
Les principaux risques sont :
|
| 32 |
+
- discrimination ;
|
| 33 |
+
- reproduction de biais historiques ;
|
| 34 |
+
- manque de transparence ;
|
| 35 |
+
- exclusion injuste de candidats ;
|
| 36 |
+
- surveillance excessive des employés ;
|
| 37 |
+
- décisions automatisées sans contrôle humain.
|
| 38 |
+
|
| 39 |
+
[BIAIS]
|
| 40 |
+
Un modèle entraîné sur des recrutements passés peut reproduire des inégalités. Si une entreprise a historiquement recruté plus d’hommes, le modèle peut favoriser les candidatures masculines.
|
| 41 |
+
|
| 42 |
+
[AI ACT]
|
| 43 |
+
Les systèmes IA de recrutement sont considérés comme des systèmes à haut risque. Ils doivent respecter des obligations strictes de transparence, documentation, supervision humaine et contrôle des biais.
|
| 44 |
+
|
| 45 |
+
[SUPERVISION HUMAINE]
|
| 46 |
+
L’IA doit assister les recruteurs mais ne doit pas décider seule du recrutement ou du rejet d’un candidat.
|
| 47 |
+
|
| 48 |
+
[CONCLUSION]
|
| 49 |
+
L’IA peut améliorer les ressources humaines, mais elle doit être contrôlée pour garantir l’équité et protéger les candidats.
|
corpus/llm.txt
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
Large Language Models
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Les Large Language Models, ou LLM, sont des modèles d’intelligence artificielle capables de comprendre, produire, résumer, traduire et analyser du texte.
|
| 6 |
+
|
| 7 |
+
[FONCTIONNEMENT]
|
| 8 |
+
Les LLM sont généralement basés sur l’architecture Transformer. Ils sont entraînés sur de grands volumes de textes et apprennent à prédire le mot suivant dans une phrase.
|
| 9 |
+
|
| 10 |
+
[APPLICATIONS]
|
| 11 |
+
Les LLM sont utilisés pour :
|
| 12 |
+
- créer des chatbots ;
|
| 13 |
+
- résumer des documents ;
|
| 14 |
+
- générer du texte ;
|
| 15 |
+
- traduire automatiquement ;
|
| 16 |
+
- écrire du code ;
|
| 17 |
+
- répondre à des questions ;
|
| 18 |
+
- assister la recherche documentaire.
|
| 19 |
+
|
| 20 |
+
[EXEMPLES]
|
| 21 |
+
GPT, Claude, Gemini, Llama et Mistral sont des exemples de LLM modernes. Ils peuvent servir d’assistants conversationnels ou d’outils d’aide à la rédaction.
|
| 22 |
+
|
| 23 |
+
[IMPORTANCE]
|
| 24 |
+
Les LLM ont transformé l’accès à l’information et l’automatisation des tâches textuelles. Ils permettent de créer des assistants capables d’interagir en langage naturel.
|
| 25 |
+
|
| 26 |
+
[AVANTAGES]
|
| 27 |
+
Les avantages sont :
|
| 28 |
+
- compréhension du langage naturel ;
|
| 29 |
+
- génération rapide de texte ;
|
| 30 |
+
- polyvalence ;
|
| 31 |
+
- aide à la productivité ;
|
| 32 |
+
- capacité à traiter de nombreux domaines.
|
| 33 |
+
|
| 34 |
+
[RISQUES]
|
| 35 |
+
Les principaux risques sont :
|
| 36 |
+
- hallucinations ;
|
| 37 |
+
- réponses fausses mais convaincantes ;
|
| 38 |
+
- biais ;
|
| 39 |
+
- désinformation ;
|
| 40 |
+
- fuite de données sensibles ;
|
| 41 |
+
- dépendance excessive à l’IA.
|
| 42 |
+
|
| 43 |
+
[LIMITES]
|
| 44 |
+
Un LLM ne comprend pas le monde comme un humain. Il prédit du texte à partir de probabilités. Il peut inventer des informations lorsqu’il ne dispose pas de contexte fiable.
|
| 45 |
+
|
| 46 |
+
[RAG]
|
| 47 |
+
Le RAG permet de réduire certaines limites des LLM en leur fournissant des documents pertinents avant la génération de la réponse.
|
| 48 |
+
|
| 49 |
+
[CONCLUSION]
|
| 50 |
+
Les LLM sont au cœur de l’IA générative moderne, mais ils doivent être utilisés avec vérification, prudence et transparence.
|
corpus/rag.txt
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
Retrieval Augmented Generation
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Le RAG, ou Retrieval Augmented Generation, est une méthode qui combine recherche documentaire et génération de texte par un modèle de langage.
|
| 6 |
+
|
| 7 |
+
[OBJECTIF]
|
| 8 |
+
L’objectif du RAG est d’améliorer la fiabilité des réponses d’un chatbot en lui fournissant des documents pertinents au moment de répondre.
|
| 9 |
+
|
| 10 |
+
[FONCTIONNEMENT]
|
| 11 |
+
Un système RAG suit généralement trois étapes :
|
| 12 |
+
- indexer les documents ;
|
| 13 |
+
- rechercher les passages les plus pertinents ;
|
| 14 |
+
- envoyer le contexte trouvé au modèle génératif.
|
| 15 |
+
|
| 16 |
+
[RECHERCHE]
|
| 17 |
+
La recherche peut être réalisée avec TF-IDF, similarité cosinus ou embeddings sémantiques. Le système compare la question de l’utilisateur avec les documents du corpus.
|
| 18 |
+
|
| 19 |
+
[GENERATION]
|
| 20 |
+
Après la recherche, le modèle reçoit un prompt contenant le contexte et la question. Il génère ensuite une réponse basée sur les informations récupérées.
|
| 21 |
+
|
| 22 |
+
[APPLICATIONS]
|
| 23 |
+
Le RAG est utilisé pour :
|
| 24 |
+
- assistants de cours ;
|
| 25 |
+
- support client ;
|
| 26 |
+
- recherche documentaire ;
|
| 27 |
+
- chatbots d’entreprise ;
|
| 28 |
+
- assistants juridiques ;
|
| 29 |
+
- assistants médicaux ;
|
| 30 |
+
- documentation technique.
|
| 31 |
+
|
| 32 |
+
[AVANTAGES]
|
| 33 |
+
Les avantages sont :
|
| 34 |
+
- réduction des hallucinations ;
|
| 35 |
+
- réponses plus précises ;
|
| 36 |
+
- possibilité de citer les sources ;
|
| 37 |
+
- mise à jour facile du corpus ;
|
| 38 |
+
- meilleure transparence.
|
| 39 |
+
|
| 40 |
+
[RISQUES]
|
| 41 |
+
Les risques sont :
|
| 42 |
+
- mauvais documents récupérés ;
|
| 43 |
+
- contexte incomplet ;
|
| 44 |
+
- corpus de mauvaise qualité ;
|
| 45 |
+
- réponse générée hors contexte ;
|
| 46 |
+
- dépendance à la qualité du retrieval.
|
| 47 |
+
|
| 48 |
+
[CORPUS]
|
| 49 |
+
La qualité du corpus est centrale. Un bon corpus doit être clair, structuré, précis et adapté aux questions attendues.
|
| 50 |
+
|
| 51 |
+
[CONCLUSION]
|
| 52 |
+
Le RAG rend les chatbots plus fiables, mais sa qualité dépend fortement du corpus, du découpage des documents et de la méthode de recherche.
|
corpus/rgpd_ia.txt
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
RGPD et intelligence artificielle
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Le RGPD, ou Règlement Général sur la Protection des Données, encadre le traitement des données personnelles dans l’Union européenne. Il s’applique aux projets d’intelligence artificielle lorsqu’ils utilisent des données liées à des individus.
|
| 6 |
+
|
| 7 |
+
[OBJECTIF]
|
| 8 |
+
L’objectif du RGPD est de protéger la vie privée, les droits et les libertés des personnes dont les données sont collectées ou utilisées.
|
| 9 |
+
|
| 10 |
+
[PRINCIPES]
|
| 11 |
+
Les principes clés du RGPD sont :
|
| 12 |
+
- licéité ;
|
| 13 |
+
- transparence ;
|
| 14 |
+
- minimisation des données ;
|
| 15 |
+
- limitation des finalités ;
|
| 16 |
+
- exactitude ;
|
| 17 |
+
- sécurité ;
|
| 18 |
+
- limitation de conservation.
|
| 19 |
+
|
| 20 |
+
[APPLICATIONS IA]
|
| 21 |
+
Dans un projet IA, le RGPD s’applique lorsque les données utilisées concernent des utilisateurs, patients, clients, candidats, employés ou élèves.
|
| 22 |
+
|
| 23 |
+
[DONNEES SENSIBLES]
|
| 24 |
+
Les données de santé, données biométriques, données financières ou informations liées à l’origine, aux opinions ou à la vie privée sont particulièrement protégées.
|
| 25 |
+
|
| 26 |
+
[RISQUES]
|
| 27 |
+
Les risques sont :
|
| 28 |
+
- collecte excessive ;
|
| 29 |
+
- absence de consentement ;
|
| 30 |
+
- usage non prévu des données ;
|
| 31 |
+
- fuite de données ;
|
| 32 |
+
- réidentification ;
|
| 33 |
+
- décisions automatisées non expliquées.
|
| 34 |
+
|
| 35 |
+
[DROITS DES PERSONNES]
|
| 36 |
+
Les utilisateurs disposent de plusieurs droits :
|
| 37 |
+
- accès aux données ;
|
| 38 |
+
- rectification ;
|
| 39 |
+
- effacement ;
|
| 40 |
+
- opposition ;
|
| 41 |
+
- portabilité ;
|
| 42 |
+
- contestation de certaines décisions automatisées.
|
| 43 |
+
|
| 44 |
+
[PRIVACY BY DESIGN]
|
| 45 |
+
La protection des données doit être intégrée dès la conception du système IA. Il faut limiter les données collectées et sécuriser les traitements.
|
| 46 |
+
|
| 47 |
+
[SUPERVISION HUMAINE]
|
| 48 |
+
Lorsqu’une IA influence une décision importante, une intervention humaine doit être prévue pour éviter une décision automatique injuste.
|
| 49 |
+
|
| 50 |
+
[CONCLUSION]
|
| 51 |
+
Le RGPD impose aux systèmes IA de respecter la vie privée, la sécurité, la transparence et les droits des personnes.
|
corpus/transformers.txt
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
Architecture Transformer
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Les Transformers sont une architecture de réseau de neurones introduite en 2017 dans l’article “Attention Is All You Need”. Ils sont aujourd’hui au cœur des modèles modernes de langage comme GPT, BERT, T5 ou Llama.
|
| 6 |
+
|
| 7 |
+
[OBJECTIF]
|
| 8 |
+
Les Transformers servent à traiter des séquences de données, notamment du texte, en comprenant les relations entre les mots et leur contexte.
|
| 9 |
+
|
| 10 |
+
[FONCTIONNEMENT]
|
| 11 |
+
Le principe central des Transformers est le mécanisme d’attention. Ce mécanisme permet au modèle d’identifier quels mots sont importants les uns par rapport aux autres.
|
| 12 |
+
|
| 13 |
+
[SELF-ATTENTION]
|
| 14 |
+
La self-attention permet à chaque mot d’une phrase de tenir compte des autres mots. Cela aide le modèle à comprendre les dépendances longues et le sens global d’une phrase.
|
| 15 |
+
|
| 16 |
+
[ENCODEUR]
|
| 17 |
+
L’encodeur analyse le texte d’entrée et produit une représentation du contexte. Il est utilisé dans des modèles comme BERT.
|
| 18 |
+
|
| 19 |
+
[DECODEUR]
|
| 20 |
+
Le décodeur génère du texte à partir d’un contexte. Il est utilisé dans des modèles comme GPT.
|
| 21 |
+
|
| 22 |
+
[APPLICATIONS]
|
| 23 |
+
Les Transformers sont utilisés pour :
|
| 24 |
+
- traduction automatique ;
|
| 25 |
+
- résumé de texte ;
|
| 26 |
+
- génération de texte ;
|
| 27 |
+
- classification ;
|
| 28 |
+
- question-réponse ;
|
| 29 |
+
- chatbots ;
|
| 30 |
+
- génération de code.
|
| 31 |
+
|
| 32 |
+
[AVANTAGES]
|
| 33 |
+
Les avantages sont :
|
| 34 |
+
- traitement parallèle ;
|
| 35 |
+
- meilleure gestion du contexte ;
|
| 36 |
+
- très bonnes performances en langage naturel ;
|
| 37 |
+
- adaptation à de nombreuses tâches.
|
| 38 |
+
|
| 39 |
+
[LIMITES]
|
| 40 |
+
Les Transformers demandent beaucoup de données et de puissance de calcul. Ils peuvent aussi produire des réponses biaisées ou incorrectes s’ils sont mal entraînés.
|
| 41 |
+
|
| 42 |
+
[CONCLUSION]
|
| 43 |
+
Les Transformers sont l’une des architectures les plus importantes de l’IA moderne et constituent la base de nombreux systèmes génératifs.
|
corpus/vae.txt
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
[TITRE]
|
| 2 |
+
VAE — Variational Autoencoder
|
| 3 |
+
|
| 4 |
+
[DEFINITION]
|
| 5 |
+
Les VAE, ou Variational Autoencoders, sont des modèles génératifs qui apprennent à représenter des données dans un espace latent probabiliste.
|
| 6 |
+
|
| 7 |
+
[FONCTIONNEMENT]
|
| 8 |
+
Un VAE est composé de deux parties :
|
| 9 |
+
- un encodeur ;
|
| 10 |
+
- un décodeur.
|
| 11 |
+
|
| 12 |
+
L’encodeur compresse les données dans un espace latent. Le décodeur reconstruit les données à partir de cet espace.
|
| 13 |
+
|
| 14 |
+
[ESPACE LATENT]
|
| 15 |
+
L’espace latent est une représentation compacte des données. Dans un VAE, cette représentation est probabiliste, ce qui permet de générer de nouvelles données.
|
| 16 |
+
|
| 17 |
+
[APPLICATIONS]
|
| 18 |
+
Les VAE sont utilisés pour :
|
| 19 |
+
- générer des images ;
|
| 20 |
+
- réduire la dimension des données ;
|
| 21 |
+
- détecter des anomalies ;
|
| 22 |
+
- créer des données synthétiques ;
|
| 23 |
+
- apprendre des représentations utiles.
|
| 24 |
+
|
| 25 |
+
[EXEMPLES]
|
| 26 |
+
Un VAE peut apprendre la structure d’images de chiffres manuscrits puis générer de nouveaux chiffres ressemblant aux originaux.
|
| 27 |
+
|
| 28 |
+
[AVANTAGES]
|
| 29 |
+
Les avantages sont :
|
| 30 |
+
- entraînement plus stable que les GAN ;
|
| 31 |
+
- cadre mathématique solide ;
|
| 32 |
+
- capacité à apprendre une représentation organisée ;
|
| 33 |
+
- génération de données nouvelles.
|
| 34 |
+
|
| 35 |
+
[RISQUES]
|
| 36 |
+
Les risques concernent surtout l’utilisation de données synthétiques trompeuses ou la génération de données sensibles si le modèle apprend trop précisément les exemples d’entraînement.
|
| 37 |
+
|
| 38 |
+
[LIMITES]
|
| 39 |
+
Les images générées par les VAE sont souvent moins nettes que celles produites par les GAN ou les modèles de diffusion.
|
| 40 |
+
|
| 41 |
+
[MEDECINE]
|
| 42 |
+
En médecine, les VAE peuvent aider à détecter des anomalies ou générer des images synthétiques pour augmenter un jeu de données.
|
| 43 |
+
|
| 44 |
+
[CONCLUSION]
|
| 45 |
+
Les VAE sont des modèles génératifs importants, utiles pour la représentation des données, la génération et la détection d’anomalies.
|
rag.py
ADDED
|
@@ -0,0 +1,199 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
from dataclasses import dataclass
|
| 3 |
+
from typing import List
|
| 4 |
+
import re
|
| 5 |
+
import numpy as np
|
| 6 |
+
|
| 7 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 8 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
@dataclass
|
| 12 |
+
class RetrievedChunk:
|
| 13 |
+
text: str
|
| 14 |
+
filename: str
|
| 15 |
+
score: float
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
class RAGEngine:
|
| 19 |
+
def __init__(
|
| 20 |
+
self,
|
| 21 |
+
corpus_dir: str = "corpus/",
|
| 22 |
+
chunk_size: int = 450,
|
| 23 |
+
chunk_overlap: int = 80,
|
| 24 |
+
min_score: float = 0.05
|
| 25 |
+
):
|
| 26 |
+
self.corpus_dir = Path(corpus_dir)
|
| 27 |
+
self.chunk_size = chunk_size
|
| 28 |
+
self.chunk_overlap = chunk_overlap
|
| 29 |
+
self.min_score = min_score
|
| 30 |
+
|
| 31 |
+
self.chunks: List[str] = []
|
| 32 |
+
self.chunk_sources: List[str] = []
|
| 33 |
+
|
| 34 |
+
self.vectorizer = TfidfVectorizer(
|
| 35 |
+
lowercase=True,
|
| 36 |
+
strip_accents="unicode",
|
| 37 |
+
ngram_range=(1, 2),
|
| 38 |
+
max_features=10000
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
self._load_and_chunk_corpus()
|
| 42 |
+
self._index()
|
| 43 |
+
|
| 44 |
+
def _clean_text(self, text: str) -> str:
|
| 45 |
+
text = re.sub(r"\s+", " ", text)
|
| 46 |
+
return text.strip()
|
| 47 |
+
|
| 48 |
+
def _split_into_chunks(self, text: str) -> List[str]:
|
| 49 |
+
text = self._clean_text(text)
|
| 50 |
+
|
| 51 |
+
if len(text) <= self.chunk_size:
|
| 52 |
+
return [text]
|
| 53 |
+
|
| 54 |
+
chunks = []
|
| 55 |
+
start = 0
|
| 56 |
+
|
| 57 |
+
while start < len(text):
|
| 58 |
+
end = start + self.chunk_size
|
| 59 |
+
chunk = text[start:end].strip()
|
| 60 |
+
|
| 61 |
+
if chunk:
|
| 62 |
+
chunks.append(chunk)
|
| 63 |
+
|
| 64 |
+
start += self.chunk_size - self.chunk_overlap
|
| 65 |
+
|
| 66 |
+
return chunks
|
| 67 |
+
|
| 68 |
+
def _load_and_chunk_corpus(self):
|
| 69 |
+
if not self.corpus_dir.exists():
|
| 70 |
+
raise FileNotFoundError(f"Dossier corpus introuvable : {self.corpus_dir}")
|
| 71 |
+
|
| 72 |
+
files = sorted(
|
| 73 |
+
list(self.corpus_dir.glob("*.txt")) +
|
| 74 |
+
list(self.corpus_dir.glob("*.md"))
|
| 75 |
+
)
|
| 76 |
+
|
| 77 |
+
if not files:
|
| 78 |
+
raise ValueError("Aucun fichier .txt ou .md trouvé dans le dossier corpus.")
|
| 79 |
+
|
| 80 |
+
for file_path in files:
|
| 81 |
+
try:
|
| 82 |
+
text = file_path.read_text(encoding="utf-8")
|
| 83 |
+
chunks = self._split_into_chunks(text)
|
| 84 |
+
|
| 85 |
+
for chunk in chunks:
|
| 86 |
+
self.chunks.append(chunk)
|
| 87 |
+
self.chunk_sources.append(file_path.name)
|
| 88 |
+
|
| 89 |
+
except Exception as e:
|
| 90 |
+
print(f"Fichier ignoré : {file_path.name} | Erreur : {e}")
|
| 91 |
+
|
| 92 |
+
if not self.chunks:
|
| 93 |
+
raise ValueError("Aucun passage exploitable trouvé dans le corpus.")
|
| 94 |
+
|
| 95 |
+
print(f"{len(files)} fichiers chargés.")
|
| 96 |
+
print(f"{len(self.chunks)} passages indexés.")
|
| 97 |
+
|
| 98 |
+
def _index(self):
|
| 99 |
+
self.tfidf_matrix = self.vectorizer.fit_transform(self.chunks)
|
| 100 |
+
|
| 101 |
+
def search(self, query: str, top_k: int = 2) -> List[RetrievedChunk]:
|
| 102 |
+
query = self._clean_text(query)
|
| 103 |
+
|
| 104 |
+
if not query:
|
| 105 |
+
return []
|
| 106 |
+
|
| 107 |
+
q_vec = self.vectorizer.transform([query])
|
| 108 |
+
scores = cosine_similarity(q_vec, self.tfidf_matrix)[0]
|
| 109 |
+
|
| 110 |
+
query_lower = query.lower()
|
| 111 |
+
|
| 112 |
+
for i in range(len(scores)):
|
| 113 |
+
filename = self.chunk_sources[i].lower()
|
| 114 |
+
|
| 115 |
+
if "médecine" in query_lower or "medecine" in query_lower or "santé" in query_lower:
|
| 116 |
+
if "ia_medecine" in filename:
|
| 117 |
+
scores[i] += 0.08
|
| 118 |
+
|
| 119 |
+
if "finance" in query_lower or "banque" in query_lower or "crédit" in query_lower or "credit" in query_lower:
|
| 120 |
+
if "ia_finance" in filename:
|
| 121 |
+
scores[i] += 0.08
|
| 122 |
+
|
| 123 |
+
if "recrutement" in query_lower or "rh" in query_lower:
|
| 124 |
+
if "ia_rh" in filename:
|
| 125 |
+
scores[i] += 0.08
|
| 126 |
+
|
| 127 |
+
if "éducation" in query_lower or "education" in query_lower or "école" in query_lower or "ecole" in query_lower or "élève" in query_lower or "eleve" in query_lower:
|
| 128 |
+
if "ia_education" in filename:
|
| 129 |
+
scores[i] += 0.08
|
| 130 |
+
|
| 131 |
+
if "cybersécurité" in query_lower or "cybersecurite" in query_lower or "cyber" in query_lower:
|
| 132 |
+
if "ia_cybersecurite" in filename:
|
| 133 |
+
scores[i] += 0.08
|
| 134 |
+
|
| 135 |
+
if "art" in query_lower or "image" in query_lower or "création" in query_lower or "creation" in query_lower:
|
| 136 |
+
if "ia_art" in filename:
|
| 137 |
+
scores[i] += 0.08
|
| 138 |
+
|
| 139 |
+
top_idx = np.argsort(scores)[::-1][:top_k]
|
| 140 |
+
|
| 141 |
+
results = []
|
| 142 |
+
|
| 143 |
+
for i in top_idx:
|
| 144 |
+
score = float(scores[i])
|
| 145 |
+
|
| 146 |
+
if score >= self.min_score:
|
| 147 |
+
results.append(
|
| 148 |
+
RetrievedChunk(
|
| 149 |
+
text=self.chunks[i],
|
| 150 |
+
filename=self.chunk_sources[i],
|
| 151 |
+
score=score
|
| 152 |
+
)
|
| 153 |
+
)
|
| 154 |
+
|
| 155 |
+
return results
|
| 156 |
+
|
| 157 |
+
def _clean_for_prompt(self, text: str) -> str:
|
| 158 |
+
text = re.sub(r"\[[A-ZÉÈÊÀÙÎÏÇ _-]+\]", "", text)
|
| 159 |
+
text = re.sub(r"\s+", " ", text)
|
| 160 |
+
return text.strip()
|
| 161 |
+
|
| 162 |
+
def build_prompt(self, query: str, top_k: int = 2) -> str:
|
| 163 |
+
results = self.search(query, top_k=top_k)
|
| 164 |
+
|
| 165 |
+
if not results:
|
| 166 |
+
return f"""
|
| 167 |
+
Réponds uniquement en français.
|
| 168 |
+
|
| 169 |
+
La réponse n'existe pas dans le contexte fourni.
|
| 170 |
+
|
| 171 |
+
Question :
|
| 172 |
+
{query}
|
| 173 |
+
|
| 174 |
+
Réponse :
|
| 175 |
+
Je ne dispose pas d'assez d'informations dans le corpus pour répondre correctement.
|
| 176 |
+
"""
|
| 177 |
+
|
| 178 |
+
context = "\n\n".join(
|
| 179 |
+
[
|
| 180 |
+
f"{self._clean_for_prompt(result.text)}"
|
| 181 |
+
for result in results
|
| 182 |
+
]
|
| 183 |
+
)
|
| 184 |
+
|
| 185 |
+
return f"""
|
| 186 |
+
Réponds uniquement en français.
|
| 187 |
+
Utilise uniquement le contexte.
|
| 188 |
+
Ne recopie pas le contexte.
|
| 189 |
+
Réponds en 4 à 6 phrases claires.
|
| 190 |
+
Si le contexte ne répond pas à la question, dis que l'information est insuffisante.
|
| 191 |
+
|
| 192 |
+
Contexte :
|
| 193 |
+
{context}
|
| 194 |
+
|
| 195 |
+
Question :
|
| 196 |
+
{query}
|
| 197 |
+
|
| 198 |
+
Réponse :
|
| 199 |
+
"""
|
rag_gpt2.py
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from pathlib import Path
|
| 2 |
+
from dataclasses import dataclass
|
| 3 |
+
from typing import List
|
| 4 |
+
import re
|
| 5 |
+
import numpy as np
|
| 6 |
+
|
| 7 |
+
from sklearn.feature_extraction.text import TfidfVectorizer
|
| 8 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
| 9 |
+
|
| 10 |
+
|
| 11 |
+
@dataclass
|
| 12 |
+
class RetrievedChunk:
|
| 13 |
+
text: str
|
| 14 |
+
filename: str
|
| 15 |
+
score: float
|
| 16 |
+
|
| 17 |
+
|
| 18 |
+
class RAGEngineGPT2:
|
| 19 |
+
def __init__(
|
| 20 |
+
self,
|
| 21 |
+
corpus_dir: str = "corpus/",
|
| 22 |
+
chunk_size: int = 450,
|
| 23 |
+
chunk_overlap: int = 80,
|
| 24 |
+
min_score: float = 0.05
|
| 25 |
+
):
|
| 26 |
+
self.corpus_dir = Path(corpus_dir)
|
| 27 |
+
self.chunk_size = chunk_size
|
| 28 |
+
self.chunk_overlap = chunk_overlap
|
| 29 |
+
self.min_score = min_score
|
| 30 |
+
|
| 31 |
+
self.chunks: List[str] = []
|
| 32 |
+
self.chunk_sources: List[str] = []
|
| 33 |
+
|
| 34 |
+
self.vectorizer = TfidfVectorizer(
|
| 35 |
+
lowercase=True,
|
| 36 |
+
strip_accents="unicode",
|
| 37 |
+
ngram_range=(1, 2),
|
| 38 |
+
max_features=10000
|
| 39 |
+
)
|
| 40 |
+
|
| 41 |
+
self._load_and_chunk_corpus()
|
| 42 |
+
self._index()
|
| 43 |
+
|
| 44 |
+
def _clean_text(self, text: str) -> str:
|
| 45 |
+
text = re.sub(r"\s+", " ", text)
|
| 46 |
+
return text.strip()
|
| 47 |
+
|
| 48 |
+
def _clean_for_prompt(self, text: str) -> str:
|
| 49 |
+
text = re.sub(r"\[[A-ZÉÈÊÀÙÎÏÇ _-]+\]", "", text)
|
| 50 |
+
text = re.sub(r"\s+", " ", text)
|
| 51 |
+
return text.strip()
|
| 52 |
+
|
| 53 |
+
def _split_into_chunks(self, text: str) -> List[str]:
|
| 54 |
+
text = self._clean_text(text)
|
| 55 |
+
|
| 56 |
+
if len(text) <= self.chunk_size:
|
| 57 |
+
return [text]
|
| 58 |
+
|
| 59 |
+
chunks = []
|
| 60 |
+
start = 0
|
| 61 |
+
|
| 62 |
+
while start < len(text):
|
| 63 |
+
end = start + self.chunk_size
|
| 64 |
+
chunk = text[start:end].strip()
|
| 65 |
+
|
| 66 |
+
if chunk:
|
| 67 |
+
chunks.append(chunk)
|
| 68 |
+
|
| 69 |
+
start += self.chunk_size - self.chunk_overlap
|
| 70 |
+
|
| 71 |
+
return chunks
|
| 72 |
+
|
| 73 |
+
def _load_and_chunk_corpus(self):
|
| 74 |
+
if not self.corpus_dir.exists():
|
| 75 |
+
raise FileNotFoundError(f"Dossier corpus introuvable : {self.corpus_dir}")
|
| 76 |
+
|
| 77 |
+
files = sorted(
|
| 78 |
+
list(self.corpus_dir.glob("*.txt")) +
|
| 79 |
+
list(self.corpus_dir.glob("*.md"))
|
| 80 |
+
)
|
| 81 |
+
|
| 82 |
+
if not files:
|
| 83 |
+
raise ValueError("Aucun fichier .txt ou .md trouvé dans le dossier corpus.")
|
| 84 |
+
|
| 85 |
+
for file_path in files:
|
| 86 |
+
try:
|
| 87 |
+
text = file_path.read_text(encoding="utf-8")
|
| 88 |
+
chunks = self._split_into_chunks(text)
|
| 89 |
+
|
| 90 |
+
for chunk in chunks:
|
| 91 |
+
self.chunks.append(chunk)
|
| 92 |
+
self.chunk_sources.append(file_path.name)
|
| 93 |
+
|
| 94 |
+
except Exception as e:
|
| 95 |
+
print(f"Fichier ignoré : {file_path.name} | Erreur : {e}")
|
| 96 |
+
|
| 97 |
+
if not self.chunks:
|
| 98 |
+
raise ValueError("Aucun passage exploitable trouvé dans le corpus.")
|
| 99 |
+
|
| 100 |
+
print(f"{len(files)} fichiers chargés.")
|
| 101 |
+
print(f"{len(self.chunks)} passages indexés.")
|
| 102 |
+
|
| 103 |
+
def _index(self):
|
| 104 |
+
self.tfidf_matrix = self.vectorizer.fit_transform(self.chunks)
|
| 105 |
+
|
| 106 |
+
def _apply_domain_boost(self, query: str, scores):
|
| 107 |
+
query_lower = query.lower()
|
| 108 |
+
|
| 109 |
+
for i in range(len(scores)):
|
| 110 |
+
filename = self.chunk_sources[i].lower()
|
| 111 |
+
|
| 112 |
+
if ("médecine" in query_lower or "medecine" in query_lower or "santé" in query_lower) and "ia_medecine" in filename:
|
| 113 |
+
scores[i] += 0.08
|
| 114 |
+
|
| 115 |
+
if ("finance" in query_lower or "banque" in query_lower or "crédit" in query_lower or "credit" in query_lower) and "ia_finance" in filename:
|
| 116 |
+
scores[i] += 0.08
|
| 117 |
+
|
| 118 |
+
if ("recrutement" in query_lower or "rh" in query_lower) and "ia_rh" in filename:
|
| 119 |
+
scores[i] += 0.08
|
| 120 |
+
|
| 121 |
+
if ("éducation" in query_lower or "education" in query_lower or "école" in query_lower or "ecole" in query_lower or "élève" in query_lower or "eleve" in query_lower) and "ia_education" in filename:
|
| 122 |
+
scores[i] += 0.08
|
| 123 |
+
|
| 124 |
+
if ("cybersécurité" in query_lower or "cybersecurite" in query_lower or "cyber" in query_lower) and "ia_cybersecurite" in filename:
|
| 125 |
+
scores[i] += 0.08
|
| 126 |
+
|
| 127 |
+
if ("art" in query_lower or "image" in query_lower or "création" in query_lower or "creation" in query_lower) and "ia_art" in filename:
|
| 128 |
+
scores[i] += 0.08
|
| 129 |
+
|
| 130 |
+
return scores
|
| 131 |
+
|
| 132 |
+
def search(self, query: str, top_k: int = 1) -> List[RetrievedChunk]:
|
| 133 |
+
query = self._clean_text(query)
|
| 134 |
+
|
| 135 |
+
if not query:
|
| 136 |
+
return []
|
| 137 |
+
|
| 138 |
+
q_vec = self.vectorizer.transform([query])
|
| 139 |
+
scores = cosine_similarity(q_vec, self.tfidf_matrix)[0]
|
| 140 |
+
scores = self._apply_domain_boost(query, scores)
|
| 141 |
+
|
| 142 |
+
top_idx = np.argsort(scores)[::-1][:top_k]
|
| 143 |
+
|
| 144 |
+
results = []
|
| 145 |
+
|
| 146 |
+
for i in top_idx:
|
| 147 |
+
score = float(scores[i])
|
| 148 |
+
|
| 149 |
+
if score >= self.min_score:
|
| 150 |
+
results.append(
|
| 151 |
+
RetrievedChunk(
|
| 152 |
+
text=self.chunks[i],
|
| 153 |
+
filename=self.chunk_sources[i],
|
| 154 |
+
score=score
|
| 155 |
+
)
|
| 156 |
+
)
|
| 157 |
+
|
| 158 |
+
return results
|
| 159 |
+
|
| 160 |
+
def build_prompt(self, query: str, top_k: int = 1) -> str:
|
| 161 |
+
results = self.search(query, top_k=top_k)
|
| 162 |
+
|
| 163 |
+
if not results:
|
| 164 |
+
return ""
|
| 165 |
+
|
| 166 |
+
context = "\n\n".join(
|
| 167 |
+
[self._clean_for_prompt(result.text) for result in results]
|
| 168 |
+
)
|
| 169 |
+
|
| 170 |
+
return f"""
|
| 171 |
+
Contexte :
|
| 172 |
+
{context}
|
| 173 |
+
|
| 174 |
+
Question :
|
| 175 |
+
{query}
|
| 176 |
+
|
| 177 |
+
Réponse en français :
|
| 178 |
+
"""
|
requirements.txt
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
gradio
|
| 2 |
+
transformers
|
| 3 |
+
scikit-learn
|
| 4 |
+
numpy
|
| 5 |
+
sentencepiece
|
| 6 |
+
torch
|