Download app.py from openfree/DeepSeek-R1-Chatbot-32b: direct link, hf CLI and curl.
- Browser
- Download file 4.02 kB
-
https://huggingface.co/spaces/openfree/DeepSeek-R1-Chatbot-32b/resolve/main/app.py
- Command line
-
hf download hf://spaces/openfree/DeepSeek-R1-Chatbot-32b/app.py
-
curl -L -o app.py https://huggingface.co/spaces/openfree/DeepSeek-R1-Chatbot-32b/resolve/main/app.py
4.02 kB
| 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) | |
| # λͺ¨λΈκ³Ό ν ν¬λμ΄μ λ₯Ό λ‘λνλ ν¨μ (μΊμ±νμ¬ ν λ²λ§ λ‘λ) | |
| def load_model_and_tokenizer(model_name: str): | |
| logger.info(f"Loading model and tokenizer for {model_name} ...") | |
| tokenizer = AutoTokenizer.from_pretrained(model_name) | |
| # device_map="auto" μ΅μ μ μ¬μ© κ°λ₯ν GPU/CPUμ λ§κ² λͺ¨λΈμ μλμΌλ‘ ν λΉν©λλ€. | |
| 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) | |
| # "Assistant:" μ΄νμ ν μ€νΈλ§ μΆμΆ (μμΌλ©΄ μ 체 ν μ€νΈ μ¬μ©) | |
| 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)}") | |