Python_tutor / app.py
krisha06's picture
Update app.py
2f006a2 verified
Raw
History Blame
2.4 kB
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
import streamlit as st
# Load base model and tokenizer
base_model = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
tokenizer = AutoTokenizer.from_pretrained(base_model)
# Load model in CPU mode
model = AutoModelForCausalLM.from_pretrained(
base_model,
torch_dtype=torch.float32,
device_map="cpu"
)
# Load the LoRA adapter
model = PeftModel.from_pretrained(model, "lora_adapter", device_map="cpu")
model.eval()
# Format prompt with example
def format_prompt(instruction):
return f"""### SYSTEM:
You are a helpful and expert Python programming tutor.
You only answer questions related to Python programming.
If the question is unrelated to Python, say:
"Sorry, I can only answer Python-related questions."
### USER:
What is the difference between a list and a tuple in Python?
### ASSISTANT:
In Python, both lists and tuples are used to store collections of items, but they have key differences. Lists are mutable (can be changed), whereas tuples are immutable (cannot be changed). Lists use square brackets [], and tuples use parentheses (). Tuples are generally faster and use less memory.
### USER:
{instruction}
### ASSISTANT:
"""
# Chat function
def chat(instruction):
prompt = format_prompt(instruction)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
outputs = model.generate(
**inputs,
max_new_tokens=256,
do_sample=False,
temperature=0.0,
top_p=1.0,
repetition_penalty=1.1
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("🧠 Raw Model Output:", repr(response)) # Debug log
# Extract response cleanly
if "### ASSISTANT:" in response:
return response.split("### ASSISTANT:")[-1].strip()
else:
return response.strip() # fallback
# Streamlit UI
st.set_page_config(page_title="🐍 Python Tutor Chatbot")
st.title("🐍 Python Tutor Chatbot")
st.write("Ask me Python programming questions!")
user_input = st.text_area("Your question:")
if st.button("Get Answer") and user_input.strip():
with st.spinner("Thinking..."):
response = chat(user_input)
st.markdown("**Answer:**")
st.write(response)
# Optional debug output
# st.write("**Raw model output:**")
# st.write(repr(response))