File size: 1,820 Bytes
75b206c
01247e0
dea7d9a
01247e0
5baf039
9b175a1
01247e0
 
5baf039
9b175a1
 
dea7d9a
 
9b175a1
dea7d9a
9b175a1
01247e0
 
5d1b435
 
9b175a1
 
dea7d9a
9b175a1
dea7d9a
 
01247e0
2f006a2
aee09f8
 
 
 
 
 
 
 
 
2f006a2
84376c0
2f006a2
9b175a1
 
a8f1aa1
 
9b175a1
 
01247e0
6c5f774
01247e0
6c5f774
01247e0
 
 
5baf039
9b175a1
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM
from peft import PeftModel
import streamlit as st

# Load tokenizer and model
base_model = "TinyLlama/TinyLlama-1.1B-Chat-v1.0"
tokenizer = AutoTokenizer.from_pretrained(base_model)

model = AutoModelForCausalLM.from_pretrained(base_model, device_map="cpu")
model = PeftModel.from_pretrained(model, "lora_adapter")  # Change if needed
model.eval()

# Format prompt (no USER/ASSISTANT lines to confuse model)
def format_prompt(instruction):
    return f"""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."

Question: {instruction}
Answer:"""

# Generate answer
def chat(instruction):
    prompt = format_prompt(instruction)
    inputs = tokenizer(prompt, return_tensors="pt").to(model.device)

    with torch.no_grad():
        outputs = model.generate(
            **inputs,
            max_new_tokens=512,
            do_sample=False,
            temperature=0.7,
            top_p=0.9,
            repetition_penalty=1.1
        )

    full_output = tokenizer.decode(outputs[0], skip_special_tokens=True)

    # Only return the model's answer
    return full_output.split("Answer:")[-1].strip()

# Streamlit UI
st.set_page_config(page_title="🐍 Python Tutor Chatbot (LoRA)")
st.title("🐍 Python Tutor Chatbot (LoRA)")
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:**")
        if "```" in response:
            st.markdown(response)
        else:
            st.write(response)