code-slicer commited on
Commit
774125e
·
verified ·
1 Parent(s): e84fdfc

Update chat_a.py

Browse files
Files changed (1) hide show
  1. chat_a.py +51 -7
chat_a.py CHANGED
@@ -11,6 +11,18 @@ from sentence_transformers import SentenceTransformer, util
11
  from transformers import AutoTokenizer, AutoModelForSequenceClassification
12
  from css import log_and_render
13
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  # ──────────────────────────────── 캐시/데이터셋 설정 ────────────────────────────────
15
  HOME = pathlib.Path.home()
16
 
@@ -1340,14 +1352,31 @@ def recommend_packages(
1340
  )
1341
 
1342
  # ✅ 출력
 
 
 
 
 
 
 
 
1343
  if recommend_texts:
1344
- full_message = "🧳 이런 패키지를 추천드려요:<br><br>" + "<br><br>".join(recommend_texts)
1345
- log_and_render(
1346
- full_message,
1347
- sender="bot",
1348
- chat_container = chat_container,
1349
- key="recommend_package_intro",
1350
- )
 
 
 
 
 
 
 
 
 
1351
  else:
1352
  log_and_render(
1353
  "⚠️ 추천 가능한 패키지가 없습니다.",
@@ -1378,6 +1407,21 @@ def handle_selected_place(selected_place, travel_df, external_score_df, festival
1378
  message_lines.append(f"함께 가보면 좋은 여행지: {sample_names}")
1379
  else:
1380
  message_lines.append("⚠️ 함께 가볼 다른 여행지가 없어요.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1381
  # integrated_theme 추론 추가
1382
  if selected_theme is None:
1383
  theme_row = travel_df[travel_df["여행지"] == selected_place]
 
11
  from transformers import AutoTokenizer, AutoModelForSequenceClassification
12
  from css import log_and_render
13
 
14
+ from css import log_and_render
15
+ import time # time 라이브러리를 import 합니다.
16
+
17
+ def stream_text_generator(text_to_stream: str):
18
+ """
19
+ 문자열을 단어 단위로 쪼개서 하나씩 흘려보내주는 생성기(generator) 함수.
20
+ 타이핑 효과를 위해 사용됩니다.
21
+ """
22
+ for word in text_to_stream.split(" "):
23
+ yield word + " "
24
+ time.sleep(0.05) # 각 단어 사이에 0.05초의 딜레이를 줍니다.
25
+
26
  # ──────────────────────────────── 캐시/데이터셋 설정 ────────────────────────────────
27
  HOME = pathlib.Path.home()
28
 
 
1352
  )
1353
 
1354
  # ✅ 출력
1355
+ # if recommend_texts:
1356
+ # full_message = "🧳 이런 패키지를 추천드려요:<br><br>" + "<br><br>".join(recommend_texts)
1357
+ # log_and_render(
1358
+ # full_message,
1359
+ # sender="bot",
1360
+ # chat_container = chat_container,
1361
+ # key="recommend_package_intro",
1362
+ # )
1363
  if recommend_texts:
1364
+ # ⬇️⬇️⬇️ 여기가 핵심 변경 부분입니다 ⬇️⬇️⬇️
1365
+ intro_message = "🧳 이런 패키지를 추천드려요:"
1366
+ package_list_message = "".join(recommend_texts)
1367
+
1368
+ # 1. 안내 문구는 타이핑 효과로 먼저 보여줍니다.
1369
+ with st.chat_message("assistant"):
1370
+ st.write_stream(stream_text_generator(intro_message))
1371
+
1372
+ # 2. 패키지 목록은 타이핑 없이 바로 보여주는 것이 더 깔끔합니다.
1373
+ st.markdown(package_list_message) # st.markdown을 사용해 바로 출력
1374
+
1375
+ # 3. 대화 기록에는 전체 메시지를 합쳐서 저장합니다.
1376
+ full_message = intro_message + package_list_message
1377
+ if "chat_log" not in st.session_state:
1378
+ st.session_state.chat_log = []
1379
+ st.session_state.chat_log.append(("bot", full_message))
1380
  else:
1381
  log_and_render(
1382
  "⚠️ 추천 가능한 패키지가 없습니다.",
 
1407
  message_lines.append(f"함께 가보면 좋은 여행지: {sample_names}")
1408
  else:
1409
  message_lines.append("⚠️ 함께 가볼 다른 여행지가 없어요.")
1410
+
1411
+ ##
1412
+ full_message = "".join(message_lines)
1413
+
1414
+ # Streamlit의 chat_message 컨텍스트를 사용해 말풍선을 직접 만듭니다.
1415
+ with st.chat_message("assistant"): # 'assistant'는 봇 메시지를 의미합니다.
1416
+ # 우리가 만든 제너레이터와 st.write_stream을 연결해 타이핑 효과를 냅니다.
1417
+ st.write_stream(stream_text_generator(full_message))
1418
+
1419
+ # 대화 기록(log)을 남기는 로직은 화면 출력 뒤에 따로 실행합니다.
1420
+ if "chat_log" not in st.session_state:
1421
+ st.session_state.chat_log = []
1422
+ st.session_state.chat_log.append(("bot", full_message))
1423
+ ##
1424
+
1425
  # integrated_theme 추론 추가
1426
  if selected_theme is None:
1427
  theme_row = travel_df[travel_df["여행지"] == selected_place]