File size: 4,017 Bytes
94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 5e43dc8 94d49c9 23b096f 94d49c9 7a16b3c 94d49c9 23b096f 8aa1427 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 94d49c9 23b096f 649e09f 23b096f 94d49c9 23b096f 94d49c9 2e44d20 | 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 | 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)
# 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)}")
|