Spaces:
Sleeping
Sleeping
| import torch | |
| import torch.nn.functional as F | |
| import gradio as gr | |
| from transformers import AutoTokenizer, AutoModelForMultipleChoice | |
| # 1. Load Model & Tokenizer | |
| # Replace with your Hugging Face model repository ID | |
| MODEL_ID = "Pranjan007/roberta-mcq-solver" | |
| tokenizer = AutoTokenizer.from_pretrained(MODEL_ID) | |
| model = AutoModelForMultipleChoice.from_pretrained(MODEL_ID) | |
| model.eval() | |
| # 2. MCQ Inference Logic (CPU Execution) | |
| def predict_mcq(prompt, opt_a, opt_b, opt_c, opt_d, opt_e): | |
| if not prompt.strip(): | |
| return "Please enter a valid question prompt." | |
| options = [opt_a, opt_b, opt_c, opt_d, opt_e] | |
| option_labels = ['A', 'B', 'C', 'D', 'E'] | |
| # Format input pairs: "Question: ... Option X: ..." | |
| first_sentences = [f"Question: {prompt}"] * 5 | |
| second_sentences = [f"Option {label}: {text}" for label, text in zip(option_labels, options)] | |
| # Tokenize input pairs | |
| inputs = tokenizer( | |
| first_sentences, | |
| second_sentences, | |
| truncation=True, | |
| max_length=256, | |
| padding=True, | |
| return_tensors="pt" | |
| ) | |
| # Reshape input tensors to (1, 5, sequence_length) | |
| input_ids = inputs["input_ids"].unsqueeze(0) | |
| attention_mask = inputs["attention_mask"].unsqueeze(0) | |
| with torch.no_grad(): | |
| outputs = model(input_ids=input_ids, attention_mask=attention_mask) | |
| logits = outputs.logits # Shape: (1, 5) | |
| probabilities = F.softmax(logits, dim=1).squeeze(0).numpy() | |
| # Sort choices by confidence score | |
| option_probs = list(zip(option_labels, options, probabilities)) | |
| option_probs.sort(key=lambda x: x[2], reverse=True) | |
| top3_string = " ".join([item[0] for item in option_probs[:3]]) | |
| # Generate Formatted Output | |
| output_md = f"### 🏆 Top-3 Predicted Ranking: `{top3_string}`\n\n" | |
| output_md += "| Rank | Choice | Option Text | Confidence Probability |\n" | |
| output_md += "| :--- | :---: | :--- | :--- |\n" | |
| for rank, (label, text, prob) in enumerate(option_probs, 1): | |
| output_md += f"| **#{rank}** | **Option {label}** | {text} | **{prob * 100:.2f}%** |\n" | |
| return output_md | |
| # 3. Gradio Interface Definition | |
| with gr.Blocks(title="Smart MCQ Solver - RoBERTa-base", theme=gr.themes.Soft()) as demo: | |
| gr.Markdown("# 🤖 Smart MCQ Solver (RoBERTa-base)") | |
| gr.Markdown("Enter a question prompt along with 5 multiple-choice options to view the **Top-3 ranking** and **probabilities**.") | |
| with gr.Row(): | |
| with gr.Column(): | |
| prompt_input = gr.Textbox(label="Question Prompt", lines=3) | |
| opt_a = gr.Textbox(label="Option A") | |
| opt_b = gr.Textbox(label="Option B") | |
| opt_c = gr.Textbox(label="Option C") | |
| opt_d = gr.Textbox(label="Option D") | |
| opt_e = gr.Textbox(label="Option E") | |
| submit_btn = gr.Button("Predict Top-3 Choices", variant="primary") | |
| with gr.Column(): | |
| result_output = gr.Markdown(label="Prediction Results") | |
| submit_btn.click( | |
| fn=predict_mcq, | |
| inputs=[prompt_input, opt_a, opt_b, opt_c, opt_d, opt_e], | |
| outputs=result_output | |
| ) | |
| # Important for Docker: Bind to 0.0.0.0 and port 7860 | |
| demo.launch(server_name="0.0.0.0", server_port=7860) |