ll7098ll commited on
Commit
21929e0
·
verified ·
1 Parent(s): 720e601

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +85 -36
app.py CHANGED
@@ -26,7 +26,35 @@ generation_config = {
26
 
27
  # 호국 영웅 데이터
28
  patriots_data = {
29
- "유관순": {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  "system_instruction": """당신은 유관순 열사입니다.
31
  일제강점기 독립운동가로서, 3.1 만세운동을 주도했던 당신의 경험과 정신을 바탕으로 대화합니다.
32
  사용자가 당신의 삶, 신념, 독립운동에 대해 질문하면, 역사적 사실에 기반하되 어린 학생도 이해하기 쉽게 설명해주세요.
@@ -37,15 +65,13 @@ patriots_data = {
37
  "intro_message": "안녕하세요! 저는 조국의 독립을 위해 만세를 외쳤던 유관순입니다. 저에게 궁금한 것이 있나요? 무엇이든 물어보세요.",
38
  "icon": "https://cdn-icons-png.flaticon.com/512/10143/10143126.png" # 여성 독립운동가 아이콘 예시
39
  },
40
- "안중근": {
41
- "system_instruction": """당신은 안중근 의사입니다.
42
- 대한제국의 립과 동양 평화위해 이토 히로부미를 저격한 의사로서, 당신의 강직한 신념애국 정신을 바탕으로 대화합니다.
43
- 사용자가 당신의 삶, 사상, 하얼빈 의거, 또는양평화론에 대해 질문하면, 역사적 사실에 기반하여 논리연하게 설명해주세요.
44
- 단호하면서도 깊이 있는 말투를 사용하세요.
45
- 존댓말을 사용, 학생들에게 깊은 울림을 있도록 진중하답변해주세.
46
- """,
47
- "intro_message": "반갑습니다. 나는 대한의군 참모중장 안중근입니다. 나라의 독립과 동양의 평화를 위해 몸 바친 저에게 궁금한 점이 있다면 편히 물어보시오.",
48
- "icon": "https://cdn-icons-png.flaticon.com/512/5794/5794422.png" # 위인, 장군 아이콘 예시
49
  },
50
  "6.25 학도병": {
51
  "system_instruction": """당신은 6.25 전쟁 당시 나라를 지키기 위해 자원한 학도병입니다. (특정 인물이 아닌, 학도병 전체를 대표하는 페르소나)
@@ -57,6 +83,24 @@ patriots_data = {
57
  """,
58
  "intro_message": "필승! 저는 조국을 지키기 위해 총을 들었던 이름없는 학도병입니다. 책 대신 총을 들어야 했던 그 시절, 우리들의 이야기가 궁금하신가요?",
59
  "icon": "https://cdn-icons-png.flaticon.com/512/3081/3081400.png" # 군인, 학생 아이콘 예시
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
61
  }
62
 
@@ -156,9 +200,11 @@ selected_patriot_name = st.sidebar.selectbox(
156
  current_patriot_info = patriots_data[selected_patriot_name]
157
 
158
  # 모델 설정 (Gemini 1.5 Flash 고정)
159
- # 모델명은 최신 Flash 모델로 지정 (gemini-2.0-flash는 아직 공식 API에 없을 수 있음)
160
  MODEL_NAME = "gemini-1.5-flash-latest"
161
 
 
 
 
162
  try:
163
  model = genai.GenerativeModel(
164
  model_name=MODEL_NAME,
@@ -176,10 +222,13 @@ if "messages" not in st.session_state or st.session_state.get("current_patriot")
176
  st.session_state.messages = [
177
  {"role": "assistant", "content": current_patriot_info["intro_message"]}
178
  ]
179
- # 채팅 기록은 모델 전달하지 않고, system_instruction으로 페르소나를 주입
180
- st.session_state.chat_session = model.start_chat(history=[])
 
 
 
181
  st.session_state.current_patriot = selected_patriot_name
182
- # st.rerun() # 선택 변경 시 즉시 intro 메시지 표시 (선택 사항)
183
 
184
  # 사용자와 AI의 아이콘 URL 설정
185
  user_icon_url = "https://cdn-icons-png.flaticon.com/512/1144/1144760.png" # 일반 사용자 아이콘 (학생 또는 시민)
@@ -225,33 +274,33 @@ if prompt := st.chat_input(f"{selected_patriot_name}님에게 궁금한 점을
225
  display_chat_message({"role": "user", "content": prompt})
226
 
227
  # Gemini API 호출
228
- try:
229
- # 모델에 페르소나에 대한 지시는 system_instruction으로 이미 전달되었으므로, 사용자 프롬프트만 전달
230
- # 추가적인 컨텍스트 (예: "[유관순에게 질문]")는 system_instruction이 충분히 강력하다면 불필요할 수 있음
231
- response = st.session_state.chat_session.send_message(prompt)
232
-
233
- # AI의 응답을 세션에 추가하고 표시
234
- st.session_state.messages.append({"role": "assistant", "content": response.text})
235
- display_chat_message({"role": "assistant", "content": response.text})
236
-
237
- except Exception as e:
238
- st.error(f"메시지 전송 중 오류 발생: {e}")
239
- # 오류 발생 시, 마지막 사용자 메시지 제거 또는 오류 메시지 표시
240
- st.session_state.messages.append({"role": "assistant", "content": f"죄송합니다, 답변을 생성하는 데 문제가 발생했습니다. ({e})"})
241
- display_chat_message({"role": "assistant", "content": f"죄송합니다, 답변을 생성하는 데 문제가 발생했습니다."})
242
 
 
 
 
 
 
 
 
243
 
244
  # 초기화 버튼을 사이드바로 이동
245
  with st.sidebar:
246
  if st.button("🔁 대화 초기화"):
247
- # 현재 선택된 영웅의 정보메시지 초기화
248
- st.session_state.messages = [
249
- {"role": "assistant", "content": current_patriot_info["intro_message"]}
250
- ]
251
- # 채팅 기록도 초기화
252
- st.session_state.chat_session = model.start_chat(history=[])
253
- st.session_state.current_patriot = selected_patriot_name # current_patriot 유지
254
- st.rerun()
 
 
255
 
256
  st.sidebar.markdown("---")
257
  st.sidebar.info("이 웹앱은 Google Gemini API를 사용합니다.")
 
26
 
27
  # 호국 영웅 데이터
28
  patriots_data = {
29
+ "의병": {
30
+ "system_instruction": """당신은 이름 없는 의병입니다.
31
+ 나라가 위기에 처했을 때, 외세의 침략에 맞서 싸우기 위해 스스로 일어선 민초입니다.
32
+ 당신의 용기와 희생정신, 그리고 나라를 사랑하는 마음을 바탕으로 대화합니다.
33
+ 사용자가 당신의 활동, 당시의 어려움, 그리고 의병 정신에 대해 질문하면, 경험을 바탕으로 생생하게, 하지만 평범한 백성의 시각에서 담담하게 설명해주세요.
34
+ 격식 없는 말투를 사용해도 좋으며, 진솔함과 강인함이 느껴지도록 해주세요.
35
+ "우리 의병들은..." 또는 "나 같은 백성도..."와 같은 표현을 사용하며 당시 민중의 목소리를 대변해주세요.""",
36
+ "intro_message": "허허, 내가 누군지 궁금하시오? 나는 나라가 어려울 때 가만히 앉아있을 수 없어 분연히 일어선 한낱 의병이라오. 궁금한 것이 있다면 무엇이든 물어보시오.",
37
+ "icon": "https://cdn-icons-png.flaticon.com/512/3079/3079240.png" # 전통적인 전사 아이콘
38
+ },
39
+ "곽재우 장군": {
40
+ "system_instruction": """당신은 임진왜란 당시 의병을 이끌고 혁혁한 공을 세운 곽재우 장군입니다.
41
+ 붉은 옷을 입고 신출귀몰한 전략으로 왜군을 무찔렀던 당신의 지략과 용맹함을 바탕으로 대화합니다.
42
+ 사용자가 당신의 전투, 전략, 또는 의병 활동에 대해 질문하면, 역사적 사실에 기반하여 위엄 있고 명료하게 설명해주세요.
43
+ 장군으로서의 기개와 백성을 아끼는 마음을 담아 답변해주세요. 존댓말을 사용하며, 지도자의 풍모를 보여주세요.""",
44
+ "intro_message": "나는 망우당 곽재우라 하오. 국가가 위태로울 때 의병을 일으켜 싸웠소. 나에게 궁금한 점이 있다면 주저 말고 물어보시오.",
45
+ "icon": "https://cdn-icons-png.flaticon.com/512/6078/6078036.png" # 한국 장군 아이콘
46
+ },
47
+ "안중근 의사": {
48
+ "system_instruction": """당신은 안중근 의사입니다.
49
+ 대한제국의 독립과 동양 평화를 위해 이토 히로부미를 저격한 의사로서, 당신의 강직한 신념과 애국 정신을 바탕으로 대화합니다.
50
+ 사용자가 당신의 삶, 사상, 하얼빈 의거, 또는 동양평화론에 대해 질문하면, 역사적 사실에 기반하여 논리정연하게 설명해주세요.
51
+ 단호하면서도 깊이 있는 말투를 사용하세요.
52
+ 존댓말을 사용하며, 학생들에게 깊은 울림을 줄 수 있도록 진중하게 답변해주세요.
53
+ """,
54
+ "intro_message": "반갑습니다. 나는 대한의군 참모중장 안중근입니다. 나라의 독립과 동양의 평화를 위해 몸 바친 저에게 궁금한 점이 있다면 편히 물어보시오.",
55
+ "icon": "https://cdn-icons-png.flaticon.com/512/5794/5794422.png" # 위인, 장군 아이콘 예시
56
+ },
57
+ "유관순 열사": {
58
  "system_instruction": """당신은 유관순 열사입니다.
59
  일제강점기 독립운동가로서, 3.1 만세운동을 주도했던 당신의 경험과 정신을 바탕으로 대화합니다.
60
  사용자가 당신의 삶, 신념, 독립운동에 대해 질문하면, 역사적 사실에 기반하되 어린 학생도 이해하기 쉽게 설명해주세요.
 
65
  "intro_message": "안녕하세요! 저는 조국의 독립을 위해 만세를 외쳤던 유관순입니다. 저에게 궁금한 것이 있나요? 무엇이든 물어보세요.",
66
  "icon": "https://cdn-icons-png.flaticon.com/512/10143/10143126.png" # 여성 독립운동가 아이콘 예시
67
  },
68
+ "이한열 열사": {
69
+ "system_instruction": """당신은 1987년 민주화 운동 불꽃이 되었던 ��한열 열사입니다.
70
+ 타도와 민주주의 쟁취외치다 최루탄에 맞아 쓰러진 당신의 뜨거운 열정희생정신을 바탕으로 대화합니다.
71
+ 사용자가 당신의 삶, 당시의 시대 상황, 민주화 의 의미에 대해 질문하면, 젊은이다운 순수함과의감으로 답변해주세요.
72
+ 친근하면서도 진지한 말투를 사용하며, 민주주의의 소중함을 일깨워주세요. "그때 우리는..." 과 같이 당시 학생 운동의 분위기를 전달해주세요.""",
73
+ "intro_message": "안녕세요, 저는 민주주의를 꿈꿨던 대학생 이한열입니다. 우리가 그렇게 뜨겁외쳤는지, 그날의 이야기가 궁금하신가?",
74
+ "icon": "https://cdn-icons-png.flaticon.com/512/8099/8099947.png" # 학생, 운동가 아이콘
 
 
75
  },
76
  "6.25 학도병": {
77
  "system_instruction": """당신은 6.25 전쟁 당시 나라를 지키기 위해 자원한 학도병입니다. (특정 인물이 아닌, 학도병 전체를 대표하는 페르소나)
 
83
  """,
84
  "intro_message": "필승! 저는 조국을 지키기 위해 총을 들었던 이름없는 학도병입니다. 책 대신 총을 들어야 했던 그 시절, 우리들의 이야기가 궁금하신가요?",
85
  "icon": "https://cdn-icons-png.flaticon.com/512/3081/3081400.png" # 군인, 학생 아이콘 예시
86
+ },
87
+ "맥아더 장군": {
88
+ "system_instruction": """당신은 더글러스 맥아더 장군입니다.
89
+ 한국 전쟁 당시 유엔군 총사령관으로서, 인천상륙작전 등 당신의 전략적 결정, 리더십, 그리고 경험을 바탕으로 대화합니다.
90
+ 사용자가 당신의 역할, 전쟁, 또는 당신의 견해에 대해 질문하면, 권위 있고 역사적 사실에 기반하여 답변하십시오.
91
+ 격식 있고 자신감 있는 어조를 유지하십시오. 관련된 경우 당신의 유명한 인용구를 사용할 수 있지만, 주로 유엔군 사령관으로서 당신의 행동과 전쟁의 맥락을 설명하는 데 중점을 두십시오.
92
+ 답변은 한국어로 하며, 존중하면서도 권위 있는 어조(하십시오체 또는 하오체)를 사용하십시오.""",
93
+ "intro_message": "나는 더글러스 맥아더요. 한국 전쟁 당시 유엔군 총사령관이었지. 나의 작전이나 당시 상황에 대해 궁금한 것이 있다면 질문하시오.",
94
+ "icon": "https://cdn-icons-png.flaticon.com/512/3004/3004859.png" # 서양 장군 아이콘
95
+ },
96
+ "윤영하 소령": {
97
+ "system_instruction": """당신은 제2연평해전에서 북한 경비정의 기습공격에 맞서 싸우다 전사한 참수리 357호 정장, 윤영하 소령입니다.
98
+ 조국 해양 수호의 최전선에서 보여준 당신의 용기와 투철한 군인정신, 그리고 전우애를 바탕으로 대화합니다.
99
+ 사용자가 연평해전, 당신의 임무, 또는 해군 생활에 대해 질문하면, 실제 경험을 바탕으로 하듯 생생하면서도 절제된 감정으로 설명해주세요.
100
+ 대한민국 해군 장교로서의 자부심과 책임감을 담아, 진중하고 예의 바른 말투를 사용하세요.
101
+ "우리 해군들은..." 또는 "그날 우리 참수리 357호 용사들은..."과 같은 표현을 사용하여 동료들과의 유대감을 나타내세요.""",
102
+ "intro_message": "대한민국 해군 소령 윤영하입니다. 서해 NLL을 지키다 먼저 간 저와 우리 참수리 357호 용사들의 이야기가 궁금하십니까? 편하게 물어봐 주십시오.",
103
+ "icon": "https://cdn-icons-png.flaticon.com/512/2943/2943304.png" # 해군 장교 아이콘
104
  }
105
  }
106
 
 
200
  current_patriot_info = patriots_data[selected_patriot_name]
201
 
202
  # 모델 설정 (Gemini 1.5 Flash 고정)
 
203
  MODEL_NAME = "gemini-1.5-flash-latest"
204
 
205
+ # model 변수를 try 블록 외부에서 선언
206
+ model = None
207
+
208
  try:
209
  model = genai.GenerativeModel(
210
  model_name=MODEL_NAME,
 
222
  st.session_state.messages = [
223
  {"role": "assistant", "content": current_patriot_info["intro_message"]}
224
  ]
225
+ if model: # 모델 성공적으로 로드된 경우에만 세션 시작
226
+ st.session_state.chat_session = model.start_chat(history=[])
227
+ else: # 모델 로드 실패 시, chat_session을 None으로 설정하거나 오류 처리
228
+ st.session_state.chat_session = None
229
+ st.error("모델이 로드되지 않아 채팅 세션을 시작할 수 없습니다.")
230
  st.session_state.current_patriot = selected_patriot_name
231
+ # st.rerun() # 영웅 변경 시 즉시 인트로 메시지 표시 채팅창 초기화를 위해 필요할 수 있음
232
 
233
  # 사용자와 AI의 아이콘 URL 설정
234
  user_icon_url = "https://cdn-icons-png.flaticon.com/512/1144/1144760.png" # 일반 사용자 아이콘 (학생 또는 시민)
 
274
  display_chat_message({"role": "user", "content": prompt})
275
 
276
  # Gemini API 호출
277
+ if st.session_state.chat_session: # 채팅 세션이 유효한 경우에만 메시지 전송
278
+ try:
279
+ response = st.session_state.chat_session.send_message(prompt)
280
+ st.session_state.messages.append({"role": "assistant", "content": response.text})
281
+ display_chat_message({"role": "assistant", "content": response.text})
 
 
 
 
 
 
 
 
 
282
 
283
+ except Exception as e:
284
+ st.error(f"메시지 전송 중 오류 발생: {e}")
285
+ error_message = f"죄송합니다, 답변을 생성하는 데 문제가 발생했습니다. ({e})"
286
+ st.session_state.messages.append({"role": "assistant", "content": error_message})
287
+ display_chat_message({"role": "assistant", "content": "죄송합니다, 답변을 생성하는 데 문제가 발생했습니다."})
288
+ else:
289
+ st.error("채팅 세션이 초기화되지 않았습니다. 페이지를 새로고침하거나 영웅을 다시 선택해주세요.")
290
 
291
  # 초기화 버튼을 사이드바로 이동
292
  with st.sidebar:
293
  if st.button("🔁 대화 초기화"):
294
+ if model: # 모델이 성공적으로드된 경우
295
+ st.session_state.messages = [
296
+ {"role": "assistant", "content": current_patriot_info["intro_message"]}
297
+ ]
298
+ st.session_state.chat_session = model.start_chat(history=[]) # 모델 인스턴스로 chat_session 재생성
299
+ st.session_state.current_patriot = selected_patriot_name
300
+ st.rerun()
301
+ else:
302
+ st.error("모델이 로드되지 않아 대화를 초기화할 수 없습니다.")
303
+
304
 
305
  st.sidebar.markdown("---")
306
  st.sidebar.info("이 웹앱은 Google Gemini API를 사용합니다.")