| | 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)}") |
| |
|