IDEA-DESIGN / app.py
ginipick's picture
Update app.py
78f19de verified
raw
history blame
6.26 kB
import os
import streamlit as st
import json
import anthropic
# API μ„€μ •
api_key = os.environ.get("API_KEY")
client = anthropic.Anthropic(api_key=api_key)
# μ΅œλŒ€ 토큰 수 μ„€μ • (Claude-3 Sonnet의 μ΅œλŒ€ 토큰 수)
MAX_TOKENS = 7999
def get_system_prompt():
return """
## 🌟 μ „λ¬Έ λΈ”λ‘œκ±° μ‹œμŠ€ν…œ ν”„λ‘¬ν”„νŠΈ
### βœ… 단계별 곡식 ν”„λ‘¬ν”„νŠΈ
λ‹€μŒ 8κ°€μ§€ 단계λ₯Ό μ •ν™•νžˆ μˆœμ„œλŒ€λ‘œ 따라 λΈ”λ‘œκ·Έλ₯Ό μž‘μ„±ν•˜μ„Έμš”:
### 1. 인사와 곡감으둜 μ‹œμž‘ν•˜κΈ°
- μΉœκ·Όν•œ 말투둜 λ…μžμ—κ²Œ μΈμ‚¬ν•˜λ©° κΈ€μ˜ μ£Όμ œμ— λŒ€ν•œ 관심 유발
- λ…μžμ˜ ν˜„μ‹€μ  κ³ λ―Όμ΄λ‚˜ 곡감 μš”μ†Œλ₯Ό 질문 ν˜•νƒœλ‘œ μ œμ‹œ
### 2. 문제λ₯Ό λͺ…ν™•νžˆ μ œμ‹œν•˜κΈ°
- λ…μžκ°€ κ²ͺκ³  μžˆλŠ” ꡬ체적이고 ν˜„μ‹€μ μΈ 문제λ₯Ό λͺ…ν™•νžˆ μ§šμ–΄λ‚΄κΈ°
- 문제의 심각성 λ˜λŠ” 긴급성을 κ°•μ‘°ν•˜μ—¬ 관심도λ₯Ό 높이기
### 3. 문제 원인을 λΆ„μ„ν•˜μ—¬ μ‹ λ’° κ΅¬μΆ•ν•˜κΈ°
- 문제 λ°œμƒ 원인을 λ…Όλ¦¬μ μœΌλ‘œ μ„€λͺ…
- λ…μžκ°€ μ‰½κ²Œ 이해할 수 μžˆλ„λ‘ λͺ…ν™•ν•˜κ³  ꡬ체적으둜 기술
- ν•„μš”ν•œ 경우 데이터, μ˜ˆμ‹œ, 사둀 μ œμ‹œ
### 4. ꡬ체적 해결책을 μ œμ‹œν•˜κΈ°
- 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλŠ” ꡬ체적이고 μ‹€μ²œ κ°€λŠ₯ν•œ 방법을 λ‹¨κ³„μ μœΌλ‘œ 제곡
- λͺ…ν™•ν•œ 팁, μ „λž΅, κ°€μ΄λ“œλΌμΈ ν˜•νƒœλ‘œ μ œμ‹œν•˜μ—¬ μ¦‰μ‹œ 적용 κ°€λŠ₯ν•˜κ²Œ ν•˜κΈ°
### 5. μ‚¬νšŒμ  증거 μ œμ‹œν•˜κΈ°
- μ‹€μ œ 성곡 사둀, ν›„κΈ°, μ‚¬μš©μž κ²½ν—˜λ‹΄, 데이터 등을 포함
- λ…μžκ°€ μ‹ λ’°ν•  수 μžˆλ„λ‘ ꡬ체적이고 μ‚¬μ‹€μ μœΌλ‘œ 기술
### 6. 행동 μœ λ„(CTA: Call To Action)ν•˜κΈ°
- μ§€κΈˆ λ‹Ήμž₯ λ…μžκ°€ μ·¨ν•΄μ•Ό ν•  행동을 ꡬ체적으둜 μ œμ•ˆ
- "μ§€κΈˆ λ°”λ‘œ", "μ˜€λŠ˜λΆ€ν„°", "μ¦‰μ‹œ"와 같은 κΈ΄κΈ‰ν•œ ν‘œν˜„μ„ μ‚¬μš©ν•˜μ—¬ λ…μžμ˜ 행동을 촉진
### 7. μ œν•œ 쑰건 λ˜λŠ” κ²½κ³ λ₯Ό μΆ”κ°€ν•˜μ—¬ μ§„μ •μ„± κ°•ν™”ν•˜κΈ°
- 이 κΈ€μ΄λ‚˜ 해결책이 λͺ¨λ“  μ‚¬λžŒμ—κ²Œ λ§žμ§€ μ•Šμ„ 수 μžˆμŒμ„ μ–ΈκΈ‰
- λ…μžμ—κ²Œ μ§„μ •μ„±κ³Ό ν¬μ†Œμ„±μ„ μ „λ‹¬ν•˜μ—¬ 신뒰도λ₯Ό 높이기
### 8. 감사 인사 및 후속 μ—°κ²° μ•ˆλ‚΄ν•˜κΈ°
- λ…μžμ—κ²Œ μ½μ–΄μ€˜μ„œ κ°μ‚¬ν•˜λ‹€λŠ” 진심을 ν‘œν˜„
- λ‹€μŒ ν¬μŠ€νŒ… 예고 λ˜λŠ” λŒ“κΈ€, ꡬ독 μš”μ²­μœΌλ‘œ μžμ—°μŠ€λŸ¬μš΄ μ—°κ²° μœ λ„
---
### 🚩 μž‘μ„± μŠ€νƒ€μΌ 팁
- μΉœκ·Όν•˜κ³  인간적인 톀 μœ μ§€
- ꡬ어체와 μ§ˆλ¬Έμ„ 자주 μ‚¬μš©ν•˜μ—¬ λ…μžμ™€μ˜ μƒν˜Έμž‘μš© 촉진
- λͺ…ν™•ν•œ ꡬ쑰와 ꡬ뢄선(---), 번호 λͺ©λ‘, 체크리슀트 μ‚¬μš©μœΌλ‘œ 가독성 ν–₯상
- κ°€λŠ₯ν•˜λ©΄ μ‹€μ œ μ‚¬λ‘€λ‚˜ ꡬ체적 데이터 포함
"""
def chatbot_interface():
st.title("Ginigen Blog")
# λͺ¨λΈ κ³ μ • μ„€μ •
if "ai_model" not in st.session_state:
st.session_state["ai_model"] = "claude-3-5-sonnet-20241022"
# μ„Έμ…˜ μƒνƒœ μ΄ˆκΈ°ν™”
if "messages" not in st.session_state:
st.session_state.messages = []
# μžλ™ μ €μž₯ κΈ°λŠ₯
if "auto_save" not in st.session_state:
st.session_state.auto_save = True
# λŒ€ν™” 기둝 관리 (μ‚¬μ΄λ“œλ°”)
st.sidebar.title("λŒ€ν™” 기둝 관리")
# μžλ™ μ €μž₯ ν† κΈ€
st.session_state.auto_save = st.sidebar.toggle("μžλ™ μ €μž₯", value=st.session_state.auto_save)
# λŒ€ν™” 기둝 뢈러였기
uploaded_file = st.sidebar.file_uploader("λŒ€ν™” 기둝 뢈러였기", type=['json'])
if uploaded_file is not None:
try:
content = uploaded_file.getvalue().decode()
if content.strip():
st.session_state.messages = json.loads(content)
st.sidebar.success("λŒ€ν™” 기둝을 μ„±κ³΅μ μœΌλ‘œ λΆˆλŸ¬μ™”μŠ΅λ‹ˆλ‹€!")
else:
st.sidebar.warning("μ—…λ‘œλ“œλœ 파일이 λΉ„μ–΄ μžˆμŠ΅λ‹ˆλ‹€.")
except json.JSONDecodeError:
st.sidebar.error("μ˜¬λ°”λ₯Έ JSON ν˜•μ‹μ˜ 파일이 μ•„λ‹™λ‹ˆλ‹€.")
except Exception as e:
st.sidebar.error(f"파일 처리 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}")
# λŒ€ν™” 기둝 μ΄ˆκΈ°ν™” λ²„νŠΌ
if st.sidebar.button("λŒ€ν™” 기둝 μ΄ˆκΈ°ν™”"):
st.session_state.messages = []
st.sidebar.success("λŒ€ν™” 기둝이 μ΄ˆκΈ°ν™”λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
# λ©”μ‹œμ§€ ν‘œμ‹œ
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# μ‚¬μš©μž μž…λ ₯
if prompt := st.chat_input("무엇을 λ„μ™€λ“œλ¦΄κΉŒμš”?"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
# AI 응닡 생성
with st.chat_message("assistant"):
message_placeholder = st.empty()
full_response = ""
# API 호좜
with client.messages.stream(
max_tokens=MAX_TOKENS,
system=get_system_prompt(),
messages=[{"role": m["role"], "content": m["content"]} for m in st.session_state.messages],
model=st.session_state["ai_model"]
) as stream:
for text in stream.text_stream:
full_response += str(text) if text is not None else ""
message_placeholder.markdown(full_response + "β–Œ")
message_placeholder.markdown(full_response)
st.session_state.messages.append({"role": "assistant", "content": full_response})
# μžλ™ μ €μž₯ κΈ°λŠ₯
if st.session_state.auto_save:
try:
with open('chat_history_auto_save.json', 'w', encoding='utf-8') as f:
json.dump(st.session_state.messages, f, ensure_ascii=False, indent=4)
except Exception as e:
st.sidebar.error(f"μžλ™ μ €μž₯ 쀑 였λ₯˜ λ°œμƒ: {str(e)}")
# λŒ€ν™” 기둝 λ‹€μš΄λ‘œλ“œ
if st.sidebar.button("λŒ€ν™” 기둝 λ‹€μš΄λ‘œλ“œ"):
json_history = json.dumps(st.session_state.messages, indent=4, ensure_ascii=False)
st.sidebar.download_button(
label="λŒ€ν™” 기둝 μ €μž₯ν•˜κΈ°",
data=json_history,
file_name="chat_history.json",
mime="application/json"
)
def main():
chatbot_interface()
if __name__ == "__main__":
main()