Update app.py
Browse files
app.py
CHANGED
|
@@ -7,10 +7,10 @@ genai.configure(api_key=os.environ["GEMINI_API_KEY"])
|
|
| 7 |
|
| 8 |
# 모델 설정
|
| 9 |
generation_config = {
|
| 10 |
-
"temperature": 0.
|
| 11 |
"top_p": 0.95,
|
| 12 |
"top_k": 40,
|
| 13 |
-
"max_output_tokens":
|
| 14 |
"response_mime_type": "text/plain",
|
| 15 |
}
|
| 16 |
|
|
@@ -25,7 +25,6 @@ st.markdown(
|
|
| 25 |
.stApp {
|
| 26 |
background-color: #fffafa; /* 은은한 핑크색 배경 */
|
| 27 |
}
|
| 28 |
-
|
| 29 |
/* 타이틀 스타일 */
|
| 30 |
.main-title {
|
| 31 |
font-size: 3rem;
|
|
@@ -34,7 +33,6 @@ st.markdown(
|
|
| 34 |
text-align: center;
|
| 35 |
margin-bottom: 20px;
|
| 36 |
}
|
| 37 |
-
|
| 38 |
/* 채팅 메시지 스타일 */
|
| 39 |
.chat-message {
|
| 40 |
border-radius: 15px;
|
|
@@ -42,38 +40,34 @@ st.markdown(
|
|
| 42 |
margin: 10px 0;
|
| 43 |
display: flex;
|
| 44 |
align-items: center;
|
|
|
|
|
|
|
| 45 |
}
|
| 46 |
-
|
| 47 |
.chat-message-user {
|
| 48 |
background-color: #ffebef; /* 따뜻한 파스텔 핑크 */
|
| 49 |
color: #8b4513;
|
| 50 |
justify-content: flex-end;
|
| 51 |
}
|
| 52 |
-
|
| 53 |
.chat-message-assistant {
|
| 54 |
background-color: #ffe4e6; /* 부드러운 파스텔 복숭아 핑크색 */
|
| 55 |
color: #6b4226;
|
| 56 |
justify-content: flex-start;
|
| 57 |
}
|
| 58 |
-
|
| 59 |
.chat-avatar {
|
| 60 |
width: 40px;
|
| 61 |
height: 40px;
|
| 62 |
border-radius: 50%;
|
| 63 |
margin-right: 10px;
|
| 64 |
}
|
| 65 |
-
|
| 66 |
.chat-avatar-user {
|
| 67 |
margin-left: 10px;
|
| 68 |
margin-right: 0;
|
| 69 |
}
|
| 70 |
-
|
| 71 |
/* 사용자 입력 창 스타일 */
|
| 72 |
.stTextInput input {
|
| 73 |
border-radius: 15px;
|
| 74 |
border: 2px solid #cd857f; /* 따뜻한 핑크색 */
|
| 75 |
}
|
| 76 |
-
|
| 77 |
/* 버튼 스타일 */
|
| 78 |
.stButton button {
|
| 79 |
background-color: #cd857f; /* 따뜻한 핑크색 */
|
|
@@ -89,41 +83,38 @@ st.markdown(
|
|
| 89 |
# 메인 타이틀
|
| 90 |
st.markdown("<div class='main-title'>AI 튜터 🎓</div>", unsafe_allow_html=True)
|
| 91 |
|
| 92 |
-
# 모델 선택 옵션 추가
|
| 93 |
-
model_options = ["gemini-1.5-flash", "learnlm-1.5-pro-experimental"]
|
| 94 |
-
selected_model_name = st.sidebar.selectbox("사용할 모델을 선택하세요:", model_options)
|
| 95 |
-
|
| 96 |
# 모델 설정
|
| 97 |
model = genai.GenerativeModel(
|
| 98 |
-
model_name=
|
| 99 |
generation_config=generation_config,
|
| 100 |
system_instruction="친절하고 든든한 튜터가 되어 학생이 목표를 달성하도록 안내하고, 학생이 주제에서 벗어나면 부드럽게 다시 집중하도록 도와주세요. 학생이 큰 개념을 단계적으로 이해하도록 돕는 질문을 하고, 그 개념을 깊이 파고들 수 있도록 탐구 질문을 던지세요. 학생이 부담을 느끼지 않도록 한 번에 한 질문만 하세요. 학생이 이해한 것을 보여주면 대화를 마무리하세요.",
|
| 101 |
)
|
| 102 |
|
| 103 |
# 채팅 세션 초기화
|
| 104 |
-
if "
|
|
|
|
|
|
|
|
|
|
| 105 |
st.session_state.chat_session = model.start_chat(history=[])
|
| 106 |
-
st.session_state.current_model = selected_model_name
|
| 107 |
|
| 108 |
# 사용자와 AI의 아이콘 URL 설정
|
| 109 |
user_icon_url = "https://cdn-icons-png.flaticon.com/512/1995/1995531.png" # 학생 아이콘 (책을 든 학생)
|
| 110 |
assistant_icon_url = "https://cdn-icons-png.flaticon.com/512/4323/4323008.png" # 튜터 아이콘 (안경 쓴 선생님)
|
| 111 |
|
| 112 |
# 채팅 메시지 표시
|
| 113 |
-
if "messages" not in st.session_state:
|
| 114 |
-
st.session_state.messages = []
|
| 115 |
-
|
| 116 |
for message in st.session_state.messages:
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
| 120 |
-
|
| 121 |
-
|
| 122 |
-
|
| 123 |
-
|
|
|
|
| 124 |
|
| 125 |
# 사용자 입력 받기
|
| 126 |
if prompt := st.chat_input("📝학습 내용을 입력하면 AI 튜터가 질문을 통해서 개념을 이해하도록 도와줍니다."):
|
|
|
|
| 127 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
| 128 |
st.markdown(f"<div class='chat-message chat-message-user'>{prompt}<img src='{user_icon_url}' class='chat-avatar chat-avatar-user'></div>", unsafe_allow_html=True)
|
| 129 |
|
|
@@ -135,5 +126,5 @@ if prompt := st.chat_input("📝학습 내용을 입력하면 AI 튜터가 질
|
|
| 135 |
# 초기화 버튼을 사이드바로 이동
|
| 136 |
with st.sidebar:
|
| 137 |
if st.button("💡 초기화"):
|
| 138 |
-
st.session_state.
|
| 139 |
st.rerun()
|
|
|
|
| 7 |
|
| 8 |
# 모델 설정
|
| 9 |
generation_config = {
|
| 10 |
+
"temperature": 0.7,
|
| 11 |
"top_p": 0.95,
|
| 12 |
"top_k": 40,
|
| 13 |
+
"max_output_tokens": 2000,
|
| 14 |
"response_mime_type": "text/plain",
|
| 15 |
}
|
| 16 |
|
|
|
|
| 25 |
.stApp {
|
| 26 |
background-color: #fffafa; /* 은은한 핑크색 배경 */
|
| 27 |
}
|
|
|
|
| 28 |
/* 타이틀 스타일 */
|
| 29 |
.main-title {
|
| 30 |
font-size: 3rem;
|
|
|
|
| 33 |
text-align: center;
|
| 34 |
margin-bottom: 20px;
|
| 35 |
}
|
|
|
|
| 36 |
/* 채팅 메시지 스타일 */
|
| 37 |
.chat-message {
|
| 38 |
border-radius: 15px;
|
|
|
|
| 40 |
margin: 10px 0;
|
| 41 |
display: flex;
|
| 42 |
align-items: center;
|
| 43 |
+
flex-wrap: wrap;
|
| 44 |
+
word-break: break-word;
|
| 45 |
}
|
|
|
|
| 46 |
.chat-message-user {
|
| 47 |
background-color: #ffebef; /* 따뜻한 파스텔 핑크 */
|
| 48 |
color: #8b4513;
|
| 49 |
justify-content: flex-end;
|
| 50 |
}
|
|
|
|
| 51 |
.chat-message-assistant {
|
| 52 |
background-color: #ffe4e6; /* 부드러운 파스텔 복숭아 핑크색 */
|
| 53 |
color: #6b4226;
|
| 54 |
justify-content: flex-start;
|
| 55 |
}
|
|
|
|
| 56 |
.chat-avatar {
|
| 57 |
width: 40px;
|
| 58 |
height: 40px;
|
| 59 |
border-radius: 50%;
|
| 60 |
margin-right: 10px;
|
| 61 |
}
|
|
|
|
| 62 |
.chat-avatar-user {
|
| 63 |
margin-left: 10px;
|
| 64 |
margin-right: 0;
|
| 65 |
}
|
|
|
|
| 66 |
/* 사용자 입력 창 스타일 */
|
| 67 |
.stTextInput input {
|
| 68 |
border-radius: 15px;
|
| 69 |
border: 2px solid #cd857f; /* 따뜻한 핑크색 */
|
| 70 |
}
|
|
|
|
| 71 |
/* 버튼 스타일 */
|
| 72 |
.stButton button {
|
| 73 |
background-color: #cd857f; /* 따뜻한 핑크색 */
|
|
|
|
| 83 |
# 메인 타이틀
|
| 84 |
st.markdown("<div class='main-title'>AI 튜터 🎓</div>", unsafe_allow_html=True)
|
| 85 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
# 모델 설정
|
| 87 |
model = genai.GenerativeModel(
|
| 88 |
+
model_name="gemini-1.5-flash",
|
| 89 |
generation_config=generation_config,
|
| 90 |
system_instruction="친절하고 든든한 튜터가 되어 학생이 목표를 달성하도록 안내하고, 학생이 주제에서 벗어나면 부드럽게 다시 집중하도록 도와주세요. 학생이 큰 개념을 단계적으로 이해하도록 돕는 질문을 하고, 그 개념을 깊이 파고들 수 있도록 탐구 질문을 던지세요. 학생이 부담을 느끼지 않도록 한 번에 한 질문만 하세요. 학생이 이해한 것을 보여주면 대화를 마무리하세요.",
|
| 91 |
)
|
| 92 |
|
| 93 |
# 채팅 세션 초기화
|
| 94 |
+
if "messages" not in st.session_state:
|
| 95 |
+
st.session_state.messages = [
|
| 96 |
+
{"role": "system", "content": "학생들이 수업 주제나 내용을 입력하면, 질문을 통해서 학생들 스스로가 그 주제나 내용을 이해할 수 있도록, 마치 소크라테스처럼 끊임 없는 질문을 통해 스스로 깨달을 수 있도록 도와주세요."}
|
| 97 |
+
]
|
| 98 |
st.session_state.chat_session = model.start_chat(history=[])
|
|
|
|
| 99 |
|
| 100 |
# 사용자와 AI의 아이콘 URL 설정
|
| 101 |
user_icon_url = "https://cdn-icons-png.flaticon.com/512/1995/1995531.png" # 학생 아이콘 (책을 든 학생)
|
| 102 |
assistant_icon_url = "https://cdn-icons-png.flaticon.com/512/4323/4323008.png" # 튜터 아이콘 (안경 쓴 선생님)
|
| 103 |
|
| 104 |
# 채팅 메시지 표시
|
|
|
|
|
|
|
|
|
|
| 105 |
for message in st.session_state.messages:
|
| 106 |
+
if message["role"] != "system":
|
| 107 |
+
role_class = "chat-message-user" if message["role"] == "user" else "chat-message-assistant"
|
| 108 |
+
avatar_url = user_icon_url if message["role"] == "user" else assistant_icon_url
|
| 109 |
+
avatar_class = "chat-avatar-user" if message["role"] == "user" else "chat-avatar"
|
| 110 |
+
st.markdown(
|
| 111 |
+
f"<div class='chat-message {role_class}'><img src='{avatar_url}' class='chat-avatar {avatar_class}'>{message['content']}</div>",
|
| 112 |
+
unsafe_allow_html=True
|
| 113 |
+
)
|
| 114 |
|
| 115 |
# 사용자 입력 받기
|
| 116 |
if prompt := st.chat_input("📝학습 내용을 입력하면 AI 튜터가 질문을 통해서 개념을 이해하도록 도와줍니다."):
|
| 117 |
+
# 사용자의 메시지를 세션에 추가
|
| 118 |
st.session_state.messages.append({"role": "user", "content": prompt})
|
| 119 |
st.markdown(f"<div class='chat-message chat-message-user'>{prompt}<img src='{user_icon_url}' class='chat-avatar chat-avatar-user'></div>", unsafe_allow_html=True)
|
| 120 |
|
|
|
|
| 126 |
# 초기화 버튼을 사이드바로 이동
|
| 127 |
with st.sidebar:
|
| 128 |
if st.button("💡 초기화"):
|
| 129 |
+
del st.session_state.messages # 메시지 세션 상태 삭제
|
| 130 |
st.rerun()
|