Upload 4 files
Browse files- .gitattributes +1 -0
- app.py +271 -0
- qa.json +74 -0
- requirements (1).txt +14 -0
- web_documents (1).xlsx +3 -0
.gitattributes
CHANGED
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
|
|
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
36 |
+
web_documents[[:space:]](1).xlsx filter=lfs diff=lfs merge=lfs -text
|
app.py
ADDED
@@ -0,0 +1,271 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import chromadb
|
2 |
+
import pandas as pd
|
3 |
+
from sentence_transformers import SentenceTransformer
|
4 |
+
from langchain.text_splitter import RecursiveCharacterTextSplitter
|
5 |
+
import json
|
6 |
+
import openai
|
7 |
+
from openai import OpenAI
|
8 |
+
import numpy as np
|
9 |
+
import requests
|
10 |
+
import chromadb
|
11 |
+
from chromadb import Client
|
12 |
+
from sentence_transformers import SentenceTransformer, util
|
13 |
+
from langchain_community.embeddings import HuggingFaceEmbeddings
|
14 |
+
from chromadb import Client
|
15 |
+
from chromadb import PersistentClient
|
16 |
+
import gradio as gr
|
17 |
+
from transformers import AutoModelForCausalLM, AutoTokenizer
|
18 |
+
import torch
|
19 |
+
import os
|
20 |
+
import requests
|
21 |
+
#HF_TOKEN = os.getenv("HF_TOKEN")
|
22 |
+
|
23 |
+
API_KEY = os.environ.get("OPENROUTER_API_KEY")
|
24 |
+
|
25 |
+
|
26 |
+
# Load the Excel file
|
27 |
+
df = pd.read_excel("web_documents.xlsx", engine='openpyxl')
|
28 |
+
|
29 |
+
# Initialize Chroma Persistent Client
|
30 |
+
client = chromadb.PersistentClient(path="./db")
|
31 |
+
|
32 |
+
# Create (or get) the Chroma collection
|
33 |
+
collection = client.get_or_create_collection(
|
34 |
+
name="rag_web_db_cosine_full_documents",
|
35 |
+
metadata={"hnsw:space": "cosine"}
|
36 |
+
)
|
37 |
+
|
38 |
+
# Load the embedding model
|
39 |
+
embedding_model = SentenceTransformer('sentence-transformers/paraphrase-MiniLM-L6-v2')
|
40 |
+
|
41 |
+
# Initialize the text splitter
|
42 |
+
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1200, chunk_overlap=150)
|
43 |
+
|
44 |
+
total_chunks = 0
|
45 |
+
|
46 |
+
# Process each row in the DataFrame
|
47 |
+
for idx, row in df.iterrows():
|
48 |
+
content = str(row['Content']) # Just in case it’s not a string
|
49 |
+
metadata_str = str(row['Metadata'])
|
50 |
+
|
51 |
+
# Convert metadata string back to a dictionary (optional: keep it simple if needed)
|
52 |
+
metadata = {"metadata": metadata_str}
|
53 |
+
|
54 |
+
# Split content into chunks
|
55 |
+
chunks = text_splitter.split_text(content)
|
56 |
+
total_chunks += len(chunks)
|
57 |
+
|
58 |
+
# Generate embeddings for each chunk
|
59 |
+
chunk_embeddings = embedding_model.encode(chunks)
|
60 |
+
|
61 |
+
# Add each chunk to the Chroma collection
|
62 |
+
for i, chunk in enumerate(chunks):
|
63 |
+
collection.add(
|
64 |
+
documents=[chunk],
|
65 |
+
metadatas=[metadata],
|
66 |
+
ids=[f"{idx}_chunk_{i}"],
|
67 |
+
embeddings=[chunk_embeddings[i]]
|
68 |
+
)
|
69 |
+
|
70 |
+
# ---------------------- Config ----------------------
|
71 |
+
SIMILARITY_THRESHOLD = 0.80
|
72 |
+
|
73 |
+
client1 = OpenAI(base_url="https://openrouter.ai/api/v1", api_key=API_KEY) # remplace par ta clé OpenRouter
|
74 |
+
|
75 |
+
|
76 |
+
# ---------------------- Models ----------------------
|
77 |
+
# High-accuracy model for semantic search
|
78 |
+
semantic_model = SentenceTransformer("sentence-transformers/all-mpnet-base-v2")
|
79 |
+
|
80 |
+
# For ChromaDB
|
81 |
+
#embedding_model = HuggingFaceEmbeddings(model_name="sentence-transformers/paraphrase-MiniLM-L6-v2")
|
82 |
+
|
83 |
+
# ---------------------- Load QA Data ----------------------
|
84 |
+
with open("qa.json", "r", encoding="utf-8") as f:
|
85 |
+
qa_data = json.load(f)
|
86 |
+
|
87 |
+
qa_questions = list(qa_data.keys())
|
88 |
+
qa_answers = list(qa_data.values())
|
89 |
+
qa_embeddings = semantic_model.encode(qa_questions, convert_to_tensor=True)
|
90 |
+
|
91 |
+
# ---------------------- CAG ----------------------
|
92 |
+
def retrieve_from_cag(user_query):
|
93 |
+
query_embedding = semantic_model.encode(user_query, convert_to_tensor=True)
|
94 |
+
cosine_scores = util.cos_sim(query_embedding, qa_embeddings)[0]
|
95 |
+
best_idx = int(np.argmax(cosine_scores))
|
96 |
+
best_score = float(cosine_scores[best_idx])
|
97 |
+
|
98 |
+
print(f"[CAG] Best score: {best_score:.4f} | Closest question: {qa_questions[best_idx]}")
|
99 |
+
if best_score >= SIMILARITY_THRESHOLD:
|
100 |
+
return qa_answers[best_idx], best_score
|
101 |
+
else:
|
102 |
+
return None, best_score
|
103 |
+
|
104 |
+
# ---------------------- RAG ----------------------
|
105 |
+
#client = chromadb.Client()
|
106 |
+
#collection = client.get_collection(name="rag_web_db_cosine_full_documents")
|
107 |
+
# Assuming you have a persistent Chroma client setup
|
108 |
+
#client = PersistentClient("./db_new/db_new")# Replace with the correct path if needed
|
109 |
+
#collection = client.get_collection(name="rag_web_db_cosine_full_documents")
|
110 |
+
# ---------------------- RAG retrieval ----------------------
|
111 |
+
def retrieve_from_rag(user_query):
|
112 |
+
print("Searching in RAG...")
|
113 |
+
|
114 |
+
query_embedding = embedding_model.encode(user_query)
|
115 |
+
results = collection.query(query_embeddings=[query_embedding], n_results=3)
|
116 |
+
|
117 |
+
if not results or not results.get('documents'):
|
118 |
+
return None
|
119 |
+
|
120 |
+
documents = []
|
121 |
+
for i, content in enumerate(results['documents'][0]):
|
122 |
+
metadata = results['metadatas'][0][i]
|
123 |
+
documents.append({
|
124 |
+
"content": content.strip(),
|
125 |
+
"metadata": metadata
|
126 |
+
})
|
127 |
+
print("Documents retrieved:", documents)
|
128 |
+
return documents
|
129 |
+
|
130 |
+
# ---------------------- Generation function (OpenRouter) ----------------------
|
131 |
+
def generate_via_openrouter(context, query):
|
132 |
+
print("\n--- Generating via OpenRouter ---")
|
133 |
+
print("Context received:", context)
|
134 |
+
|
135 |
+
prompt = f"""<s>[INST]
|
136 |
+
You are a Moodle expert assistant.
|
137 |
+
Instructions:
|
138 |
+
- Always respond in the same language as the question.
|
139 |
+
- Use only the provided documents below to answer.
|
140 |
+
- If the answer is not in the documents, simply say: "I don't know." / "Je ne sais pas."
|
141 |
+
- Cite only the sources you use, indicated at the end of each document like (Source: https://example.com).
|
142 |
+
|
143 |
+
|
144 |
+
Documents :
|
145 |
+
{context}
|
146 |
+
|
147 |
+
Question : {query}
|
148 |
+
Answer :
|
149 |
+
[/INST]
|
150 |
+
"""
|
151 |
+
|
152 |
+
try:
|
153 |
+
response = client1.chat.completions.create(
|
154 |
+
model="mistralai/mistral-small-3.1-24b-instruct:free",
|
155 |
+
messages=[{"role": "user", "content": prompt}]
|
156 |
+
)
|
157 |
+
return response.choices[0].message.content.strip()
|
158 |
+
except Exception as e:
|
159 |
+
print(f"Erreur lors de la génération : {e}")
|
160 |
+
return "Erreur lors de la génération."
|
161 |
+
|
162 |
+
# ---------------------- Generation function (Huggingface) ----------------------
|
163 |
+
def generate_via_huggingface(context, query, max_new_tokens=512, hf_token="your_huggingface_token"):
|
164 |
+
print("\n--- Generating via Huggingface ---")
|
165 |
+
print("Context received:", context)
|
166 |
+
|
167 |
+
prompt = f"""<s>[INST]
|
168 |
+
You are a Moodle expert assistant.
|
169 |
+
|
170 |
+
Rules:
|
171 |
+
- Answer only based on the provided documents.
|
172 |
+
- If the answer is not found, reply: "I don't know."
|
173 |
+
- Only cite sources mentioned (metadata 'source').
|
174 |
+
|
175 |
+
Documents:
|
176 |
+
{context}
|
177 |
+
|
178 |
+
Question: {query}
|
179 |
+
Answer:
|
180 |
+
[/INST]
|
181 |
+
"""
|
182 |
+
|
183 |
+
API_URL = "https://api-inference.huggingface.co/models/mistralai/Mixtral-8x7B-Instruct-v0.1"
|
184 |
+
headers = {"Authorization": f"Bearer {hf_token}"}
|
185 |
+
payload = {
|
186 |
+
"inputs": prompt,
|
187 |
+
"parameters": {
|
188 |
+
"max_new_tokens": max_new_tokens
|
189 |
+
}
|
190 |
+
}
|
191 |
+
|
192 |
+
response = requests.post(API_URL, headers=headers, json=payload)
|
193 |
+
|
194 |
+
if response.status_code == 200:
|
195 |
+
result = response.json()
|
196 |
+
if isinstance(result, list) and "generated_text" in result[0]:
|
197 |
+
return result[0]["generated_text"].strip()
|
198 |
+
else:
|
199 |
+
return "Error: Unexpected response format."
|
200 |
+
else:
|
201 |
+
return f"Error {response.status_code}: {response.text}"
|
202 |
+
|
203 |
+
# ---------------------- Main Chatbot ----------------------
|
204 |
+
def chatbot(query):
|
205 |
+
print("\n==== New Query ====")
|
206 |
+
print("User Query:", query)
|
207 |
+
|
208 |
+
# Try to retrieve from CAG (cache)
|
209 |
+
answer, score = retrieve_from_cag(query)
|
210 |
+
if answer:
|
211 |
+
print("Answer retrieved from CAG cache.")
|
212 |
+
return answer
|
213 |
+
|
214 |
+
# If not found, retrieve from RAG
|
215 |
+
docs = retrieve_from_rag(query)
|
216 |
+
if docs:
|
217 |
+
context_blocks = []
|
218 |
+
for doc in docs:
|
219 |
+
content = doc.get("content", "").strip()
|
220 |
+
metadata = doc.get("metadata") or {}
|
221 |
+
source = "Source inconnue"
|
222 |
+
|
223 |
+
if isinstance(metadata, dict):
|
224 |
+
source_field = metadata.get("metadata", "")
|
225 |
+
if isinstance(source_field, str) and source_field.startswith("source:"):
|
226 |
+
source = source_field.replace("source:", "").strip()
|
227 |
+
|
228 |
+
context_blocks.append(f"{content}\n(Source: {source})")
|
229 |
+
|
230 |
+
context = "\n\n".join(context_blocks)
|
231 |
+
|
232 |
+
# Choose the generation backend (OpenRouter or Huggingface)
|
233 |
+
response = generate_via_openrouter(context, query)
|
234 |
+
return response
|
235 |
+
|
236 |
+
else:
|
237 |
+
print("No relevant documents found.")
|
238 |
+
return "Je ne sais pas."
|
239 |
+
|
240 |
+
|
241 |
+
# ---------------------- Gradio App ----------------------
|
242 |
+
|
243 |
+
# Define the chatbot response function
|
244 |
+
def ask(user_message, chat_history):
|
245 |
+
if not user_message:
|
246 |
+
return chat_history, chat_history, ""
|
247 |
+
|
248 |
+
# Get chatbot response
|
249 |
+
response = chatbot(user_message)
|
250 |
+
|
251 |
+
# Update chat history
|
252 |
+
chat_history.append((user_message, response))
|
253 |
+
return chat_history, chat_history, ""
|
254 |
+
|
255 |
+
# Initialize chat history with a welcome message
|
256 |
+
initial_message = (None, "Hello, how can I help you with Moodle?")
|
257 |
+
|
258 |
+
# Build Gradio interface
|
259 |
+
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
260 |
+
chat_history = gr.State([initial_message]) # <-- Move inside here!
|
261 |
+
|
262 |
+
chatbot_ui = gr.Chatbot(value=[initial_message])
|
263 |
+
question = gr.Textbox(placeholder="Ask me anything about Moodle...", show_label=False)
|
264 |
+
clear_button = gr.Button("Clear")
|
265 |
+
|
266 |
+
question.submit(ask, [question, chat_history], [chatbot_ui, chat_history, question])
|
267 |
+
clear_button.click(lambda: ([initial_message], [initial_message], ""), None, [chatbot_ui, chat_history, question], queue=False)
|
268 |
+
|
269 |
+
demo.queue()
|
270 |
+
demo.launch(share=False)
|
271 |
+
|
qa.json
ADDED
@@ -0,0 +1,74 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"Faut-il déposer les vidéos sur Moodle.USJ directement ?": "Les vidéos sont des fichiers trop lourds pour être déposés sur Moodle. Il faut d'abord les déposer sur un serveur dédicacé aux vidéos comme notre Mediaiste.USJ ou sur un service de stockage dans le cloud comme One Drive. Toute vidéo déposée sur le Mediasite sera accessible aux étudiants en mode de visionnement uniquement, alors que celle déposée sur le One Drive peut être téléchargeable par les étudiants. Pour savoir plus sur consultez les tutoriels téléchargement dans One Drive.",
|
3 |
+
"Pourquoi les étudiants n’arrivent pas à accéder à mon espace sur Moodle.USJ ?": "Pour que les étudiants puissent accéder à votre UE sur Moodle.USJ, ils doivent être inscrits dans votre espace soit à travers l'inscription massive ou en leur communiquant la clef d’inscription relative à votre espace.",
|
4 |
+
"Comment concevoir un quiz en limitant la tricherie ?": "Pour limiter la tricherie, vous pouvez utiliser des fonctionnalités telles que l'anonymisation des réponses, le temps limité, l'activation de l'option pour mélanger les questions et les réponses, et l'interdiction de revenir en arrière durant le test.",
|
5 |
+
"Comment ajouter des questions aléatoirement à un Quiz ?": "Vous pouvez ajouter des questions aléatoires en créant une catégorie de questions dans votre banque de questions et en configurant le quiz pour tirer des questions de cette catégorie.",
|
6 |
+
"Comment importer mes questions à partir d'un fichier Word ?": "Il est possible d'importer vos questions en utilisant le format compatible Moodle (comme GIFT ou Aiken) et en convertissant votre fichier Word dans ce format avant de l'importer dans Moodle.",
|
7 |
+
"Est-il possible de créer plusieurs versions d’une même question ?": "Oui, Moodle permet de créer plusieurs versions d'une même question en utilisant des options telles que les questions aléatoires ou en copiant la question plusieurs fois avec des variantes.",
|
8 |
+
"Comment mélanger les questions d'une ou plusieurs sections ?": "Il est possible de mélanger les questions d'une ou plusieurs sections dans un quiz en activant l'option de mélange des questions dans les paramètres du quiz.",
|
9 |
+
"Est-ce possible de bloquer les connexions simultanées d’un même utilisateur en cours d’un test?": "Oui, Moodle permet de bloquer les connexions simultanées d’un même utilisateur pendant un test en configurant des restrictions d’accès au quiz.",
|
10 |
+
"Comment autoriser l'étudiant à continuer sa tentative (suite à un blocage de connexion) ?": "Moodle permet de configurer des options qui permettent à l'étudiant de reprendre sa tentative si la connexion est coupée, sous réserve que le test soit configuré pour autoriser des tentatives multiples ou des tentatives continues.",
|
11 |
+
"Est-ce possible de prévoir des dérogations de temps pour un ou plusieurs étudiants afin de pallier à des problèmes techniques ?": "Oui, Moodle permet de configurer des dérogations de temps pour certains étudiants, notamment en cas de problèmes techniques, via la fonctionnalité de groupes et de dérogations.",
|
12 |
+
"Est-ce possible de prévoir une prolongation de l'examen en cours ?": "Oui, Moodle permet de prolonger le temps d'un examen en cours en configurant des dérogations pour des utilisateurs spécifiques.",
|
13 |
+
"Comment Moodle sauvegarde les réponses des étudiants lors d’un test ?": "Moodle sauvegarde automatiquement les réponses des étudiants pendant un test. Il existe aussi une option pour enregistrer les réponses à intervalles réguliers afin d'éviter toute perte de données.",
|
14 |
+
"Comment réagit Moodle en cas de panne d’ordinateur (s’éteint ou freeze) en cours d’un test ?": "Moodle sauvegarde régulièrement les réponses des étudiants pendant un test. En cas de panne d’ordinateur, l’étudiant pourra récupérer la session et reprendre là où il s'était arrêté, si la fonction de sauvegarde automatique est activée.",
|
15 |
+
"Comment réagit Moodle en cas de perte de connexion en cours d’un test ?": "En cas de perte de connexion, Moodle permet à l'étudiant de reprendre sa tentative là où il l'a laissée, à condition que la connexion soit rétablie avant la fin du test.",
|
16 |
+
"Je me suis rendu compte qu’une de mes questions n’est pas bonne mais les tentatives sont déjà en cours. Que faire ?": "Si une question est incorrecte, vous pouvez la modifier, mais les tentatives précédentes ne seront pas affectées. Vous pouvez annuler les tentatives ou ajuster les résultats si nécessaire.",
|
17 |
+
"Comment bloquer l’accès au Devoir avant l’examen ?": "Vous pouvez bloquer l'accès au devoir en paramétrant la date de début de disponibilité du devoir dans les paramètres de l'activité dans Moodle.",
|
18 |
+
"Comment détecter le plagiat dans les documents rendus des étudiants (dissertation, synthèse, rapport…) ?": "Moodle permet d'intégrer des outils de détection de plagiat, comme Turnitin, pour analyser les documents rendus et détecter les similitudes.",
|
19 |
+
"Est-ce que je peux corriger les documents rendus dans une activité de type dépôt devoir en offline ?": "Oui, vous pouvez télécharger les fichiers des étudiants et les corriger hors ligne avant de revenir sur Moodle pour publier les notes.",
|
20 |
+
"Est-ce que je peux distribuer massivement les fichiers de feedback ?": "Oui, Moodle permet de distribuer facilement des fichiers de feedback en utilisant l'option de feedback en masse lors de l'évaluation.",
|
21 |
+
"Quel navigateur faut-il utiliser pour un test sur Moodle?": "Pour éviter les ennuis techniques lors de l’affichage des questions, il est conseillé d’accéder à Moodle.USJ depuis un ordinateur équipé d’un navigateur web récent. Firefox ou Chrome sont des navigateurs éprouvés pour participer à un examen sur Moodle.USJ.",
|
22 |
+
"Comment se déroule l'activité test sur Moodle ?": "L'activité test sur Moodle permet de créer des examens en ligne avec des questions à choix multiples, à réponses courtes, ou des questions ouvertes. L’étudiant répond aux questions dans une fenêtre de test sécurisée.",
|
23 |
+
"Qu’est-ce qu’un test en mode de navigation séquentielle ?": "Le mode de navigation séquentielle sur Moodle empêche les étudiants de revenir en arrière dans le test une fois qu'ils ont répondu à une question, forçant ainsi une progression linéaire.",
|
24 |
+
"Comment importer massivement mes questions à la banque de question ?": "Afin de faciliter les tests, au lieu d’insérer les questions manuellement et une à une, il est possible d’importer une liste de questions depuis un fichier Word en respectant un certain format dans les différentes catégories de la banque de questions. Les types de questions proposées sont: Question à choix unique (MC), Question à choix multiple (MA), Question à réponse courte (SA), Question Vrai/Faux (TF), Composition (ES). Référez-vous à ce tutoriel Alimentation de la banque de questions :https://cinia.blogs.usj.edu.lb/activite-test-alimentation-banque-de-questions/",
|
25 |
+
"Comment inscrire manuellement des étudiants dans Moodle ?": "Pour inscrire manuellement un étudiant : 1. Consultez votre cours en cliquant sur l’étiquette « Mes cours » dans le bloc « Navigation », puis sélectionnez votre cours. 2. Dans le bloc « Administration du cours », cliquez sur « Utilisateurs → Utilisateurs inscrits ». 3. Cliquez sur le bouton « Inscrire des utilisateurs ». 4. Saisissez l’email ou le nom de l’étudiant(e). 5. Cliquez sur son nom. 6. Cliquez sur « Inscrire des utilisateurs » pour finaliser l'inscription.",
|
26 |
+
"Comment inscrire massivement des étudiants par email USJ dans Moodle ?": "Pour inscrire massivement plusieurs étudiants : 1. Consultez votre cours en cliquant sur l’étiquette « Mes cours » dans le bloc « Navigation », puis sélectionnez votre cours. 2. Dans le bloc « Administration du cours », cliquez sur « Utilisateurs → Inscriptions massives ». 3. Dans la fenêtre d'inscription massive : - Créez un fichier TXT contenant une seule colonne avec les emails USJ des étudiants (en-tête « email »). - Glissez-déposez le fichier TXT. - Cliquez sur « Les inscrire à mon cours ». Remarques : Le fichier doit être en format TXT avec une seule colonne d’emails USJ. Contactez votre secrétariat pour obtenir cette liste. Source : https://cinia.blogs.usj.edu.lb/gestion-son-espace-inscription-etudiants/",
|
27 |
+
"Should videos be uploaded directly to Moodle.USJ?": "Videos are too large to be uploaded directly to Moodle. They must first be uploaded to a server dedicated to videos such as our Mediaiste.USJ or to a cloud storage service like OneDrive. Any video uploaded to Mediasite will be viewable only, while videos uploaded to OneDrive can be downloaded by students. For more information, consult the tutorials on uploading to OneDrive.",
|
28 |
+
"Why can't students access my space on Moodle.USJ?": "For students to access your course on Moodle.USJ, they must be enrolled either through bulk enrollment or by using the enrollment key associated with your course space.",
|
29 |
+
"How to design a quiz to limit cheating?": "To limit cheating, you can use features like anonymizing responses, setting a time limit, enabling the option to shuffle questions and answers, and prohibiting backward navigation during the test.",
|
30 |
+
"How to add random questions to a Quiz?": "You can add random questions by creating a question category in your question bank and configuring the quiz to draw questions from that category.",
|
31 |
+
"How to import my questions from a Word file?": "You can import your questions using a Moodle-compatible format (like GIFT or Aiken) and converting your Word file to this format before importing into Moodle.",
|
32 |
+
"Is it possible to create multiple versions of the same question?": "Yes, Moodle allows you to create multiple versions of a question by using random questions or by copying the question and making variations.",
|
33 |
+
"How to shuffle questions in one or multiple sections?": "You can shuffle questions from one or multiple sections in a quiz by enabling the shuffle questions option in the quiz settings.",
|
34 |
+
"Is it possible to block simultaneous logins of the same user during a test?": "Yes, Moodle allows you to block simultaneous logins by configuring access restrictions to the quiz.",
|
35 |
+
"How to allow a student to continue their attempt after a connection issue?": "Moodle can be configured to allow students to resume their attempt if the connection is lost, provided the quiz is set up to allow multiple or continuous attempts.",
|
36 |
+
"Can time extensions be granted for one or several students due to technical problems?": "Yes, Moodle allows you to configure time extensions for specific students via the group and override features.",
|
37 |
+
"Is it possible to extend an ongoing exam?": "Yes, Moodle allows you to extend the time for an ongoing exam by setting up user-specific overrides.",
|
38 |
+
"How does Moodle save students' answers during a test?": "Moodle automatically saves students' answers during a test. There is also an option to save responses at regular intervals to prevent data loss.",
|
39 |
+
"How does Moodle react to a computer crash (shutdown or freeze) during a test?": "Moodle regularly saves students' answers during a test. If a computer crash occurs, the student can recover their session and continue where they left off, provided auto-save is enabled.",
|
40 |
+
"How does Moodle react to a lost connection during a test?": "If the connection is lost, Moodle allows the student to resume their attempt where they left off once the connection is restored before the test ends.",
|
41 |
+
"I noticed that one of my questions is incorrect but attempts have already started. What should I do?": "If a question is incorrect, you can modify it, but previous attempts will not be affected. You can cancel attempts or adjust grades if necessary.",
|
42 |
+
"How to block access to an Assignment before the exam?": "You can block access to an assignment by setting the start availability date in the activity settings in Moodle.",
|
43 |
+
"How to detect plagiarism in student-submitted documents (essay, synthesis, report…)?": "Moodle can integrate plagiarism detection tools like Turnitin to analyze submitted documents and detect similarities.",
|
44 |
+
"Can I grade student submissions offline in an Assignment activity?": "Yes, you can download students' files and grade them offline before uploading the grades back into Moodle.",
|
45 |
+
"Can I distribute feedback files massively?": "Yes, Moodle allows you to distribute feedback files in bulk using the bulk feedback option during grading.",
|
46 |
+
"Which browser should be used for a Moodle test?": "It is recommended to use the latest versions of browsers like Chrome, Firefox, Safari, or Edge to ensure compatibility with Moodle during tests.",
|
47 |
+
"How does the Quiz activity work in Moodle?": "The Quiz activity in Moodle allows you to create online exams with multiple-choice, short-answer, or essay questions. Students answer questions within a secure test window.",
|
48 |
+
"What is a test with sequential navigation mode?": "Sequential navigation mode in Moodle prevents students from going back to previous questions, forcing them to proceed linearly through the test.",
|
49 |
+
"How to bulk import questions into the question bank?": "To facilitate tests, instead of adding questions manually one by one, you can import a list of questions from a Word file formatted correctly into the various categories of the question bank. Supported question types include: Single choice (MC), Multiple choice (MA), Short answer (SA), True/False (TF), Essay (ES). Refer to this tutorial for more details: https://cinia.blogs.usj.edu.lb/activite-test-alimentation-banque-de-questions/",
|
50 |
+
"How to manually enroll students in Moodle?": "To manually enroll a student: 1. Go to your course via 'My courses' in the 'Navigation' block. 2. In the 'Course administration' block, click 'Users → Enrolled users'. 3. Click the 'Enroll users' button. 4. Enter the student's email or name. 5. Click their name. 6. Click 'Enroll users' to finalize the enrollment.",
|
51 |
+
"How to bulk enroll students using USJ email addresses in Moodle?": "To bulk enroll several students: 1. Go to your course via 'My courses' in the 'Navigation' block. 2. In the 'Course administration' block, click 'Users → Bulk enrollments'. 3. In the bulk enrollment window: - Create a TXT file with a single column of USJ student emails (header 'email'). - Drag and drop the TXT file. - Click 'Enroll them in my course'. Notes: The file must be in TXT format with one column of USJ emails. Contact your department to obtain this list. Source: https://cinia.blogs.usj.edu.lb/gestion-son-espace-inscription-etudiants/",
|
52 |
+
"Comment demander l'ouverture d'un cours sur Moodle USJ ?": "Pour demander l'ouverture d'un cours sur Moodle USJ, vous devez remplir le formulaire disponible auprès du Centre de l’Innovation Numérique et de l’Intelligence Artificielle (CINIA) à ce lien : https://enquetes.usj.edu.lb/index.php/214782?lang=fr. Le CINIA créera l’espace de cours à partir des informations fournies. Une confirmation vous sera envoyée par mail. Avant de faire votre demande, veuillez vérifier auprès du Référent Numérique de votre institution si l’espace n’a pas déjà été créé via une demande massive.",
|
53 |
+
"Comment créer un espace de cours sur Moodle USJ ?": "La création d’un espace de cours sur Moodle USJ passe par une demande officielle auprès du CINIA. Il suffit de remplir le formulaire prévu à cet effet. Une fois la demande validée, l’espace sera créé et vous recevrez une confirmation par email. Assurez-vous d’abord auprès du Référent Numérique de votre institution que l’espace de votre cours n’a pas été généré automatiquement par une demande groupée.",
|
54 |
+
"How to request the opening of a course on Moodle USJ?": "To request the opening of a course on Moodle USJ, you must fill out the form available from the Center for Digital Innovation and Artificial Intelligence (CINIA) at this link: https://enquetes.usj.edu.lb/index.php/214782?lang=fr. CINIA will create the course space based on the information provided. A confirmation will also be sent to you by email. Before submitting your request, please check with the Digital Reference Person of your institution to ensure that the space has not already been created through a mass request.",
|
55 |
+
"How to create a course space on Moodle USJ?": "Creating a course space on Moodle USJ requires an official request to CINIA. You simply need to fill out the designated form. Once the request is validated, the space will be created and you will receive a confirmation by email. First, make sure with the Digital Reference Person of your institution that your course space has not already been automatically generated through a group request.",
|
56 |
+
"How do I create a Turnitin activity on Moodle USJ?": "To create a Turnitin activity, access your course through the 'My courses' label in the 'Navigation' block, activate editing by clicking 'Turn Editing On,' then click 'Add an Activity or Resource' and select 'Turnitin Assignment'. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
57 |
+
"How do I set up a Turnitin activity on Moodle USJ?": "After creating the Turnitin activity, click 'Select content,' enter a title and description, set start and due dates, and configure submission settings. Choose 'Do not store the submitted papers' for testing or 'Standard paper repository' for final submissions. Click 'Submit,' then 'Save and Display'. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
58 |
+
"How can I view the submitted work and similarity reports of students?": "Click on the Turnitin activity, select the rectangle next to a student's name to view the similarity report. Download reports by clicking the 'Download' icon and selecting 'Digital Receipt' or 'Current View'. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
59 |
+
"How do I view AI writing detection reports for student submissions?": "Within the Turnitin activity, click the rectangle next to the student's work, then click the 'AI' icon. The report will show the estimated percentage of AI-generated content. AI detection may not always be accurate and should be used cautiously. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
60 |
+
"How can I view Turnitin Data Analytics for my course?": "Click on the Turnitin activity and select the 'Analytics' tab. You can view the Submissions Timeline, Similarity Scores, Average Source Variety, Number of Submissions, and Student Resubmission data. Export all analytics by clicking 'Export All Data'. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
61 |
+
"How do I download all student submissions at once?": "Within the Turnitin activity, select the students by checking the boxes next to their names, then click 'Download All' and choose either 'Original Files' or 'Standard PDF'. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
62 |
+
"How do I permanently delete a submitted paper from Turnitin?": "Click on the Turnitin activity, go to the 'Options' tab next to the student's name, and choose 'Request permanent deletion'. Follow the steps to confirm. A deletion request will be processed within 24 hours. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
63 |
+
"How do I view past student submissions on Turnitin?": "Visit Turnitin’s Password Reset Page to reset your password if needed, then log in at turnitin.com. Click 'Instructor,' then 'All Classes,' choose your class, and click 'View' next to the assignment to see previous submissions. More info: https://cinia.blogs.usj.edu.lb/en/activite-turnitin/",
|
64 |
+
"Comment créer une activité Turnitin sur Moodle ?": "Pour créer une activité Turnitin dans votre espace Moodle, suivez ces étapes :\n\nAccédez à votre cours dans Moodle et activez le mode édition.\nCliquez sur 'Ajouter une activité ou une ressource' et choisissez '2.Devoir Turnitin (New)'.\nPlus d'infos : https://cinia.blogs.usj.edu.lb/activite-turnitin/",
|
65 |
+
"Comment paramétrer l’activité Turnitin sur Moodle ?": "Pour paramétrer l’activité Turnitin, procédez comme suit :\n\nCliquez sur 'Sélectionner un contenu'.\nSaisissez un titre et des consignes, puis définissez les dates de début et de remise.\nDans la section 'Paramètres d’envoi', choisissez :\n\n'Ne pas conserver les travaux envoyés' pour des tests (les travaux ne seront pas sauvegardés dans la base de données Turnitin).\n'Base de données Standard' pour des dépôts finaux.\nCliquez sur 'Envoyer' puis 'Enregistrer et afficher'.\nPlus d'infos : https://cinia.blogs.usj.edu.lb/activite-turnitin/",
|
66 |
+
"Comment consulter les devoirs remis et les rapports de similitude des étudiants ?": "Pour consulter les rapports de similitude, cliquez sur l’activité Turnitin créée, puis sur le rectangle à côté du nom de l’étudiant. Le rapport de similitude s'affichera avec les sources détectées et le pourcentage de similitude. Pour télécharger le rapport, cliquez sur l’icône 'Télécharger' et choisissez 'Accusé de réception' ou 'Vue actuelle'.\nPlus d'infos : https://cinia.blogs.usj.edu.lb/activite-turnitin/",
|
67 |
+
"Comment consulter les rapports de détection d’écriture IA pour les devoirs remis ?": "Dans l’activité Turnitin, cliquez sur le rectangle à côté du devoir de l’étudiant, puis sur l’icône 'AI'. Le rapport de détection d’écriture IA affichera un pourcentage estimé de contenu généré par IA. Cette fonctionnalité est utile mais peut ne pas être totalement précise. Il est conseillé de l’utiliser avec discernement.\nPlus d'infos : https://cinia.blogs.usj.edu.lb/activite-turnitin/",
|
68 |
+
"Comment accéder à l’analyse des données Turnitin pour mon cours ?": "Cliquez sur l’activité Turnitin, puis ouvrez l’onglet 'Analyse' pour voir la chronologie des envois, les scores de similarité, la diversité des sources, et plus encore. Vous pouvez également exporter les données complètes.\nPlus d'infos : https://cinia.blogs.usj.edu.lb/activite-turnitin/",
|
69 |
+
"Comment télécharger tous les travaux remis en une seule fois ?": "Pour télécharger tous les travaux remis, cochez les cases à côté des noms des étudiants, puis cliquez sur 'Tout télécharger' et choisissez 'Fichiers originaux' ou 'PDF standards'.\nPlus d'infos : https://cinia.blogs.usj.edu.lb/activite-turnitin/",
|
70 |
+
"Qu'est-ce que l'activité 'Feedback' sur Moodle ?": "L'activité 'Feedback' dans Moodle est utilisée pour permettre aux enseignants de recueillir des évaluations ou des retours de la part des étudiants sur un cours ou une activité spécifique. Elle permet aux étudiants de répondre à une série de questions, qui peuvent être anonymes ou non, selon les paramètres définis par l'enseignant. Les résultats peuvent être consultés sous forme d'analyse, et les réponses peuvent être exportées pour un traitement ultérieur. Plus d'infos sur : https://cinia.blogs.usj.edu.lb/activite-feedback/",
|
71 |
+
"What types of questions can be added in the 'Feedback' activity?": "Various types of questions can be added to a 'Feedback' activity in Moodle, including: \n- Multiple choice \n- Evaluated multiple choice \n- Short answer \n- Long answer \n- Numeric answer \nYou can also add labels for categorization and use page breaks to organize the questions across different pages. More info at: https://cinia.blogs.usj.edu.lb/en/activite-feedback/",
|
72 |
+
"What is the purpose of the 'Feedback' activity in Moodle?": "The 'Feedback' activity in Moodle is used to collect evaluations or feedback from students about a course or specific activity. It allows students to answer a series of questions, which can be anonymous depending on the settings configured by the teacher. The results can be viewed as analysis, and the responses can be exported for further processing. More info at: https://cinia.blogs.usj.edu.lb/en/activite-feedback/",
|
73 |
+
"Quels types de questions peuvent être ajoutés à un 'Feedback' dans Moodle ?": "Dans Moodle, plusieurs types de questions peuvent être ajoutés à une activité 'Feedback' :\n - Choix multiple : Permet aux étudiants de sélectionner une ou plusieurs options parmi plusieurs réponses proposées.\n - Choix multiple évalué (Rating) : Similaire au choix multiple, mais les réponses sont évaluées sur une échelle.\n - Réponse courte : Les étudiants répondent avec une courte phrase ou un mot.\n - Réponse longue : Les étudiants peuvent fournir une réponse plus détaillée ou longue.\n - Réponse numérique : Permet aux étudiants de saisir un nombre dans un intervalle spécifique.\nChaque question peut être paramétrée avec des étiquettes pour la catégorisation et peut inclure des sauts de page pour organiser les questions sur différentes pages. Plus d'infos sur : https://cinia.blogs.usj.edu.lb/activite-feedback/"
|
74 |
+
}
|
requirements (1).txt
ADDED
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
gradio
|
2 |
+
openai
|
3 |
+
requests
|
4 |
+
sentence-transformers
|
5 |
+
langchain
|
6 |
+
langchain-community
|
7 |
+
chromadb
|
8 |
+
numpy
|
9 |
+
pandas
|
10 |
+
openpyxl
|
11 |
+
transformers
|
12 |
+
torch
|
13 |
+
accelerate
|
14 |
+
|
web_documents (1).xlsx
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:fb4600bf72d7e7d5d34b9c94d3e090c2919b23122dde877fc0b8bad8eb8e3ecf
|
3 |
+
size 168575
|