ailabquestion / app.py
Jazz1508's picture
Update app.py
e4e2696 verified
import os
import gradio as gr
import openai
from sentence_transformers import SentenceTransformer, util
# Load similarity model
similarity_model = SentenceTransformer('all-MiniLM-L6-v2')
# Get OpenAI API key from Hugging Face secret
openai.api_key = "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"
def generate_unique_questions(topic, difficulty, num_questions, constraints):
base_prompt = f"""
You are an AI for generating lab experiment questions.
Topic: {topic}
Difficulty: {difficulty}
Constraints: {constraints if constraints else "None"}.
Task:
- Generate {num_questions} unique but equivalent lab questions
- Ensure same difficulty level for all
- Avoid repeating exact wording
- Keep questions answerable in similar time
- Return them in a numbered list.
"""
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[{"role": "system", "content": "You are an expert question generator for labs."},
{"role": "user", "content": base_prompt}],
temperature=0.9
)
# Extract questions
raw_questions = response.choices[0].message['content'].strip().split("\n")
questions = [q.strip() for q in raw_questions if q.strip()]
# Ensure uniqueness (semantic check)
final_questions = []
embeddings = []
for q in questions:
emb = similarity_model.encode(q, convert_to_tensor=True)
if not any(util.cos_sim(emb, e) > 0.85 for e in embeddings):
embeddings.append(emb)
final_questions.append(q)
return "\n".join(final_questions)
# Gradio UI
with gr.Blocks() as demo:
gr.Markdown("# 🔬 AI Lab Question Generator")
gr.Markdown("Generate **unique but equivalent** lab questions for each student.")
topic = gr.Textbox(label="Lab Topic", placeholder="e.g., Ohm's Law Experiment")
difficulty = gr.Dropdown(["Easy", "Medium", "Hard"], label="Difficulty", value="Medium")
num_questions = gr.Slider(1, 20, value=5, step=1, label="Number of Questions")
constraints = gr.Textbox(label="Extra Constraints (Optional)", placeholder="e.g., include diagram-based question")
generate_btn = gr.Button("Generate Questions")
output = gr.Textbox(label="Generated Questions", lines=10)
generate_btn.click(generate_unique_questions,
inputs=[topic, difficulty, num_questions, constraints],
outputs=output)
demo.launch()