question_qualifier / question_qualifer.py
dp1345's picture
added files
e392014 verified
from transformers import pipeline, AutoTokenizer, AutoModelForCausalLM
import gradio as gr
import re
import torch
# Use a much smaller, CPU-friendly model
MODEL_NAME = "microsoft/DialoGPT-small" # Much lighter alternative
print("Loading lightweight model for CPU...")
print("This should load much faster...")
try:
# Create pipeline directly - simpler approach
generator = pipeline(
"text-generation",
model=MODEL_NAME,
device=-1, # Force CPU
do_sample=True,
temperature=0.7
)
print("✅ Model loaded successfully!")
except Exception as e:
print(f"❌ Error: {e}")
print("Falling back to rule-based classification...")
generator = None
def rule_based_classify(question):
"""Simple rule-based classification as fallback"""
question_lower = question.lower()
# Math patterns
math_patterns = [
r'\d+\s*[\+\-\*\/\^]\s*\d+',
r'what\s+is\s+\d+',
r'calculate',
r'solve',
r'equation',
r'math',
r'plus|minus|times|divided|multiply'
]
# Opinion patterns
opinion_patterns = [
r'favorite|prefer|best|worst|opinion',
r'what.*think|feel|believe',
r'should\s+i|recommend',
r'better|worse'
]
# Check for math
for pattern in math_patterns:
if re.search(pattern, question_lower):
return "math", "This appears to be a math question. Please solve it step by step."
# Check for opinion
for pattern in opinion_patterns:
if re.search(pattern, question_lower):
return "opinion", "This is asking for an opinion or preference. Answers may vary by person."
# Default to factual
return "factual", "This appears to be asking for factual information."
def classify_and_answer(question):
"""Classify and answer questions with fallback options"""
if not question or question.strip() == "":
return "Please enter a valid question."
# If model failed to load, use rule-based approach
if generator is None:
category, answer = rule_based_classify(question)
return f"**Category:** {category.title()}\n**Answer:** {answer}"
# Simple prompt for smaller model
prompt = f"Question: {question}\nThis question is asking about:"
try:
# Generate with small model
output = generator(
prompt,
max_length=len(prompt) + 50,
num_return_sequences=1,
pad_token_id=generator.tokenizer.eos_token_id
)
generated_text = output[0]['generated_text']
response = generated_text[len(prompt):].strip()
# Simple classification based on keywords in response
response_lower = response.lower()
if any(word in response_lower for word in ['calculate', 'math', 'number', 'equation']):
category = "math"
elif any(word in response_lower for word in ['opinion', 'prefer', 'think', 'feel']):
category = "opinion"
else:
category = "factual"
return f"Category: {category.title()}\nAnswer: {response}"
except Exception as e:
print(f"Generation error: {e}")
# Fallback to rule-based
category, answer = rule_based_classify(question)
return f"**Category:** {category.title()}\n**Answer:** {answer}"
# Build simple Gradio UI
with gr.Blocks(title="Quick Question Classifier") as iface:
gr.Markdown("# 🚀 Quick Question Classifier")
gr.Markdown("*Lightweight CPU-friendly version*")
question_input = gr.Textbox(
lines=2,
placeholder="Enter your question here...",
label="Your Question"
)
submit_btn = gr.Button("Classify Question", variant="primary")
answer_output = gr.Textbox(
lines=3,
label="Classification Result",
interactive=False
)
submit_btn.click(classify_and_answer, question_input, answer_output)
question_input.submit(classify_and_answer, question_input, answer_output)
gr.Examples(
examples=[
["What is the capital of France?"],
["What is 25 + 17?"],
["What's your favorite color?"],
["How many planets are in our solar system?"],
["What is 144 divided by 12?"]
],
inputs=question_input
)
if __name__ == "__main__":
print("Starting Gradio interface...")
iface.launch(share=False, server_port=7860)