| import streamlit as st |
| import logging |
| import torch |
| from transformers import AutoTokenizer, AutoModelForCausalLM |
|
|
| |
| logging.basicConfig(level=logging.INFO) |
| logger = logging.getLogger(__name__) |
|
|
| |
| st.set_page_config( |
| page_title="DeepSeek Chatbot - ruslanmv.com", |
| page_icon="π€", |
| layout="centered" |
| ) |
|
|
| |
| if "messages" not in st.session_state: |
| st.session_state.messages = [] |
|
|
| |
| with st.sidebar: |
| st.header("Model Configuration") |
| st.markdown("λͺ¨λΈμ λ‘컬μμ μ§μ λ‘λν©λλ€.") |
| |
| |
| model_options = [ |
| "deepseek-ai/DeepSeek-R1-Distill-Qwen-32B", |
| ] |
| selected_model = st.selectbox("Select Model", model_options, index=0) |
| |
| |
| system_message = st.text_area( |
| "System Message", |
| value="You are a friendly chatbot created by ruslanmv.com. Provide clear, accurate, and brief answers. Keep responses polite, engaging, and to the point. If unsure, politely suggest alternatives.", |
| height=100 |
| ) |
| |
| |
| max_tokens = st.slider("Max Tokens", 10, 4000, 1000) |
| temperature = st.slider("Temperature", 0.1, 4.0, 0.3) |
| top_p = st.slider("Top-p", 0.1, 1.0, 0.6) |
|
|
| |
| @st.cache_resource |
| def load_model_and_tokenizer(model_name: str): |
| logger.info(f"Loading model and tokenizer for {model_name} ...") |
| tokenizer = AutoTokenizer.from_pretrained(model_name) |
| |
| model = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto") |
| return tokenizer, model |
|
|
| tokenizer, model = load_model_and_tokenizer(selected_model) |
|
|
| |
| st.title("π€ DeepSeek Chatbot") |
| st.caption("Powered by local model - Configure in sidebar") |
|
|
| |
| for message in st.session_state.messages: |
| with st.chat_message(message["role"]): |
| st.markdown(message["content"]) |
|
|
| |
| if prompt := st.chat_input("Type your message..."): |
| st.session_state.messages.append({"role": "user", "content": prompt}) |
| |
| with st.chat_message("user"): |
| st.markdown(prompt) |
| |
| try: |
| with st.spinner("Generating response..."): |
| |
| full_prompt = f"{system_message}\n\nUser: {prompt}\nAssistant:" |
| inputs = tokenizer.encode(full_prompt, return_tensors="pt").to(model.device) |
| |
| |
| output_tokens = model.generate( |
| inputs, |
| max_new_tokens=max_tokens, |
| temperature=temperature, |
| top_p=top_p, |
| do_sample=True, |
| pad_token_id=tokenizer.eos_token_id, |
| ) |
| |
| |
| output_text = tokenizer.decode(output_tokens[0], skip_special_tokens=True) |
| |
| if "Assistant:" in output_text: |
| assistant_response = output_text.split("Assistant:")[-1].strip() |
| else: |
| assistant_response = output_text.strip() |
| |
| logger.info(f"Generated response: {assistant_response}") |
| |
| |
| with st.chat_message("assistant"): |
| st.markdown(assistant_response) |
| |
| st.session_state.messages.append({"role": "assistant", "content": assistant_response}) |
| |
| except Exception as e: |
| logger.error(f"Application Error: {str(e)}", exc_info=True) |
| st.error(f"Application Error: {str(e)}") |
|
|