decision-tree / app.py
Yescia's picture
Update app.py
8c10710 verified
import streamlit as st
import requests
import random
from datetime import datetime
# -----------------------------
# ๐Ÿ”ง ํ•จ์ˆ˜ ์ •์˜ ์˜์—ญ
# -----------------------------
def chat_with_solar(user_question, history, api_key):
"""
Solar Pro API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์— ๋Œ€ํ•œ ์ฑ—๋ด‡ ์‘๋‹ต์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
"""
url = "https://api.upstage.ai/v1/chat/completions"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
system_prompt = """
๋‹น์‹ ์€ AI ์ดˆ๋ณด ํ•™์Šต์ž์˜ ์งˆ๋ฌธ์— ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ๋Š” ์นœ์ ˆํ•œ AI์ž…๋‹ˆ๋‹ค.
์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด(Decision Tree)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ AI ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์„ธ์š”.
"""
messages = [{"role": "system", "content": system_prompt}]
for user, bot in history:
messages.append({"role": "user", "content": user})
messages.append({"role": "assistant", "content": bot})
messages.append({"role": "user", "content": user_question})
payload = {
"model": "solar-pro",
"messages": messages,
"temperature": 0,
"max_tokens": 2048
}
try:
response = requests.post(url, headers=headers, json=payload)
if response.status_code != 200:
return None, history, f"์ƒํƒœ ์ฝ”๋“œ: {response.status_code}"
bot_reply = response.json()["choices"][0]["message"]["content"]
history.append((user_question, bot_reply))
return bot_reply, history, None
except Exception as e:
return None, history, f"์˜ˆ์™ธ ๋ฐœ์ƒ: {str(e)}"
# -----------------------------
# ๐Ÿ–ฅ๏ธ Streamlit UI ์˜์—ญ
# -----------------------------
st.set_page_config(page_title="Decision Tree Chatbot Activity", layout="wide")
st.title("๐ŸŒณ Decision Tree Chatbot Activity with Solar")
st.markdown("""
์ด ์›น ์•ฑ์€ ์ดˆ๊ธ‰์ž๋ฅผ ์œ„ํ•œ ์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด ํ•™์Šต ์‹ค์Šต ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
**Upstage์˜ Solar Pro LLM**์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ ์ฑ—๋ด‡๊ณผ ๋Œ€ํ™”ํ•˜๋ฉฐ AI๊ฐ€ ์–ด๋–ป๊ฒŒ ํŒ๋‹จํ•˜๋Š”์ง€ ์ฒดํ—˜ํ•ด๋ณด์„ธ์š”!
""")
# ์ดˆ๊ธฐ ์ƒํƒœ ์„ค์ •
if "chat_history" not in st.session_state:
st.session_state.chat_history = []
# ์‚ฌ์ด๋“œ๋ฐ”: API ํ‚ค ์ž…๋ ฅ
with st.sidebar:
st.header("๐Ÿ” Solar API Key")
api_key = st.text_input("Enter your Upstage API key", type="password")
# ๋ ˆ์ด์•„์›ƒ ๋ถ„ํ• 
col1, col2 = st.columns(2)
# ์ขŒ์ธก: ์ฑ—๋ด‡ ์ธํ„ฐํŽ˜์ด์Šค
with col1:
st.subheader("๐Ÿค– ์ฑ—๋ด‡์—๊ฒŒ ์งˆ๋ฌธํ•˜๊ธฐ (with Solar Pro)")
user_input = st.text_input("๊ถ๊ธˆํ•œ ๊ฑธ ๋ฌผ์–ด๋ณด์„ธ์š”! (์˜ˆ: ์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด๊ฐ€ ๋ญ์•ผ?)")
if user_input and api_key:
with st.spinner("Solar์™€ ๋Œ€ํ™” ์ค‘..."):
response, st.session_state.chat_history, error = chat_with_solar(user_input, st.session_state.chat_history, api_key)
if error:
st.error(error)
else:
st.markdown(f"**๋‹น์‹ :** {user_input}")
st.markdown(f"**์ฑ—๋ด‡:** {response}")
elif user_input and not api_key:
st.warning("๋จผ์ € API ํ‚ค๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”!")
if st.session_state.chat_history:
with st.expander("๐Ÿ’ฌ ์ง€๋‚œ ๋Œ€ํ™” ๋ณด๊ธฐ"):
for user, bot in st.session_state.chat_history:
st.markdown(f"- **๋‹น์‹ :** {user}")
st.markdown(f" **์ฑ—๋ด‡:** {bot}")
# ์šฐ์ธก: ํ•™์Šต์ž ๋ฉ”๋ชจ์žฅ
with col2:
st.subheader("๐Ÿ“ ๋ฉ”๋ชจ์žฅ: ๋‚˜์˜ ์ดํ•ด ๊ธฐ๋ก")
notes = st.text_area("์˜ค๋Š˜ ์•Œ๊ฒŒ ๋œ ์ ์ด๋‚˜ ๊ถ๊ธˆํ•œ ์ ์„ ์ •๋ฆฌํ•ด๋ณด์„ธ์š”:")
if st.button("๋žœ๋ค ์งˆ๋ฌธ ์ œ์•ˆ๋ฐ›๊ธฐ"):
sample_questions = [
"์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด๊ฐ€ ๋ญ์•ผ?",
"์กฐ๊ฑด์ด ๋ฐ”๋€Œ๋ฉด ๊ฒฐ๊ณผ๋„ ๋ฐ”๋€Œ๋Š” ์ด์œ ๋Š” ๋ญ์•ผ?",
"AI๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๋Š”์ง€ ์„ค๋ช…ํ•ด์ค˜.",
"๋‚ด๊ฐ€ ๋งŒ๋“  ๊ฒฐ์ •๋‚˜๋ฌด๋ฅผ ๋” ๋˜‘๋˜‘ํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ด?",
"์˜์‚ฌ๊ฒฐ์ •๋‚˜๋ฌด๋ž‘ ์‹ ๊ฒฝ๋ง์˜ ์ฐจ์ด๋ฅผ ์•Œ๋ ค์ค˜."
]
st.info(f"์˜ˆ์‹œ ์งˆ๋ฌธ: '{random.choice(sample_questions)}'")
if notes:
today = datetime.now().strftime("%Y-%m-%d")
filename = f"{today}_studynote.txt"
st.download_button(
label="๐Ÿ“ฅ ๋ฉ”๋ชจ ๋‹ค์šด๋กœ๋“œ(txt)",
data=notes,
file_name=filename,
mime="text/plain"
)
st.markdown("---")
st.markdown("Made with โค๏ธ using Solar Pro API ยท Upstage ยท Streamlit")